From 4d605506b2a1512977103f9313259b503917d35d Mon Sep 17 00:00:00 2001 From: fb Date: Sat, 27 Feb 2016 11:11:47 +0100 Subject: [PATCH] implement links and aliases for user defined networks add missing network options add tests --- .../api/command/ConnectToNetworkCmd.java | 6 + .../api/command/CreateContainerCmd.java | 34 ++++- .../api/command/CreateNetworkCmd.java | 33 +++-- .../api/command/DisconnectFromNetworkCmd.java | 5 + .../api/model/ContainerNetwork.java | 73 +++++++++-- .../dockerjava/api/model/HostConfig.java | 12 ++ .../github/dockerjava/api/model/Network.java | 35 ++++- .../dockerjava/api/model/NetworkSettings.java | 90 +------------ .../core/command/ConnectToNetworkCmdImpl.java | 15 +++ .../core/command/CreateContainerCmdImpl.java | 122 ++++++++++++++++-- .../core/command/CreateNetworkCmdImpl.java | 51 +++++++- .../command/DisconnectFromNetworkCmdImpl.java | 14 ++ .../core/command/RemoveNetworkCmdImpl.java | 1 - .../command/ConnectToNetworkCmdImplTest.java | 52 +++++++- .../command/CreateContainerCmdImplTest.java | 106 +++++++++++++++ .../DisconnectFromNetworkCmdImplTest.java | 22 ++++ 16 files changed, 542 insertions(+), 129 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java index cd5c57774..0f384e043 100644 --- a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.command; +import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.core.RemoteApiVersion; import javax.annotation.CheckForNull; @@ -18,10 +19,15 @@ public interface ConnectToNetworkCmd extends SyncDockerCmd { @CheckForNull String getContainerId(); + @CheckForNull + ContainerNetwork getContainerConfig(); + ConnectToNetworkCmd withNetworkId(@Nonnull String networkId); ConnectToNetworkCmd withContainerId(@Nonnull String containerId); + ConnectToNetworkCmd withContainerNetwork(@Nonnull ContainerNetwork endpointConfig); + interface Exec extends DockerCmdSyncExec { } } 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 ffcb01c98..196763560 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -1,10 +1,5 @@ package com.github.dockerjava.api.command; -import java.util.List; -import java.util.Map; - -import javax.annotation.CheckForNull; - import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Bind; @@ -21,8 +16,15 @@ import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + public interface CreateContainerCmd extends SyncDockerCmd { + @CheckForNull + List getAliases(); + @CheckForNull Bind[] getBinds(); @@ -92,6 +94,12 @@ public interface CreateContainerCmd extends SyncDockerCmd getLabels(); @@ -185,6 +193,18 @@ public interface CreateContainerCmd extends SyncDockerCmd aliases); + CreateContainerCmd withAttachStderr(Boolean attachStderr); CreateContainerCmd withAttachStdin(Boolean attachStdin); @@ -304,6 +324,10 @@ public interface CreateContainerCmd extends SyncDockerCmd labels); /** diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java index 6ad26b605..39989bd13 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java @@ -1,14 +1,13 @@ package com.github.dockerjava.api.command; -import java.util.Map; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Network.Ipam; import com.github.dockerjava.core.RemoteApiVersion; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.Map; + /** * Create a network. * @@ -25,18 +24,36 @@ public interface CreateNetworkCmd extends SyncDockerCmd { @CheckForNull Network.Ipam getIpam(); + @CheckForNull + Map getOptions(); + + @CheckForNull + Boolean getCheckDuplicate(); + + @CheckForNull + Boolean getInternal(); + + @CheckForNull + Boolean getEnableIPv6(); + /** The new network's name. Required. */ CreateNetworkCmd withName(@Nonnull String name); - /** Optional custom IP scheme for the network. */ - CreateNetworkCmd withIpamConfig(Ipam.Config config); - /** Name of the network driver to use. Defaults to bridge. */ CreateNetworkCmd withDriver(String driver); + /** Ipam config, such es subnet, gateway and ip range of the network */ + CreateNetworkCmd withIpam(Ipam ipam); + /** Driver specific options */ CreateNetworkCmd withOptions(Map options); + CreateNetworkCmd withCheckDuplicate(boolean checkForDuplicate); + + CreateNetworkCmd withInternal(boolean internal); + + CreateNetworkCmd withEnableIpv6(boolean enableIpv6); + interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java index ca870ef37..ce75172b4 100644 --- a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java @@ -18,10 +18,15 @@ public interface DisconnectFromNetworkCmd extends SyncDockerCmd { @CheckForNull String getContainerId(); + @CheckForNull + Boolean getForce(); + DisconnectFromNetworkCmd withNetworkId(@Nonnull String networkId); DisconnectFromNetworkCmd withContainerId(@Nonnull String containerId); + DisconnectFromNetworkCmd withForce(@Nonnull Boolean force); + interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java index 4bfde8bfd..9b2160e98 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.core.RemoteApiVersion; @@ -8,9 +9,14 @@ import org.apache.commons.lang.builder.ToStringBuilder; import javax.annotation.CheckForNull; +import java.util.Arrays; import java.util.List; /** + * Types taken form + * {@see https://github.com/docker/engine-api/blob/release/1.10/types/network/network.go} + * Docker named it EndpointSettings + * * @see ContainerNetworkSettings * @author Kanstantsin Shautsou */ @@ -20,16 +26,16 @@ public class ContainerNetwork { * FIXME verify */ @JsonProperty("IPAMConfig") - private Network.Ipam.Config ipamConfig; + private Ipam ipamConfig; /** * FIXME verify */ @JsonProperty("Links") - private List links; + private Links links; /** - * FIXME no docs, unknown field. + * Add network-scoped alias for the container * Type picked from `docker/vendor/src/github.com/docker/engine-api/types/network/network.go` * * @since {@link RemoteApiVersion#VERSION_1_22} @@ -80,6 +86,14 @@ public ContainerNetwork withAliases(List aliases) { return this; } + /** + * @see #aliases + */ + public ContainerNetwork withAliases(String... aliases) { + this.aliases = Arrays.asList(aliases); + return this; + } + /** * @see #endpointId */ @@ -155,7 +169,7 @@ public String getIpAddress() { /** * @see #ipAddress */ - public ContainerNetwork withIpAddress(String ipAddress) { + public ContainerNetwork withIpv4Address(String ipAddress) { this.ipAddress = ipAddress; return this; } @@ -164,14 +178,14 @@ public ContainerNetwork withIpAddress(String ipAddress) { * @see #ipamConfig */ @CheckForNull - public Network.Ipam.Config getIpamConfig() { + public Ipam getIpamConfig() { return ipamConfig; } /** * @see #ipamConfig */ - public ContainerNetwork withIpamConfig(Network.Ipam.Config ipamConfig) { + public ContainerNetwork withIpamConfig(Ipam ipamConfig) { this.ipamConfig = ipamConfig; return this; } @@ -212,15 +226,24 @@ public ContainerNetwork withIpV6Gateway(String ipV6Gateway) { * @see #links */ @CheckForNull - public List getLinks() { - return links; + @JsonIgnore + public Link[] getLinks() { + return links == null ? new Link[0] : links.getLinks(); + } + + /** + * @see #links + */ + public ContainerNetwork withLinks(List links) { + this.links = new Links(links); + return this; } /** * @see #links */ - public ContainerNetwork withLinks(List links) { - this.links = links; + public ContainerNetwork withLinks(Link... links) { + this.links = new Links(links); return this; } @@ -270,4 +293,34 @@ public boolean equals(Object o) { public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } + + /** + * Docker named it EndpointIPAMConfig + */ + public static class Ipam { + + @JsonProperty("IPv4Address") + private String ipv4Address; + + @JsonProperty("IPv6Address") + private String ipv6Address; + + public String getIpv4Address() { + return ipv4Address; + } + + public String getIpv6Address() { + return ipv6Address; + } + + public Ipam withIpv4Address(String ipv4Address) { + this.ipv4Address = ipv4Address; + return this; + } + + public Ipam withIpv6Address(String ipv6Address) { + this.ipv6Address = ipv6Address; + return 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 index 400ae29dd..19a6a9128 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -11,6 +11,7 @@ import org.apache.commons.lang.builder.ToStringBuilder; import javax.annotation.CheckForNull; +import java.util.Arrays; import java.util.List; /** @@ -21,6 +22,8 @@ @JsonInclude(Include.NON_NULL) public class HostConfig { + private static final List PREDEFINED_NETWORKS = Arrays.asList("bridge", "host", "none"); + @JsonProperty("Binds") private Binds binds; @@ -410,6 +413,15 @@ public String getVolumeDriver() { return volumeDriver; } + /** + * Parse the network mode as specified at + * {@see https://github.com/docker/engine-api/blob/master/types/container/hostconfig_unix.go} + */ + @JsonIgnore + public boolean isUserDefinedNetwork() { + return networkMode != null && !PREDEFINED_NETWORKS.contains(networkMode) && !networkMode.startsWith("container:"); + } + @JsonIgnore public void setBinds(Bind... binds) { this.binds = new Binds(binds); diff --git a/src/main/java/com/github/dockerjava/api/model/Network.java b/src/main/java/com/github/dockerjava/api/model/Network.java index 546904254..6f4114914 100644 --- a/src/main/java/com/github/dockerjava/api/model/Network.java +++ b/src/main/java/com/github/dockerjava/api/model/Network.java @@ -6,6 +6,7 @@ import org.apache.commons.lang.builder.ToStringBuilder; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -111,16 +112,33 @@ public static class Ipam { private String driver; @JsonProperty("Config") - List config = new ArrayList<>(); + private List config = new ArrayList<>(); + + @JsonProperty("Options") + private Map options = null; public String getDriver() { return driver; } + public Map getOptions() { + return options; + } + public List getConfig() { return config; } + public Ipam withConfig(List ipamConfigs) { + config = ipamConfigs; + return this; + } + + public Ipam withConfig(Config... ipamConfigs) { + config = Arrays.asList(ipamConfigs); + return this; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); @@ -149,6 +167,21 @@ public String getIpRange() { public String getGateway() { return gateway; } + + public Config withSubnet(String subnet) { + this.subnet = subnet; + return this; + } + + public Config withIpRange(String ipRange) { + this.ipRange = ipRange; + return this; + } + + public Config withGateway(String gateway) { + this.gateway = gateway; + return this; + } } } } diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java index 680048c18..1d523bf4b 100644 --- a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java +++ b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java @@ -3,15 +3,12 @@ */ package com.github.dockerjava.api.model; -import java.util.Map; - -import org.apache.commons.lang.builder.ToStringBuilder; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.core.RemoteApiVersion; +import org.apache.commons.lang.builder.ToStringBuilder; -import javax.annotation.CheckForNull; +import java.util.Map; /** * @@ -76,7 +73,7 @@ public class NetworkSettings { private String macAddress; @JsonProperty("Networks") - private Map networks; + private Map networks; /** * @deprecated since {@link RemoteApiVersion#VERSION_1_21} @@ -135,7 +132,7 @@ public String getIpV6Gateway() { /** * @since {@link RemoteApiVersion#VERSION_1_21} */ - public Map getNetworks() { + public Map getNetworks() { return networks; } @@ -206,83 +203,4 @@ public Integer getGlobalIPv6PrefixLen() { public String toString() { return ToStringBuilder.reflectionToString(this); } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Network { - - @JsonProperty("IPAMConfig") - private String ipamConfig; - - /** - * @since {@link RemoteApiVersion#VERSION_1_22} - */ - @JsonProperty("NetworkID") - private String networkID; - - @JsonProperty("EndpointID") - private String endpointId; - - @JsonProperty("Gateway") - private String gateway; - - @JsonProperty("IPAddress") - private String ipAddress; - - @JsonProperty("IPPrefixLen") - private Integer ipPrefixLen; - - @JsonProperty("IPv6Gateway") - private String ipV6Gateway; - - @JsonProperty("GlobalIPv6Address") - private String globalIPv6Address; - - @JsonProperty("GlobalIPv6PrefixLen") - private Integer globalIPv6PrefixLen; - - @JsonProperty("MacAddress") - private String macAddress; - - @CheckForNull - public String getNetworkID() { - return networkID; - } - - public String getEndpointId() { - return endpointId; - } - - public String getGateway() { - return gateway; - } - - public String getIpAddress() { - return ipAddress; - } - - public Integer getIpPrefixLen() { - return ipPrefixLen; - } - - public String getIpV6Gateway() { - return ipV6Gateway; - } - - public String getGlobalIPv6Address() { - return globalIPv6Address; - } - - public Integer getGlobalIPv6PrefixLen() { - return globalIPv6PrefixLen; - } - - public String getMacAddress() { - return macAddress; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - } } diff --git a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java index 7014704b1..93fd8abb8 100644 --- a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.model.ContainerNetwork; public class ConnectToNetworkCmdImpl extends AbstrDockerCmd implements ConnectToNetworkCmd { @@ -13,6 +14,9 @@ public class ConnectToNetworkCmdImpl extends AbstrDockerCmd execution) { super(execution); } @@ -27,6 +31,11 @@ public String getContainerId() { return containerId; } + @Override + public ContainerNetwork getContainerConfig() { + return endpointConfig; + } + @Override public ConnectToNetworkCmd withNetworkId(String networkId) { this.networkId = networkId; @@ -38,4 +47,10 @@ public ConnectToNetworkCmd withContainerId(String containerId) { this.containerId = containerId; return this; } + + @Override + public ConnectToNetworkCmd withContainerNetwork(ContainerNetwork endpointConfig) { + this.endpointConfig = endpointConfig; + return this; + } } 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 48b93a004..0b6944b04 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,14 +1,5 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.List; -import java.util.Map; - -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.commons.lang.builder.ToStringBuilder; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; @@ -19,6 +10,7 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Capability; +import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.ExposedPorts; @@ -33,6 +25,16 @@ import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; import com.github.dockerjava.api.model.VolumesFrom; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Collections.singletonMap; /** * Creates a new container. @@ -113,6 +115,18 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd labels; + @JsonProperty("NetworkingConfig") + private NetworkingConfig networkingConfig; + + @JsonIgnore + private String ipv4Address = null; + + @JsonIgnore + private String ipv6Address = null; + + @JsonIgnore + private List aliases = null; + public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { super(exec); checkNotNull(image, "image was not specified"); @@ -127,9 +141,48 @@ public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { */ @Override public CreateContainerResponse exec() throws NotFoundException, ConflictException { + //code flow taken from https://github.com/docker/docker/blob/master/runconfig/opts/parse.go + ContainerNetwork containerNetwork = null; + + if (ipv4Address != null || ipv6Address != null) { + containerNetwork = new ContainerNetwork() + .withIpamConfig(new ContainerNetwork.Ipam() + .withIpv4Address(ipv4Address) + .withIpv6Address(ipv6Address) + ); + + } + + if (hostConfig.isUserDefinedNetwork() && hostConfig.getLinks().length > 0) { + if (containerNetwork == null) { + containerNetwork = new ContainerNetwork(); + } + + containerNetwork.withLinks(hostConfig.getLinks()); + } + + if (aliases != null) { + if (containerNetwork == null) { + containerNetwork = new ContainerNetwork(); + } + + containerNetwork.withAliases(aliases); + } + + if (containerNetwork != null) { + networkingConfig = new NetworkingConfig() + .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork)); + } + return super.exec(); } + @Override + @JsonIgnore + public List getAliases() { + return aliases; + } + @Override @JsonIgnore public Bind[] getBinds() { @@ -247,6 +300,16 @@ public String getImage() { return image; } + @Override + public String getIpv4Address() { + return ipv4Address; + } + + @Override + public String getIpv6Address() { + return ipv6Address; + } + @Override @JsonIgnore public Map getLabels() { @@ -414,6 +477,19 @@ public String getCgroupParent() { return hostConfig.getCgroupParent(); } + @Override + public CreateContainerCmd withAliases(String... aliases) { + this.aliases = Arrays.asList(aliases); + return this; + } + + @Override + public CreateContainerCmd withAliases(List aliases) { + checkNotNull(aliases, "aliases was not specified"); + this.aliases = aliases; + return this; + } + @Override public CreateContainerCmd withAttachStderr(Boolean attachStderr) { checkNotNull(attachStderr, "attachStderr was not specified"); @@ -648,6 +724,20 @@ public CreateContainerCmd withImage(String image) { return this; } + @Override + public CreateContainerCmd withIpv4Address(String ipv4Address) { + checkNotNull(ipv4Address, "no ipv4Address was specified"); + this.ipv4Address = ipv4Address; + return this; + } + + @Override + public CreateContainerCmd withIpv6Address(String ipv6Address) { + checkNotNull(ipv6Address, "no ipv6Address was specified"); + this.ipv6Address = ipv6Address; + return this; + } + @Override public CreateContainerCmd withLabels(Map labels) { checkNotNull(labels, "labels was not specified"); @@ -900,4 +990,18 @@ public boolean equals(Object o) { public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } + + public static class NetworkingConfig { + @JsonProperty("EndpointsConfig") + public Map endpointsConfig; + + public Map getEndpointsConfig() { + return endpointsConfig; + } + + public NetworkingConfig withEndpointsConfig(Map endpointsConfig) { + this.endpointsConfig = endpointsConfig; + return this; + } + } } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java index c7d3b0abb..834aa6905 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java @@ -25,6 +25,15 @@ public class CreateNetworkCmdImpl extends AbstrDockerCmd options = new HashMap<>(); + @JsonProperty("CheckDuplicate") + private Boolean checkDuplicate; + + @JsonProperty("Internal") + private Boolean internal; + + @JsonProperty("EnableIPv6") + private Boolean enableIpv6; + public CreateNetworkCmdImpl(DockerCmdSyncExec execution) { super(execution); } @@ -44,6 +53,26 @@ public Network.Ipam getIpam() { return ipam; } + @Override + public Map getOptions() { + return options; + } + + @Override + public Boolean getCheckDuplicate() { + return checkDuplicate; + } + + @Override + public Boolean getInternal() { + return internal; + } + + @Override + public Boolean getEnableIPv6() { + return enableIpv6; + } + @Override public CreateNetworkCmd withName(String name) { this.name = name; @@ -57,8 +86,8 @@ public CreateNetworkCmd withDriver(String driver) { } @Override - public CreateNetworkCmd withIpamConfig(Ipam.Config config) { - this.ipam.getConfig().add(config); + public CreateNetworkCmd withIpam(Ipam ipam) { + this.ipam = ipam; return this; } @@ -67,4 +96,22 @@ public CreateNetworkCmd withOptions(Map options) { this.options = options; return this; } + + @Override + public CreateNetworkCmd withCheckDuplicate(boolean checkDuplicate) { + this.checkDuplicate = checkDuplicate; + return this; + } + + @Override + public CreateNetworkCmd withInternal(boolean internal) { + this.internal = internal; + return this; + } + + @Override + public CreateNetworkCmd withEnableIpv6(boolean enableIpv6) { + this.enableIpv6 = enableIpv6; + return this; + } } diff --git a/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java index ae24946b6..b871b36c6 100644 --- a/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java @@ -14,6 +14,9 @@ public class DisconnectFromNetworkCmdImpl extends AbstrDockerCmd execution) { super(execution); } @@ -28,6 +31,11 @@ public String getContainerId() { return containerId; } + @Override + public Boolean getForce() { + return force; + } + @Override public DisconnectFromNetworkCmd withNetworkId(String networkId) { this.networkId = networkId; @@ -39,4 +47,10 @@ public DisconnectFromNetworkCmd withContainerId(String containerId) { this.containerId = containerId; return this; } + + @Override + public DisconnectFromNetworkCmd withForce(Boolean force) { + this.force = force; + return this; + } } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java index ced7279f9..cc9465244 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java @@ -14,7 +14,6 @@ public RemoveNetworkCmdImpl(DockerCmdSyncExec execution, @Override public String getNetworkId() { - return networkId; } diff --git a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java index ad051e0bd..f67994de6 100644 --- a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java @@ -1,7 +1,11 @@ package com.github.dockerjava.core.command; -import java.lang.reflect.Method; - +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.ContainerNetwork; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -9,11 +13,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateNetworkResponse; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.Network; -import com.github.dockerjava.client.AbstractDockerClientTest; +import java.lang.reflect.Method; +import java.util.Collections; @Test(groups = "integration") public class ConnectToNetworkCmdImplTest extends AbstractDockerClientTest { @@ -56,4 +57,41 @@ public void connectToNetwork() throws InterruptedException { assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork")); } + + @Test + public void connectToNetworkWithContainerNetwork() throws InterruptedException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); + + CreateNetworkResponse network = dockerClient.createNetworkCmd() + .withName("testNetwork") + .withIpam(new Network.Ipam() + .withConfig(new Network.Ipam.Config() + .withSubnet("10.100.100.0/24"))) + .exec(); + + dockerClient.connectToNetworkCmd() + .withNetworkId(network.getId()) + .withContainerId(container.getId()) + .withContainerNetwork(new ContainerNetwork() + .withAliases("testing") + .withIpamConfig(new ContainerNetwork.Ipam() + .withIpv4Address("10.100.100.100"))) + .exec(); + + Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec(); + + Network.ContainerNetworkConfig containerNetworkConfig = updatedNetwork.getContainers().get(container.getId()); + assertNotNull(containerNetworkConfig); + assertEquals("10.100.100.100", containerNetworkConfig.getIpv4Address()); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork"); + assertNotNull(testNetwork); + assertEquals(Collections.singletonList("testing"), testNetwork.getAliases()); + assertEquals("10.100.100.0", testNetwork.getGateway()); + assertEquals("10.100.100.100", testNetwork.getIpAddress()); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index f2fd32b6a..682edc4ce 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -1,15 +1,18 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateNetworkResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Link; import com.github.dockerjava.api.model.LogConfig; +import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Ulimit; @@ -22,10 +25,12 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import org.testng.internal.junit.ArrayAsserts; import java.lang.reflect.Method; import java.security.SecureRandom; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -268,6 +273,107 @@ public void createContainerWithLink() throws DockerException { "container1Link")})); } + @Test + public void createContainerWithLinkInCustomNetwork() throws DockerException { + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd() + .withName("linkNet") + .exec(); + + assertNotNull(createNetworkResponse.getId()); + + CreateContainerResponse container1 = dockerClient.createContainerCmd(BUSYBOX_IMAGE) + .withNetworkMode("linkNet") + .withCmd("sleep", "9999") + .withName("container1") + .exec(); + + assertThat(container1.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); + + CreateContainerResponse container2 = dockerClient.createContainerCmd(BUSYBOX_IMAGE) + .withNetworkMode("linkNet") + .withName("container2") + .withCmd("env") + .withLinks(new Link("container1", "container1Link")) + .exec(); + + LOG.info("Created container {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + + ContainerNetwork linkNet = inspectContainerResponse2.getNetworkSettings().getNetworks().get("linkNet"); + assertNotNull(linkNet); + ArrayAsserts.assertArrayEquals(new Link[]{ new Link("container1", "container1Link")}, linkNet.getLinks()); + } + + @Test + public void createContainerWithCustomIp() throws DockerException { + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd() + .withIpam(new Network.Ipam() + .withConfig(new Network.Ipam.Config() + .withSubnet("10.100.101.0/24"))) + .withName("customIpNet") + .exec(); + + assertNotNull(createNetworkResponse.getId()); + + CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE) + .withNetworkMode("customIpNet") + .withCmd("sleep", "9999") + .withName("container") + .withIpv4Address("10.100.101.100") + .exec(); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()) + .exec(); + + ContainerNetwork customIpNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("customIpNet"); + assertNotNull(customIpNet); + assertEquals("10.100.101.0", customIpNet.getGateway()); + assertEquals("10.100.101.100", customIpNet.getIpAddress()); + } + + @Test + public void createContainerWithAlias() throws DockerException { + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd() + .withName("aliasNet") + .exec(); + + assertNotNull(createNetworkResponse.getId()); + + CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE) + .withNetworkMode("aliasNet") + .withCmd("sleep", "9999") + .withName("container") + .withAliases("server") + .exec(); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()) + .exec(); + + ContainerNetwork aliasNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("aliasNet"); + assertEquals(Collections.singletonList("server"), aliasNet.getAliases()); + } + @Test public void createContainerWithCapAddAndCapDrop() throws DockerException { diff --git a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java index 7f94c5a0f..c4219b54e 100644 --- a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java @@ -56,4 +56,26 @@ public void disconnectFromNetwork() throws InterruptedException { assertFalse(updatedNetwork.getContainers().containsKey(container.getId())); } + + @Test + public void forceDisconnectFromNetwork() throws InterruptedException { + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withNetworkMode("testNetwork") + .withCmd("sleep", "9999") + .exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.disconnectFromNetworkCmd() + .withNetworkId(network.getId()) + .withContainerId(container.getId()) + .withForce(true) + .exec(); + + Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec(); + assertFalse(updatedNetwork.getContainers().containsKey(container.getId())); + } }