From f6d225d2c2e65aa058da5b94c2350cbe5d5f96c9 Mon Sep 17 00:00:00 2001 From: Andrew Keely Date: Fri, 8 Jan 2016 22:58:51 -0500 Subject: [PATCH] Implement Network API --- .../github/dockerjava/api/DockerClient.java | 18 ++ .../api/command/ConnectToNetworkCmd.java | 27 ++ .../api/command/CreateNetworkCmd.java | 42 +++ .../api/command/CreateNetworkResponse.java | 36 +++ .../api/command/DisconnectFromNetworkCmd.java | 27 ++ .../api/command/DockerCmdExecFactory.java | 12 + .../api/command/InspectContainerResponse.java | 54 +--- .../api/command/InspectExecResponse.java | 31 ++ .../api/command/InspectNetworkCmd.java | 31 ++ .../api/command/ListNetworksCmd.java | 25 ++ .../api/command/RemoveNetworkCmd.java | 30 ++ .../github/dockerjava/api/model/Network.java | 154 ++++++++++ .../dockerjava/api/model/NetworkFilters.java | 15 + .../dockerjava/api/model/NetworkSettings.java | 272 ++++++++++++++++++ .../dockerjava/api/model/PortBinding.java | 1 - .../github/dockerjava/api/model/Ports.java | 1 - .../dockerjava/core/DockerClientImpl.java | 42 +++ .../core/command/ConnectToNetworkCmdImpl.java | 39 +++ .../core/command/CreateNetworkCmdImpl.java | 71 +++++ .../command/DisconnectFromNetworkCmdImpl.java | 40 +++ .../core/command/InpectNetworkCmdImpl.java | 24 ++ .../core/command/ListNetworksCmdImpl.java | 27 ++ .../core/command/RemoveNetworkCmdImpl.java | 26 ++ .../jaxrs/ConnectToNetworkCmdExec.java | 32 +++ .../jaxrs/CreateNetworkCmdExec.java | 31 ++ .../jaxrs/DisconnectFromNetworkCmdExec.java | 32 +++ .../jaxrs/DockerCmdExecFactoryImpl.java | 91 ++++-- .../jaxrs/InspectNetworkCmdExec.java | 28 ++ .../dockerjava/jaxrs/ListNetworksCmdExec.java | 43 +++ .../jaxrs/RemoveNetworkCmdExec.java | 30 ++ .../netty/DockerCmdExecFactoryImpl.java | 96 +++++-- .../netty/exec/ConnectToNetworkCmdExec.java | 29 ++ .../netty/exec/CreateNetworkCmdExec.java | 30 ++ .../exec/DisconnectFromNetworkCmdExec.java | 29 ++ .../netty/exec/InspectNetworkCmdExec.java | 29 ++ .../netty/exec/ListNetworksCmdExec.java | 37 +++ .../netty/exec/RemoveNetworkCmdExec.java | 29 ++ .../client/AbstractDockerClientTest.java | 23 ++ .../core/TestDockerCmdExecFactory.java | 97 ++++--- .../command/ConnectToNetworkCmdImplTest.java | 59 ++++ .../command/CreateNetworkCmdImplTest.java | 52 ++++ .../DisconnectFromNetworkCmdImplTest.java | 59 ++++ .../command/InspectContainerCmdImplTest.java | 15 + .../core/command/InspectExecCmdImplTest.java | 30 +- .../command/InspectNetworkCmdImplTest.java | 57 ++++ .../core/command/ListNetworksCmdImplTest.java | 55 ++++ .../command/RemoveNetworkCmdImplTest.java | 76 +++++ .../netty/exec/CreateNetworkCmdExecTest.java | 52 ++++ .../exec/InspectContainerCmdExecTest.java | 15 + .../netty/exec/InspectExecCmdExecTest.java | 22 ++ .../netty/exec/InspectNetworkCmdExecTest.java | 57 ++++ .../netty/exec/ListNetworksCmdExecTest.java | 55 ++++ .../netty/exec/RemoveNetworkCmdExecTest.java | 76 +++++ 53 files changed, 2252 insertions(+), 159 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/model/Network.java create mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkFilters.java create mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkSettings.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index a3a3a9aa0..5db2967ff 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -11,13 +11,16 @@ import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; @@ -25,10 +28,12 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectVolumeCmd; import com.github.dockerjava.api.command.KillContainerCmd; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -37,6 +42,7 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; @@ -200,6 +206,18 @@ public interface DockerClient extends Closeable { public ListVolumesCmd listVolumesCmd(); + public ListNetworksCmd listNetworksCmd(); + + public InspectNetworkCmd inspectNetworkCmd(); + + public CreateNetworkCmd createNetworkCmd(); + + public RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId); + + public ConnectToNetworkCmd connectToNetworkCmd(); + + public DisconnectFromNetworkCmd disconnectFromNetworkCmd(); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java new file mode 100644 index 000000000..cf76e2ec3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Connects a container to a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ConnectToNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + @CheckForNull + public String getContainerId(); + + public ConnectToNetworkCmd withNetworkId(@Nonnull String networkId); + + public ConnectToNetworkCmd withContainerId(@Nonnull String containerId); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java new file mode 100644 index 000000000..2e3cd92a0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java @@ -0,0 +1,42 @@ +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; + +/** + * Create a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface CreateNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getName(); + + @CheckForNull + public String getDriver(); + + @CheckForNull + public Network.Ipam getIpam(); + + /** The new network's name. Required. */ + public CreateNetworkCmd withName(@Nonnull String name); + + /** Optional custom IP scheme for the network. */ + public CreateNetworkCmd withIpamConfig(Ipam.Config config); + + /** Name of the network driver to use. Defaults to bridge. */ + public CreateNetworkCmd withDriver(String driver); + + /** Driver specific options */ + public CreateNetworkCmd withOptions(Map options); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java new file mode 100644 index 000000000..ec4827476 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CreateNetworkResponse { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Warnings") + private String[] warnings; + + public String getId() { + return id; + } + + public String[] getWarnings() { + return warnings; + } + + public void setId(String id) { + this.id = id; + } + + public void setWarnings(String[] warnings) { + this.warnings = warnings; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java new file mode 100644 index 000000000..a2452416b --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Disconnects a container from a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface DisconnectFromNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + @CheckForNull + public String getContainerId(); + + public DisconnectFromNetworkCmd withNetworkId(@Nonnull String networkId); + + public DisconnectFromNetworkCmd withContainerId(@Nonnull String containerId); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 98de728e8..fb1715e38 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -93,6 +93,18 @@ public interface DockerCmdExecFactory extends Closeable { public ListVolumesCmd.Exec createListVolumesCmdExec(); + public ListNetworksCmd.Exec createListNetworksCmdExec(); + + public InspectNetworkCmd.Exec createInspectNetworkCmdExec(); + + public CreateNetworkCmd.Exec createCreateNetworkCmdExec(); + + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec(); + + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec(); + + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec(); + @Override public void close() throws IOException; 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 59438dba2..85f2812f0 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.command; import java.util.List; -import java.util.Map; import javax.annotation.CheckForNull; @@ -14,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.model.ContainerConfig; import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.NetworkSettings; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.api.model.VolumeBinds; @@ -203,56 +202,7 @@ public String toString() { return ToStringBuilder.reflectionToString(this); } - @JsonIgnoreProperties(ignoreUnknown = true) - public class NetworkSettings { - - @JsonProperty("IPAddress") - private String ipAddress; - - @JsonProperty("IPPrefixLen") - private Integer ipPrefixLen; - - @JsonProperty("Gateway") - private String gateway; - - @JsonProperty("Bridge") - private String bridge; - - @JsonProperty("PortMapping") - private Map> portMapping; - - @JsonProperty("Ports") - private Ports ports; - - public String getIpAddress() { - return ipAddress; - } - - public Integer getIpPrefixLen() { - return ipPrefixLen; - } - - public String getGateway() { - return gateway; - } - public String getBridge() { - return bridge; - } - - public Map> getPortMapping() { - return portMapping; - } - - public Ports getPorts() { - return ports; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - } @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { @@ -514,7 +464,5 @@ public String getMode() { public Boolean getRW() { return rw; } - } - } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java index b1cb09b20..63f111dce 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.NetworkSettings; +import com.github.dockerjava.core.RemoteApiVersion; @JsonIgnoreProperties(ignoreUnknown = true) public class InspectExecResponse { @@ -27,6 +29,12 @@ public class InspectExecResponse { @JsonProperty("ExitCode") private Integer exitCode; + @JsonProperty("ProcessConfig") + private ProcessConfig processConfig; + + @JsonProperty("Container") + private Container container; + public String getId() { return id; } @@ -51,6 +59,14 @@ public Integer getExitCode() { return exitCode; } + public ProcessConfig getProcessConfig() { + return processConfig; + } + + public Container getContainer() { + return container; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); @@ -58,6 +74,7 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class ProcessConfig { + @JsonProperty("arguments") private List arguments; @@ -98,4 +115,18 @@ public String toString() { return ToStringBuilder.reflectionToString(this); } } + + @JsonIgnoreProperties(ignoreUnknown = true) + public class Container { + + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public NetworkSettings getNetworkSettings() { + return networkSettings; + } + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java new file mode 100644 index 000000000..18394879a --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Inspect a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface InspectNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + public InspectNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + public Network exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java new file mode 100644 index 000000000..2b5b29996 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; + +import java.util.List; + +/** + * List networks. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ListNetworksCmd extends SyncDockerCmd> { + + @CheckForNull + public Filters getFilters(); + + ListNetworksCmd withFilters(Filters filters); + + public static interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java new file mode 100644 index 000000000..3dcb428e2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface RemoveNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + public RemoveNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + public Void exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/Network.java b/src/main/java/com/github/dockerjava/api/model/Network.java new file mode 100644 index 000000000..d62d83019 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Network.java @@ -0,0 +1,154 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Network { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Scope") + private String scope; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("IPAM") + private Ipam ipam; + + @JsonProperty("Containers") + private Map containers; + + @JsonProperty("Options") + private Map options; + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getScope() { + return scope; + } + + public String getDriver() { + return driver; + } + + public Ipam getIpam() { + return ipam; + } + + public Map getContainers() { + return containers; + } + + public Map getOptions() { + return options; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ContainerNetworkConfig { + + @JsonProperty("EndpointID") + private String endpointId; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("IPv4Address") + private String ipv4Address; + + @JsonProperty("IPv6Address") + private String ipv6Address; + + public String getEndpointId() { + return endpointId; + } + + public String getMacAddress() { + return macAddress; + } + + public String getIpv4Address() { + return ipv4Address; + } + + public String getIpv6Address() { + return ipv6Address; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Ipam { + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Config") + List config = new ArrayList<>(); + + public String getDriver() { + return driver; + } + + public List getConfig() { + return config; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Config { + + @JsonProperty("Subnet") + private String subnet; + + @JsonProperty("IPRange") + private String ipRange; + + @JsonProperty("Gateway") + private String gateway; + + public String getSubnet() { + return subnet; + } + + public String getIpRange() { + return ipRange; + } + + public String getGateway() { + return gateway; + } + } + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java new file mode 100644 index 000000000..f3c837643 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java @@ -0,0 +1,15 @@ +package com.github.dockerjava.api.model; + +/** + * Created by andrewk on 1/5/16. + */ +public class NetworkFilters extends Filters { + + public Filters withNames(String... names) { + return withFilter("name", names); + } + + public Filters withIds(String... ids) { + return withFilter("id", ids); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java new file mode 100644 index 000000000..64c954ec9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java @@ -0,0 +1,272 @@ +/* + * Created on 16.01.2016 + */ +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; + +/** + * + * @author Marcus Linke + * + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class NetworkSettings { + + @JsonProperty("Bridge") + private String bridge; + + @JsonProperty("SandboxID") + private String sandboxId; + + @JsonProperty("HairpinMode") + private Boolean hairpinMode; + + @JsonProperty("LinkLocalIPv6Address") + private String linkLocalIPv6Address; + + @JsonProperty("LinkLocalIPv6PrefixLen") + private Integer linkLocalIPv6PrefixLen; + + @JsonProperty("Ports") + private Ports ports; + + @JsonProperty("SandboxKey") + private String sandboxKey; + + @JsonProperty("SecondaryIPAddresses") + private Object secondaryIPAddresses; + + @JsonProperty("SecondaryIPv6Addresses") + private Object secondaryIPv6Addresses; + + @JsonProperty("EndpointID") + private String endpointID; + + @JsonProperty("Gateway") + private String gateway; + + @JsonProperty("PortMapping") + private Map> portMapping; + + @JsonProperty("GlobalIPv6Address") + private String globalIPv6Address; + + @JsonProperty("GlobalIPv6PrefixLen") + private Integer globalIPv6PrefixLen; + + @JsonProperty("IPAddress") + private String ipAddress; + + @JsonProperty("IPPrefixLen") + private Integer ipPrefixLen; + + @JsonProperty("IPv6Gateway") + private String ipV6Gateway; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("Networks") + private Map networks; + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getIpAddress() { + return ipAddress; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getIpPrefixLen() { + return ipPrefixLen; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getGateway() { + return gateway; + } + + public String getBridge() { + return bridge; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public Map> getPortMapping() { + return portMapping; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getMacAddress() { + return macAddress; + } + + public Ports getPorts() { + return ports; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getEndpointID() { + return endpointID; + } + + public String getIpV6Gateway() { + return ipV6Gateway; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Map getNetworks() { + return networks; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getSandboxId() { + return sandboxId; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getSandboxKey() { + return sandboxKey; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Object getSecondaryIPAddresses() { + return secondaryIPAddresses; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Object getSecondaryIPv6Addresses() { + return secondaryIPv6Addresses; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Boolean getHairpinMode() { + return hairpinMode; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getLinkLocalIPv6Address() { + return linkLocalIPv6Address; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getLinkLocalIPv6PrefixLen() { + return linkLocalIPv6PrefixLen; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getGlobalIPv6Address() { + return globalIPv6Address; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getGlobalIPv6PrefixLen() { + return globalIPv6PrefixLen; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Network { + + @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; + + 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/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java index 355e83aa3..99e04f1bc 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.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 a5f13977b..0ff5762e6 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.NetworkSettings; /** * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 05726f735..ede135613 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -12,13 +12,16 @@ import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -27,10 +30,12 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectVolumeCmd; import com.github.dockerjava.api.command.KillContainerCmd; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -39,6 +44,7 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; @@ -57,17 +63,21 @@ import com.github.dockerjava.core.command.AuthCmdImpl; import com.github.dockerjava.core.command.BuildImageCmdImpl; import com.github.dockerjava.core.command.CommitCmdImpl; +import com.github.dockerjava.core.command.ConnectToNetworkCmdImpl; import com.github.dockerjava.core.command.ContainerDiffCmdImpl; import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl; import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl; import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.CreateNetworkCmdImpl; import com.github.dockerjava.core.command.CreateVolumeCmdImpl; +import com.github.dockerjava.core.command.DisconnectFromNetworkCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.core.command.InpectNetworkCmdImpl; import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.InspectExecCmdImpl; import com.github.dockerjava.core.command.InspectImageCmdImpl; @@ -75,6 +85,7 @@ import com.github.dockerjava.core.command.KillContainerCmdImpl; import com.github.dockerjava.core.command.ListContainersCmdImpl; import com.github.dockerjava.core.command.ListImagesCmdImpl; +import com.github.dockerjava.core.command.ListNetworksCmdImpl; import com.github.dockerjava.core.command.ListVolumesCmdImpl; import com.github.dockerjava.core.command.LogContainerCmdImpl; import com.github.dockerjava.core.command.PauseContainerCmdImpl; @@ -83,6 +94,7 @@ import com.github.dockerjava.core.command.PushImageCmdImpl; import com.github.dockerjava.core.command.RemoveContainerCmdImpl; import com.github.dockerjava.core.command.RemoveImageCmdImpl; +import com.github.dockerjava.core.command.RemoveNetworkCmdImpl; import com.github.dockerjava.core.command.RemoveVolumeCmdImpl; import com.github.dockerjava.core.command.RestartContainerCmdImpl; import com.github.dockerjava.core.command.SaveImageCmdImpl; @@ -417,6 +429,36 @@ public ListVolumesCmd listVolumesCmd() { return new ListVolumesCmdImpl(getDockerCmdExecFactory().createListVolumesCmdExec()); } + @Override + public ListNetworksCmd listNetworksCmd() { + return new ListNetworksCmdImpl(getDockerCmdExecFactory().createListNetworksCmdExec()); + } + + @Override + public InspectNetworkCmd inspectNetworkCmd() { + return new InpectNetworkCmdImpl(getDockerCmdExecFactory().createInspectNetworkCmdExec()); + } + + @Override + public CreateNetworkCmd createNetworkCmd() { + return new CreateNetworkCmdImpl(getDockerCmdExecFactory().createCreateNetworkCmdExec()); + } + + @Override + public RemoveNetworkCmd removeNetworkCmd(String networkId) { + return new RemoveNetworkCmdImpl(getDockerCmdExecFactory().createRemoveNetworkCmdExec(), networkId); + } + + @Override + public ConnectToNetworkCmd connectToNetworkCmd() { + return new ConnectToNetworkCmdImpl(getDockerCmdExecFactory().createConnectToNetworkCmdExec()); + } + + @Override + public DisconnectFromNetworkCmd disconnectFromNetworkCmd() { + return new DisconnectFromNetworkCmdImpl(getDockerCmdExecFactory().createDisconnectFromNetworkCmdExec()); + } + @Override public void close() throws IOException { getDockerCmdExecFactory().close(); diff --git a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java new file mode 100644 index 000000000..cfb6cce14 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; + +public class ConnectToNetworkCmdImpl extends AbstrDockerCmd implements ConnectToNetworkCmd { + + @JsonIgnore + private String networkId; + + @JsonProperty("Container") + private String containerId; + + public ConnectToNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getNetworkId() { + return networkId; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override public ConnectToNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } + + @Override public ConnectToNetworkCmd withContainerId(String containerId) { + this.containerId = containerId; + 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 new file mode 100644 index 000000000..fba16dfb9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java @@ -0,0 +1,71 @@ +package com.github.dockerjava.core.command; + + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.api.model.Network.Ipam; + +public class CreateNetworkCmdImpl extends AbstrDockerCmd + implements CreateNetworkCmd { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("IPAM") + private Network.Ipam ipam; + + @JsonProperty("Options") + private Map options = new HashMap<>(); + + public CreateNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDriver() { + return driver; + } + + @Override + public Network.Ipam getIpam() { + return ipam; + } + + @Override + public CreateNetworkCmd withName(String name) { + this.name = name; + return this; + } + + @Override + public CreateNetworkCmd withDriver(String driver) { + this.driver = driver; + return this; + } + + @Override + public CreateNetworkCmd withIpamConfig(Ipam.Config config) { + this.ipam.getConfig().add(config); + return this; + } + + @Override + public CreateNetworkCmd withOptions(Map options) { + this.options = options; + 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 new file mode 100644 index 000000000..a89201ad2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; + +public class DisconnectFromNetworkCmdImpl extends AbstrDockerCmd + implements DisconnectFromNetworkCmd { + + @JsonIgnore + private String networkId; + + @JsonProperty("Container") + private String containerId; + + public DisconnectFromNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getNetworkId() { + return networkId; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override public DisconnectFromNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } + + @Override public DisconnectFromNetworkCmd withContainerId(String containerId) { + this.containerId = containerId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java new file mode 100644 index 000000000..0a0c564c5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; + +public class InpectNetworkCmdImpl extends AbstrDockerCmd implements InspectNetworkCmd { + + private String networkId; + + public InpectNetworkCmdImpl(DockerCmdSyncExec exec) { + super(exec); + } + + @Override public String getNetworkId() { + return networkId; + } + + @Override public InspectNetworkCmd withNetworkId(String networkId) { + + this.networkId = networkId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java new file mode 100644 index 000000000..2303e7c9c --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.api.model.Network; + +import java.util.List; + +public class ListNetworksCmdImpl extends AbstrDockerCmd> implements + ListNetworksCmd { + + private Filters filters; + + public ListNetworksCmdImpl(ListNetworksCmd.Exec exec) { + super(exec); + } + + @Override public Filters getFilters() { + return filters; + } + + @Override public ListNetworksCmd withFilters(Filters filters) { + + this.filters = filters; + 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 new file mode 100644 index 000000000..ced7279f9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.RemoveNetworkCmd; + +public class RemoveNetworkCmdImpl extends AbstrDockerCmd implements RemoveNetworkCmd { + + private String networkId; + + public RemoveNetworkCmdImpl(DockerCmdSyncExec execution, String networkId) { + super(execution); + withNetworkId(networkId); + } + + @Override + public String getNetworkId() { + + return networkId; + } + + @Override + public RemoveNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java new file mode 100644 index 000000000..dfc730e03 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec + implements ConnectToNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); + + public ConnectToNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ConnectToNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/connect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(entity(command, MediaType.APPLICATION_JSON)); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java new file mode 100644 index 000000000..14f22b502 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class CreateNetworkCmdExec extends AbstrSyncDockerCmdExec implements + CreateNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateNetworkCmdExec.class); + + public CreateNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateNetworkResponse execute(CreateNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateNetworkResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java new file mode 100644 index 000000000..4f6f54576 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec + implements DisconnectFromNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); + + public DisconnectFromNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(DisconnectFromNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/disconnect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(entity(command, MediaType.APPLICATION_JSON)); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 30bc5e34f..bbd71ba38 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -2,44 +2,21 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.URI; -import java.util.List; - -import javax.net.ssl.SSLContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.ClientRequestFilter; -import javax.ws.rs.client.ClientResponseFilter; -import javax.ws.rs.client.WebTarget; - -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.glassfish.jersey.CommonProperties; -import org.glassfish.jersey.apache.connector.ApacheClientProperties; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.client.ClientProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -48,10 +25,12 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectVolumeCmd; import com.github.dockerjava.api.command.KillContainerCmd; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -60,6 +39,7 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; @@ -78,6 +58,30 @@ import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.glassfish.jersey.CommonProperties; +import org.glassfish.jersey.apache.connector.ApacheClientProperties; +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.SSLContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.client.WebTarget; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.URI; +import java.util.List; //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 @@ -445,6 +449,41 @@ public ListVolumesCmd.Exec createListVolumesCmdExec() { return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ListNetworksCmd.Exec createListNetworksCmdExec() { + return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public InspectNetworkCmd.Exec createInspectNetworkCmdExec() { + + return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public CreateNetworkCmd.Exec createCreateNetworkCmdExec() { + + return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() { + + return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() { + + return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { + + return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public void close() throws IOException { checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java new file mode 100644 index 000000000..c5e6b4d0a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class InspectNetworkCmdExec extends AbstrSyncDockerCmdExec implements InspectNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public InspectNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override protected Network execute(InspectNetworkCmd command) { + + WebTarget webResource = getBaseResource().path("/networks/{id}").resolveTemplate("id", + command.getNetworkId()); + + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Network.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java new file mode 100644 index 000000000..80438d433 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import java.util.List; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListNetworksCmdExec extends AbstrSyncDockerCmdExec> implements + ListNetworksCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListNetworksCmd command) { + WebTarget webTarget = getBaseResource().path("/networks"); + + if (command.getFilters() != null) { + webTarget = webTarget + .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + } + + LOGGER.trace("GET: {}", webTarget); + List networks = webTarget.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", networks); + + return networks; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java new file mode 100644 index 000000000..84f115d4c --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class RemoveNetworkCmdExec extends AbstrSyncDockerCmdExec + implements RemoveNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveNetworkCmdExec.class); + + public RemoveNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete().close(); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 9ddd51288..ee3b50101 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -1,44 +1,19 @@ package com.github.dockerjava.netty; -import static com.google.common.base.Preconditions.checkNotNull; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.epoll.EpollDomainSocketChannel; -import io.netty.channel.epoll.EpollEventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.channel.unix.DomainSocketAddress; -import io.netty.channel.unix.UnixChannel; -import io.netty.handler.codec.http.HttpClientCodec; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.ssl.SslHandler; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.security.Security; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLEngine; -import javax.net.ssl.SSLParameters; - -import org.bouncycastle.jce.provider.BouncyCastleProvider; - import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -47,10 +22,12 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectVolumeCmd; import com.github.dockerjava.api.command.KillContainerCmd; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -59,6 +36,7 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; @@ -77,13 +55,16 @@ import com.github.dockerjava.netty.exec.AuthCmdExec; import com.github.dockerjava.netty.exec.BuildImageCmdExec; import com.github.dockerjava.netty.exec.CommitCmdExec; +import com.github.dockerjava.netty.exec.ConnectToNetworkCmdExec; import com.github.dockerjava.netty.exec.ContainerDiffCmdExec; import com.github.dockerjava.netty.exec.CopyArchiveFromContainerCmdExec; import com.github.dockerjava.netty.exec.CopyArchiveToContainerCmdExec; import com.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec; import com.github.dockerjava.netty.exec.CreateContainerCmdExec; import com.github.dockerjava.netty.exec.CreateImageCmdExec; +import com.github.dockerjava.netty.exec.CreateNetworkCmdExec; import com.github.dockerjava.netty.exec.CreateVolumeCmdExec; +import com.github.dockerjava.netty.exec.DisconnectFromNetworkCmdExec; import com.github.dockerjava.netty.exec.EventsCmdExec; import com.github.dockerjava.netty.exec.ExecCreateCmdExec; import com.github.dockerjava.netty.exec.ExecStartCmdExec; @@ -91,10 +72,12 @@ import com.github.dockerjava.netty.exec.InspectContainerCmdExec; import com.github.dockerjava.netty.exec.InspectExecCmdExec; import com.github.dockerjava.netty.exec.InspectImageCmdExec; +import com.github.dockerjava.netty.exec.InspectNetworkCmdExec; import com.github.dockerjava.netty.exec.InspectVolumeCmdExec; import com.github.dockerjava.netty.exec.KillContainerCmdExec; import com.github.dockerjava.netty.exec.ListContainersCmdExec; import com.github.dockerjava.netty.exec.ListImagesCmdExec; +import com.github.dockerjava.netty.exec.ListNetworksCmdExec; import com.github.dockerjava.netty.exec.ListVolumesCmdExec; import com.github.dockerjava.netty.exec.LogContainerCmdExec; import com.github.dockerjava.netty.exec.PauseContainerCmdExec; @@ -103,6 +86,7 @@ import com.github.dockerjava.netty.exec.PushImageCmdExec; import com.github.dockerjava.netty.exec.RemoveContainerCmdExec; import com.github.dockerjava.netty.exec.RemoveImageCmdExec; +import com.github.dockerjava.netty.exec.RemoveNetworkCmdExec; import com.github.dockerjava.netty.exec.RemoveVolumeCmdExec; import com.github.dockerjava.netty.exec.RestartContainerCmdExec; import com.github.dockerjava.netty.exec.SaveImageCmdExec; @@ -115,6 +99,32 @@ import com.github.dockerjava.netty.exec.UnpauseContainerCmdExec; import com.github.dockerjava.netty.exec.VersionCmdExec; import com.github.dockerjava.netty.exec.WaitContainerCmdExec; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.epoll.EpollDomainSocketChannel; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.channel.unix.DomainSocketAddress; +import io.netty.channel.unix.UnixChannel; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.ssl.SslHandler; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLParameters; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.security.Security; + +import static com.google.common.base.Preconditions.checkNotNull; /** * Experimental implementation of {@link DockerCmdExecFactory} that supports http connection hijacking that is needed to @@ -505,6 +515,36 @@ public ListVolumesCmd.Exec createListVolumesCmdExec() { return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ListNetworksCmd.Exec createListNetworksCmdExec() { + return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public InspectNetworkCmd.Exec createInspectNetworkCmdExec() { + return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public CreateNetworkCmd.Exec createCreateNetworkCmdExec() { + return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() { + return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() { + return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { + return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public void close() throws IOException { checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!"); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java new file mode 100644 index 000000000..b1090f4c3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec + implements ConnectToNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); + + public ConnectToNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ConnectToNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/connect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(command); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java new file mode 100644 index 000000000..cfc825e80 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateNetworkCmdExec extends AbstrSyncDockerCmdExec implements + CreateNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateNetworkCmdExec.class); + + public CreateNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateNetworkResponse execute(CreateNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java new file mode 100644 index 000000000..8b814bddc --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec + implements DisconnectFromNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); + + public DisconnectFromNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(DisconnectFromNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/disconnect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(command); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java new file mode 100644 index 000000000..51777972f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InspectNetworkCmdExec extends AbstrSyncDockerCmdExec implements + InspectNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectNetworkCmdExec.class); + + public InspectNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Network execute(InspectNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/{id}").resolveTemplate("id", command.getNetworkId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java new file mode 100644 index 000000000..8f370642f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListNetworksCmdExec extends AbstrSyncDockerCmdExec> implements + ListNetworksCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListNetworksCmd command) { + WebTarget webTarget = getBaseResource().path("/networks"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java new file mode 100644 index 000000000..deb52100d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RemoveNetworkCmdExec extends AbstrSyncDockerCmdExec implements + RemoveNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveNetworkCmdExec.class); + + public RemoveNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveNetworkCmd command) { + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + return null; + } + +} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 8751e07e5..37e2916e6 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -12,6 +12,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; +import org.apache.commons.lang.StringUtils; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; import org.slf4j.Logger; @@ -24,6 +25,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse.Mount; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; @@ -118,6 +120,15 @@ public void afterMethod(ITestResult result) { } } + for (String networkId : dockerCmdExecFactory.getNetworkIds()) { + LOG.info("Cleaning up temporary network with {}", networkId); + try { + dockerClient.removeNetworkCmd(networkId).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + LOG.info("################################## END OF {} ##################################\n", result.getName()); } @@ -232,4 +243,16 @@ protected String buildImage(File baseDir) throws Exception { .awaitImageId(); } + protected Network findNetwork(List networks, String name) { + + for (Network network : networks) { + if (StringUtils.equals(network.getName(), name)) { + return network; + } + } + + fail("No network found."); + return null; + } + } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 8128bb915..50860789b 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -6,52 +6,8 @@ import java.util.List; import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CommitCmd; -import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; -import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.CreateVolumeCmd; -import com.github.dockerjava.api.command.CreateVolumeResponse; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecStartCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectExecCmd; -import com.github.dockerjava.api.command.InspectImageCmd; -import com.github.dockerjava.api.command.InspectVolumeCmd; -import com.github.dockerjava.api.command.KillContainerCmd; -import com.github.dockerjava.api.command.ListContainersCmd; -import com.github.dockerjava.api.command.ListImagesCmd; -import com.github.dockerjava.api.command.ListVolumesCmd; -import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.api.command.PauseContainerCmd; -import com.github.dockerjava.api.command.PingCmd; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.command.PushImageCmd; -import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.github.dockerjava.api.command.RemoveImageCmd; -import com.github.dockerjava.api.command.RemoveVolumeCmd; -import com.github.dockerjava.api.command.RestartContainerCmd; -import com.github.dockerjava.api.command.SaveImageCmd; -import com.github.dockerjava.api.command.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.command.StatsCmd; -import com.github.dockerjava.api.command.StopContainerCmd; -import com.github.dockerjava.api.command.TagImageCmd; -import com.github.dockerjava.api.command.TopContainerCmd; -import com.github.dockerjava.api.command.UnpauseContainerCmd; -import com.github.dockerjava.api.command.VersionCmd; -import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.BuildResponseItem; /** @@ -68,6 +24,8 @@ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { private List volumeNames = new ArrayList(); + private List networkIds = new ArrayList<>(); + private DockerCmdExecFactory delegate; public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { @@ -349,6 +307,51 @@ public ListVolumesCmd.Exec createListVolumesCmdExec() { return delegate.createListVolumesCmdExec(); } + @Override + public ListNetworksCmd.Exec createListNetworksCmdExec() { + return delegate.createListNetworksCmdExec(); + } + + @Override + public InspectNetworkCmd.Exec createInspectNetworkCmdExec() { + return delegate.createInspectNetworkCmdExec(); + } + + @Override + public CreateNetworkCmd.Exec createCreateNetworkCmdExec() { + + return new CreateNetworkCmd.Exec() { + @Override + public CreateNetworkResponse exec(CreateNetworkCmd command) { + CreateNetworkResponse result = delegate.createCreateNetworkCmdExec().exec(command); + networkIds.add(result.getId()); + return result; + } + }; + } + + @Override + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() { + return new RemoveNetworkCmd.Exec() { + @Override + public Void exec(RemoveNetworkCmd command) { + delegate.createRemoveNetworkCmdExec().exec(command); + networkIds.remove(command.getNetworkId()); + return null; + } + }; + } + + @Override + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() { + return delegate.createConnectToNetworkCmdExec(); + } + + @Override + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { + return delegate.createDisconnectFromNetworkCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } @@ -360,4 +363,8 @@ public List getImageNames() { public List getVolumeNames() { return new ArrayList(volumeNames); } + + public List getNetworkIds() { + return new ArrayList<>(networkIds); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java new file mode 100644 index 000000000..ad051e0bd --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.core.command; + +import java.lang.reflect.Method; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +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; + +@Test(groups = "integration") +public class ConnectToNetworkCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void connectToNetwork() throws InterruptedException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec(); + + dockerClient.connectToNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec(); + + Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec(); + + assertTrue(updatedNetwork.getContainers().containsKey(container.getId())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java new file mode 100644 index 000000000..eefeb535f --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +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; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; + +@Test(groups = "integration") +public class CreateNetworkCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void createNetwork() throws DockerException { + + String networkName = "testNetwork"; + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).exec(); + + assertNotNull(createNetworkResponse.getId()); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); + assertEquals(network.getName(), networkName); + assertEquals(network.getDriver(), "bridge"); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java new file mode 100644 index 000000000..7f94c5a0f --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java @@ -0,0 +1,59 @@ +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.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; + +@Test(groups = "integration") +public class DisconnectFromNetworkCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void disconnectFromNetwork() throws InterruptedException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec(); + + dockerClient.connectToNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec(); + + Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec(); + + assertTrue(updatedNetwork.getContainers().containsKey(container.getId())); + + dockerClient.disconnectFromNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec(); + + updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec(); + + assertFalse(updatedNetwork.getContainers().containsKey(container.getId())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java index cf555a28a..e11ff6839 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java @@ -87,4 +87,19 @@ public void inspectContainerRestartCount() throws DockerException { assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); } + + @Test + public void inspectContainerNetworkSettings() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertFalse(inspectContainerResponse.getNetworkSettings().getHairpinMode()); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 4f88b6317..4e87d5abf 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -6,7 +6,6 @@ import static org.hamcrest.Matchers.not; import java.io.IOException; -import java.io.InputStream; import java.lang.reflect.Method; import java.security.SecureRandom; @@ -47,10 +46,10 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void inspectExecTest() throws IOException { + public void inspectExec() throws IOException { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -70,9 +69,8 @@ public void inspectExecTest() throws IOException { dockerClient.execStartCmd(container.getId()) .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); - InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); - assertThat(first.getExitCode(), is(1)); + assertThat(first.getExitCode(), is(0)); // Create the file dockerClient.execStartCmd(container.getId()) @@ -93,4 +91,26 @@ public void inspectExecTest() throws IOException { assertEquals(containerInfo.getId(), container.getId()); JSONTestHelper.testRoundTrip(containerInfo); } + + @Test(groups = "ignoreInCircleCi") + public void inspectExecNetworkSettings() throws IOException { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + LOG.info("Created exec {}", exec.toString()); + assertThat(exec.getId(), not(isEmptyString())); + + InspectExecResponse inspectExecResponse = dockerClient.inspectExecCmd(exec.getId()).exec(); + assertThat(inspectExecResponse.getExitCode(), is(0)); + + assertNotNull(inspectExecResponse.getContainer().getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java new file mode 100644 index 000000000..9d992eb15 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.exception.DockerException; +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; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +@Test(groups = "integration") +public class InspectNetworkCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void inspectNetwork() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network expected = findNetwork(networks, "bridge"); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(expected.getId()).exec(); + + assertThat(network.getName(), equalTo(expected.getName())); + assertThat(network.getScope(), equalTo(expected.getScope())); + assertThat(network.getDriver(), equalTo(expected.getDriver())); + assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); + assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java new file mode 100644 index 000000000..192adb4bc --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; +import java.util.List; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ListNetworksCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void listNetworks() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network network = findNetwork(networks, "bridge"); + + assertThat(network.getName(), equalTo("bridge")); + assertThat(network.getScope(), equalTo("local")); + assertThat(network.getDriver(), equalTo("bridge")); + assertThat(network.getIpam().getDriver(), equalTo("default")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java new file mode 100644 index 000000000..e1e4e45fe --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java @@ -0,0 +1,76 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.hamcrest.Matcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +@Test(groups = "integration") +public class RemoveNetworkCmdImplTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveNetworkCmdImplTest.class); + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test(groups = "ignoreInCircleCi") + public void removeNetwork() throws DockerException { + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("test-network").exec(); + + LOG.info("Removing network: {}", network.getId()); + dockerClient.removeNetworkCmd(network.getId()).exec(); + + List networks = dockerClient.listNetworksCmd().exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(network.getId())))); + assertThat(networks, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeNetworkCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java new file mode 100644 index 000000000..fa9962826 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; + +@Test(groups = "integration") +public class CreateNetworkCmdExecTest extends AbstractNettyDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void createNetwork() throws DockerException { + + String networkName = "testNetwork"; + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).exec(); + + assertNotNull(createNetworkResponse.getId()); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); + assertEquals(network.getName(), networkName); + assertEquals(network.getDriver(), "bridge"); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java index 31116ef22..f63dda273 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -87,4 +87,19 @@ public void inspectContainerRestartCount() throws DockerException { assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); } + + @Test + public void inspectContainerNetworkSettings() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java index fc3bb089b..efeba6e99 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -97,4 +97,26 @@ public void inspectExecTest() throws IOException { assertEquals(containerInfo.getId(), container.getId()); JSONTestHelper.testRoundTrip(containerInfo); } + + @Test(groups = "ignoreInCircleCi") + public void inspectExecNetworkSettings() throws IOException { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + LOG.info("Created exec {}", exec.toString()); + assertThat(exec.getId(), not(isEmptyString())); + + InspectExecResponse inspectExecResponse = dockerClient.inspectExecCmd(exec.getId()).exec(); + assertThat(inspectExecResponse.getExitCode(), is(0)); + + assertNotNull(inspectExecResponse.getContainer().getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java new file mode 100644 index 000000000..7cbab660b --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +@Test(groups = "integration") +public class InspectNetworkCmdExecTest extends AbstractNettyDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void inspectNetwork() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network expected = findNetwork(networks, "bridge"); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(expected.getId()).exec(); + + assertThat(network.getName(), equalTo(expected.getName())); + assertThat(network.getScope(), equalTo(expected.getScope())); + assertThat(network.getDriver(), equalTo(expected.getDriver())); + assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); + assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java new file mode 100644 index 000000000..8a5d975f0 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; +import java.util.List; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class ListNetworksCmdExecTest extends AbstractNettyDockerClientTest { + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void listNetworks() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network network = findNetwork(networks, "bridge"); + + assertThat(network.getName(), equalTo("bridge")); + assertThat(network.getScope(), equalTo("local")); + assertThat(network.getDriver(), equalTo("bridge")); + assertThat(network.getIpam().getDriver(), equalTo("default")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java new file mode 100644 index 000000000..9fda49f21 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java @@ -0,0 +1,76 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; +import org.hamcrest.Matcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +@Test(groups = "integration") +public class RemoveNetworkCmdExecTest extends AbstractNettyDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveNetworkCmdExecTest.class); + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test(groups = "ignoreInCircleCi") + public void removeNetwork() throws DockerException { + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("test-network").exec(); + + LOG.info("Removing network: {}", network.getId()); + dockerClient.removeNetworkCmd(network.getId()).exec(); + + List networks = dockerClient.listNetworksCmd().exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(network.getId())))); + assertThat(networks, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeNetworkCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +}