From b9f29723f9eadf6d1358afee16c042b2ecd27c8c Mon Sep 17 00:00:00 2001 From: Vojtech Juranek Date: Mon, 1 Dec 2014 15:21:36 +0100 Subject: [PATCH 1/2] Allow to pass HostConfig when creating a container * Move HostConfig into separate class * Use Links for container links instead of String * Add API for passing HostConfig when creating a container --- .../api/command/CreateContainerCmd.java | 6 + .../api/command/InspectContainerResponse.java | 116 ---------- .../dockerjava/api/model/HostConfig.java | 204 ++++++++++++++++++ .../dockerjava/api/model/PortBinding.java | 1 - .../github/dockerjava/api/model/Ports.java | 1 - .../core/command/CreateContainerCmdImpl.java | 16 +- .../command/CreateContainerCmdImplTest.java | 41 +++- 7 files changed, 264 insertions(+), 121 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/HostConfig.java diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index e6e2e2c70..dde2079a2 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -3,6 +3,8 @@ import com.github.dockerjava.api.ConflictException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Links; import com.github.dockerjava.api.model.Volume; public interface CreateContainerCmd extends DockerCmd{ @@ -94,6 +96,10 @@ public interface CreateContainerCmd extends DockerCmd{ public String[] getVolumesFrom(); public CreateContainerCmd withVolumesFrom(String... volumesFrom); + + public HostConfig getHostConfig(); + + public CreateContainerCmd withHostConfig(HostConfig hostConfig); /** diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index 32156745d..5ac4f44e9 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -234,121 +234,5 @@ public String toString() { } } - @JsonIgnoreProperties(ignoreUnknown = true) - public class HostConfig { - - @JsonProperty("Binds") - private String[] binds; - - @JsonProperty("LxcConf") - private LxcConf[] lxcConf; - - @JsonProperty("PortBindings") - private Ports portBindings; - - @JsonProperty("PublishAllPorts") - private boolean publishAllPorts; - - @JsonProperty("Privileged") - private boolean privileged; - - @JsonProperty("Dns") - private String[] dns; - - @JsonProperty("DnsSearch") - private String[] dnsSearch; - - @JsonProperty("VolumesFrom") - private String[] volumesFrom; - - @JsonProperty("ContainerIDFile") - private String containerIDFile; - - // TODO: use Links class here? - @JsonProperty("Links") - private String[] links; - - @JsonProperty("NetworkMode") - private String networkMode; - - @JsonProperty("Devices") - private Device[] devices; - - @JsonProperty("RestartPolicy") - private RestartPolicy restartPolicy; - - @JsonProperty("CapAdd") - private String[] capAdd; - - @JsonProperty("CapDrop") - private String[] capDrop; - - public String[] getBinds() { - return binds; - } - - public LxcConf[] getLxcConf() { - return lxcConf; - } - - public Ports getPortBindings() { - return portBindings; - } - - public boolean isPublishAllPorts() { - return publishAllPorts; - } - - public boolean isPrivileged() { - return privileged; - } - - public String[] getDns() { - return dns; - } - - public String[] getVolumesFrom() { - return volumesFrom; - } - - public String getContainerIDFile() { - return containerIDFile; - } - - public String[] getDnsSearch() { - return dnsSearch; - } - - public String[] getLinks() { - return links; - } - - public String getNetworkMode() { - return networkMode; - } - - public Device[] getDevices() { - return devices; - } - - public RestartPolicy getRestartPolicy() { - return restartPolicy; - } - - public String[] getCapAdd() { - return capAdd; - } - - public String[] getCapDrop() { - return capDrop; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - - } - } diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java new file mode 100644 index 000000000..6344caab5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -0,0 +1,204 @@ +package com.github.dockerjava.api.model; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class HostConfig { + + @JsonProperty("Binds") + private String[] binds; + + @JsonProperty("Links") + private Links links; + + @JsonProperty("LxcConf") + private LxcConf[] lxcConf; + + @JsonProperty("PortBindings") + private Ports portBindings; + + @JsonProperty("PublishAllPorts") + private boolean publishAllPorts; + + @JsonProperty("Privileged") + private boolean privileged; + + @JsonProperty("Dns") + private String[] dns; + + @JsonProperty("DnsSearch") + private String[] dnsSearch; + + @JsonProperty("VolumesFrom") + private String[] volumesFrom; + + @JsonProperty("ContainerIDFile") + private String containerIDFile; + + @JsonProperty("CapAdd") + private String[] capAdd; + + @JsonProperty("CapDrop") + private String[] capDrop; + + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; + + @JsonProperty("NetworkMode") + private String networkMode; + + @JsonProperty("Devices") + private Device[] devices; + + public HostConfig() { + } + + public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, + boolean privileged, String[] dns, String[] dnsSearch, String[] volumesFrom, String containerIDFile, + String[] capAdd, String[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices) { + this.binds = binds; + this.links = links; + this.lxcConf = lxcConf; + this.portBindings = portBindings; + this.publishAllPorts = publishAllPorts; + this.privileged = privileged; + this.dns = dns; + this.dnsSearch = dnsSearch; + this.volumesFrom = volumesFrom; + this.containerIDFile = containerIDFile; + this.capAdd = capAdd; + this.capDrop = capDrop; + this.restartPolicy = restartPolicy; + this.networkMode = networkMode; + this.devices = devices; + } + + public String[] getBinds() { + return binds; + } + + public LxcConf[] getLxcConf() { + return lxcConf; + } + + public Ports getPortBindings() { + return portBindings; + } + + public boolean isPublishAllPorts() { + return publishAllPorts; + } + + public boolean isPrivileged() { + return privileged; + } + + public String[] getDns() { + return dns; + } + + public String[] getVolumesFrom() { + return volumesFrom; + } + + public String getContainerIDFile() { + return containerIDFile; + } + + public String[] getDnsSearch() { + return dnsSearch; + } + + public Links getLinks() { + return links; + } + + public String getNetworkMode() { + return networkMode; + } + + public Device[] getDevices() { + return devices; + } + + public RestartPolicy getRestartPolicy() { + return restartPolicy; + } + + public String[] getCapAdd() { + return capAdd; + } + + public String[] getCapDrop() { + return capDrop; + } + + public void setBinds(String[] binds) { + this.binds = binds; + } + + public void setLinks(Links links) { + this.links = links; + } + + public void setLxcConf(LxcConf[] lxcConf) { + this.lxcConf = lxcConf; + } + + public void setPortBindings(Ports portBindings) { + this.portBindings = portBindings; + } + + public void setPublishAllPorts(boolean publishAllPorts) { + this.publishAllPorts = publishAllPorts; + } + + public void setPrivileged(boolean privileged) { + this.privileged = privileged; + } + + public void setDns(String[] dns) { + this.dns = dns; + } + + public void setDnsSearch(String[] dnsSearch) { + this.dnsSearch = dnsSearch; + } + + public void setVolumesFrom(String[] volumesFrom) { + this.volumesFrom = volumesFrom; + } + + public void setContainerIDFile(String containerIDFile) { + this.containerIDFile = containerIDFile; + } + + public void setCapAdd(String[] capAdd) { + this.capAdd = capAdd; + } + + public void setCapDrop(String[] capDrop) { + this.capDrop = capDrop; + } + + public void setRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; + } + + public void setNetworkMode(String networkMode) { + this.networkMode = networkMode; + } + + public void setDevices(Device[] devices) { + this.devices = devices; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java index df9085597..13c91bdb1 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -4,7 +4,6 @@ import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; -import com.github.dockerjava.api.command.InspectContainerResponse.HostConfig; import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; import com.github.dockerjava.api.model.Ports.Binding; diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java index d68175a5a..e0f3c0806 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -23,7 +23,6 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; -import com.github.dockerjava.api.command.InspectContainerResponse.HostConfig; import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; /** diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index b3f020f94..e022bdeab 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -4,16 +4,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; - import com.github.dockerjava.api.ConflictException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.ExposedPorts; +import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; - import com.google.common.base.Preconditions; /** @@ -46,6 +45,7 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd Date: Mon, 1 Dec 2014 15:24:28 +0100 Subject: [PATCH 2/2] Fix parsing of Links and Link --- src/main/java/com/github/dockerjava/api/model/Link.java | 6 ++++-- src/main/java/com/github/dockerjava/api/model/Links.java | 8 ++++---- .../java/com/github/dockerjava/api/model/LinkTest.java | 7 +++++++ .../core/command/StartContainerCmdImplTest.java | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Link.java b/src/main/java/com/github/dockerjava/api/model/Link.java index 4416dca0c..ab8485a36 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -53,7 +53,7 @@ public String getAlias() /** * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. * - * @param serialized the specification, e.g. name:alias + * @param serialized the specification, e.g. name:alias or /name1:/name2/alias * @return a {@link Link} matching the specification * @throws IllegalArgumentException if the specification cannot be parsed */ @@ -63,7 +63,9 @@ public static Link parse(final String serialized) throws IllegalArgumentExceptio final String[] parts = serialized.split(":"); switch (parts.length) { case 2: { - return new Link(parts[0], parts[1]); + String[] nameSplit = parts[0].split("/"); + String[] aliasSplit = parts[1].split("/"); + return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); } default: { throw new IllegalArgumentException(); diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index b0d0cc8df..d901ea8d2 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -61,11 +61,11 @@ public Links deserialize(final JsonParser jsonParser, final DeserializationConte final List binds = new ArrayList(); final ObjectCodec oc = jsonParser.getCodec(); final JsonNode node = oc.readTree(jsonParser); - for (final Iterator> it = node.fields(); it.hasNext();) { + for (final Iterator it = node.elements(); it.hasNext();) { - final Map.Entry field = it.next(); - if (!field.getValue().equals(NullNode.getInstance())) { - binds.add(Link.parse(field.getKey())); + final JsonNode element = it.next(); + if (!element.equals(NullNode.getInstance())) { + binds.add(Link.parse(element.asText())); } } return new Links(binds.toArray(new Link[0])); diff --git a/src/test/java/com/github/dockerjava/api/model/LinkTest.java b/src/test/java/com/github/dockerjava/api/model/LinkTest.java index c42af9da6..2f6df0c5e 100644 --- a/src/test/java/com/github/dockerjava/api/model/LinkTest.java +++ b/src/test/java/com/github/dockerjava/api/model/LinkTest.java @@ -12,6 +12,13 @@ public void parse() { assertEquals(link.getName(), "name"); assertEquals(link.getAlias(), "alias"); } + + @Test + public void parseWithContainerNames() { + Link link = Link.parse("/name:/conatiner/alias"); + assertEquals(link.getName(), "name"); + assertEquals(link.getAlias(), "alias"); + } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Link 'nonsense'") diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 469259eeb..438597bce 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -228,7 +228,7 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new String[] {"/container1:/container2/container1Link"})); + assertThat(inspectContainerResponse2.getHostConfig().getLinks().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString()));