/*
 * Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.slider.providers.agent.application.metadata;

import org.apache.slider.core.exceptions.SliderException;
import org.codehaus.jackson.annotate.JsonProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * Represents a docker container
 */
public class DockerContainer implements Validate {
  protected static final Logger
      log = LoggerFactory.getLogger(DockerContainer.class);


  private String name;
  private String image;
  private String options;
  private List<DockerContainerMount> mounts = new ArrayList<>();
  private List<DockerContainerPort> ports = new ArrayList<>();


  public DockerContainer() {
  }

  @JsonProperty("mounts")
  public List<DockerContainerMount> getMounts() {
    return this.mounts;
  }

  @JsonProperty("ports")
  public List<DockerContainerPort> getPorts() {
    return this.ports;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getImage() {
    return image;
  }

  public void setImage(String image) {
    this.image = image;
  }

  public String getOptions() {
    return options;
  }

  public void setOptions(String options) {
    this.options = options;
  }

  public void validate(String version) throws SliderException {
    Metainfo.checkNonNull(getName(), "name", "dockerContainer");
    Metainfo.checkNonNull(getImage(), "image", "dockerContainer");
    for (DockerContainerMount dcm : getMounts()) {
      dcm.validate(version);
    }
    for (DockerContainerPort dcp : getPorts()) {
      dcp.validate(version);
    }
  }
}
