package com.hubspot.mesos;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Optional;
import com.wordnik.swagger.annotations.ApiModelProperty;
public class SingularityDockerInfo {
private final String image;
private final boolean privileged;
private final Optional<SingularityDockerNetworkType> network;
private final List<SingularityDockerPortMapping> portMappings;
private final boolean forcePullImage;
private final Optional<Map<String, String>> parameters;
private final List<SingularityDockerParameter> dockerParameters;
@JsonCreator
public SingularityDockerInfo(@JsonProperty("image") String image,
@JsonProperty("privileged") boolean privileged,
@JsonProperty("network") SingularityDockerNetworkType network,
@JsonProperty("portMappings") Optional<List<SingularityDockerPortMapping>> portMappings,
@JsonProperty("forcePullImage") Optional<Boolean> forcePullImage,
@JsonProperty("parameters") Optional<Map<String, String>> parameters,
@JsonProperty("dockerParameters") Optional<List<SingularityDockerParameter>> dockerParameters) {
this.image = image;
this.privileged = privileged;
this.network = Optional.fromNullable(network);
this.portMappings = portMappings.or(Collections.<SingularityDockerPortMapping>emptyList());
this.forcePullImage = forcePullImage.or(false);
this.parameters = parameters;
this.dockerParameters = dockerParameters.or(parameters.isPresent() ? SingularityDockerParameter.parametersFromMap(parameters.get()) : Collections.<SingularityDockerParameter>emptyList());
}
public SingularityDockerInfo(String image, boolean privileged, SingularityDockerNetworkType network, Optional<List<SingularityDockerPortMapping>> portMappings, Optional<Boolean> forcePullImage, List<SingularityDockerParameter> dockerParameters) {
this(image, privileged, network, portMappings, forcePullImage, Optional.<Map<String,String>>absent(), Optional.of(dockerParameters));
}
@Deprecated
public SingularityDockerInfo(String image, boolean privileged, SingularityDockerNetworkType network, Optional<List<SingularityDockerPortMapping>> portMappings, Optional<Boolean> forcePullImage, Optional<Map<String, String>> parameters) {
this(image, privileged, network, portMappings, forcePullImage, parameters, Optional.<List<SingularityDockerParameter>>absent());
}
@Deprecated
public SingularityDockerInfo(String image, boolean privileged, SingularityDockerNetworkType network, Optional<List<SingularityDockerPortMapping>> portMappings) {
this(image, privileged, network, portMappings, Optional.<Boolean>absent(), Optional.<Map<String, String>>absent(), Optional.<List<SingularityDockerParameter>>absent());
}
@ApiModelProperty(required=true, value="Docker image name")
public String getImage() {
return image;
}
@ApiModelProperty(required=true, value="Controls use of the docker --privleged flag")
public boolean isPrivileged()
{
return privileged;
}
@ApiModelProperty(required=false, value="Docker netowkr type. Value can be BRIDGE, HOST, or NONE", dataType="com.hubspot.mesos.SingularityDockerNetworkType")
public Optional<SingularityDockerNetworkType> getNetwork() {
return network;
}
@ApiModelProperty(required=false, value="List of port mappings")
public List<SingularityDockerPortMapping> getPortMappings() {
return portMappings;
}
public boolean hasAllLiteralHostPortMappings() {
for (SingularityDockerPortMapping mapping : portMappings) {
if (mapping.getHostPortType() == SingularityPortMappingType.FROM_OFFER) {
return false;
}
}
return true;
}
@JsonIgnore
public List<Long> getLiteralHostPorts() {
List<Long> literalHostPorts = new ArrayList<>();
for (SingularityDockerPortMapping mapping : portMappings) {
if (mapping.getHostPortType() == SingularityPortMappingType.LITERAL) {
long port = mapping.getHostPort();
literalHostPorts.add(port);
}
}
return literalHostPorts;
}
@ApiModelProperty(required=false, value="Always run docker pull even if the image already exists locally")
public boolean isForcePullImage() {
return forcePullImage;
}
@Deprecated
public Optional<Map<String, String>> getParameters() {
return parameters;
}
@ApiModelProperty(required=false, value="Other docker run command line options to be set")
public List<SingularityDockerParameter> getDockerParameters() {
return dockerParameters;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
SingularityDockerInfo that = (SingularityDockerInfo) o;
return privileged == that.privileged &&
forcePullImage == that.forcePullImage &&
Objects.equals(image, that.image) &&
Objects.equals(network, that.network) &&
Objects.equals(portMappings, that.portMappings) &&
Objects.equals(parameters, that.parameters) &&
Objects.equals(dockerParameters, that.dockerParameters);
}
@Override
public int hashCode() {
return Objects.hash(image, privileged, network, portMappings, forcePullImage, parameters, dockerParameters);
}
@Override
public String toString() {
return "SingularityDockerInfo{" +
"image='" + image + '\'' +
", privileged=" + privileged +
", network=" + network +
", portMappings=" + portMappings +
", forcePullImage=" + forcePullImage +
", parameters=" + parameters +
", dockerParameters=" + dockerParameters +
'}';
}
}