From a519128efe26e69abb789460687c4d79268035b2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Dec 2015 22:29:51 +0100 Subject: [PATCH 1/3] Support for volume API --- .../github/dockerjava/api/DockerClient.java | 12 ++++ .../api/command/CreateVolumeCmd.java | 40 +++++++++++ .../api/command/CreateVolumeResponse.java | 40 +++++++++++ .../api/command/DockerCmdExecFactory.java | 9 +++ .../api/command/InspectVolumeCmd.java | 23 +++++++ .../api/command/InspectVolumeResponse.java | 40 +++++++++++ .../api/command/ListVolumesCmd.java | 25 +++++++ .../api/command/ListVolumesResponse.java | 28 ++++++++ .../api/command/RemoveVolumeCmd.java | 30 +++++++++ .../dockerjava/core/DockerClientImpl.java | 28 ++++++++ .../core/command/CreateVolumeCmdImpl.java | 66 +++++++++++++++++++ .../core/command/InspectVolumeCmdImpl.java | 42 ++++++++++++ .../core/command/ListVolumesCmdImpl.java | 32 +++++++++ .../core/command/RemoveVolumeCmdImpl.java | 38 +++++++++++ .../dockerjava/jaxrs/CreateVolumeCmdExec.java | 32 +++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 26 +++++++- .../jaxrs/InspectVolumeCmdExec.java | 29 ++++++++ .../dockerjava/jaxrs/ListVolumesCmdExec.java | 34 ++++++++++ .../dockerjava/jaxrs/RemoveVolumeCmdExec.java | 30 +++++++++ .../netty/DockerCmdExecFactoryImpl.java | 28 ++++++++ .../dockerjava/netty/InvocationBuilder.java | 51 +++++++------- .../netty/exec/CreateVolumeCmdExec.java | 31 +++++++++ .../netty/exec/InspectVolumeCmdExec.java | 30 +++++++++ .../netty/exec/ListVolumesCmdExec.java | 36 ++++++++++ .../netty/exec/RemoveVolumeCmdExec.java | 29 ++++++++ .../core/TestDockerCmdExecFactory.java | 25 ++++++- .../core/command/BuildImageCmdImplTest.java | 3 + .../core/command/CreateVolumeCmdImplTest.java | 53 +++++++++++++++ .../command/InspectVolumeCmdImplTest.java | 56 ++++++++++++++++ .../core/command/ListVolumesCmdImplTest.java | 59 +++++++++++++++++ .../core/command/RemoveVolumeCmdImplTest.java | 65 ++++++++++++++++++ .../netty/AbstractNettyDockerClientTest.java | 3 +- .../netty/exec/BuildImageCmdExecTest.java | 3 + .../netty/exec/CreateVolumeCmdExecTest.java | 53 +++++++++++++++ .../netty/exec/InspectVolumeCmdExecTest.java | 56 ++++++++++++++++ .../netty/exec/ListVolumesCmdExecTest.java | 59 +++++++++++++++++ .../netty/exec/RemoveVolumeCmdExecTest.java | 65 ++++++++++++++++++ 37 files changed, 1280 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 6694be0de..a3a3a9aa0 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -17,6 +17,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; @@ -24,9 +25,11 @@ 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; @@ -34,6 +37,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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -188,6 +192,14 @@ public interface DockerClient extends Closeable { public StatsCmd statsCmd(String containerId); + public CreateVolumeCmd createVolumeCmd(); + + public InspectVolumeCmd inspectVolumeCmd(String name); + + public RemoveVolumeCmd removeVolumeCmd(String name); + + public ListVolumesCmd listVolumesCmd(); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java new file mode 100644 index 000000000..c8850a35c --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import java.util.Map; + +import javax.annotation.CheckForNull; + +public interface CreateVolumeCmd extends SyncDockerCmd { + + @CheckForNull + public String getName(); + + @CheckForNull + public String getDriver(); + + @CheckForNull + public Map getDriverOpts(); + + /** + * @param name + * - The new volume’s name. If not specified, Docker generates a name. + */ + public CreateVolumeCmd withName(String name); + + /** + * @param driver + * - Name of the volume driver to use. Defaults to local for the name. + */ + public CreateVolumeCmd withDriver(String driver); + + /** + * @param driverOpts + * - A mapping of driver options and values. These options are passed directly to the driver and are + * driver specific. + */ + public CreateVolumeCmd withDriverOpts(Map driverOpts); + + public static interface Exec extends DockerCmdSyncExec { + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java new file mode 100644 index 000000000..3a541a0cd --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class CreateVolumeResponse { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + public String getName() { + return name; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} 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 f0b35f58f..008a45005 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -85,6 +85,15 @@ public interface DockerCmdExecFactory extends Closeable { public StatsCmd.Exec createStatsCmdExec(); + public CreateVolumeCmd.Exec createCreateVolumeCmdExec(); + + public InspectVolumeCmd.Exec createInspectVolumeCmdExec(); + + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec(); + + public ListVolumesCmd.Exec createListVolumesCmdExec(); + @Override public void close() throws IOException; + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java new file mode 100644 index 000000000..aa97047dd --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +/** + * Inspect the details of a volume. + * + * @author Marcus Linke + * + */ +public interface InspectVolumeCmd extends SyncDockerCmd { + + public String getName(); + + /** + * @param name + * - The volume’s name. + */ + public InspectVolumeCmd withName(@Nonnull String name); + + public static interface Exec extends DockerCmdSyncExec { + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java new file mode 100644 index 000000000..b5b35c563 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class InspectVolumeResponse { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + public String getName() { + return name; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java new file mode 100644 index 000000000..342b4c034 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; + +/** + * List volumes. + * + * + * @author Marcus Linke + */ +public interface ListVolumesCmd extends SyncDockerCmd { + + @CheckForNull + public String getFilters(); + + /** + * @param filters + * - JSON encoded value of the filters (a map[string][]string) to process on the volumes list. There is + * one available filter: dangling=true + */ + public ListVolumesCmd withFilters(String filters); + + public static interface Exec extends DockerCmdSyncExec { + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java new file mode 100644 index 000000000..c45712d09 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ListVolumesResponse { + + @JsonProperty("Volumes") + private List volumes; + + public List getVolumes() { + return volumes; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java new file mode 100644 index 000000000..f752148c6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a volume. + * + * @author Marcus Linke + */ +public interface RemoveVolumeCmd extends SyncDockerCmd { + + public String getName(); + + public RemoveVolumeCmd withName(@Nonnull String name); + + /** + * @throws NotFoundException + * No such volume + * @throws ConflictException + * Volume is in use and cannot be removed + */ + @Override + public Void exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 62df4aacb..05726f735 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -18,6 +18,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -26,9 +27,11 @@ 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; @@ -36,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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -59,6 +63,7 @@ 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.CreateVolumeCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; @@ -66,9 +71,11 @@ import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.InspectExecCmdImpl; import com.github.dockerjava.core.command.InspectImageCmdImpl; +import com.github.dockerjava.core.command.InspectVolumeCmdImpl; 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.ListVolumesCmdImpl; import com.github.dockerjava.core.command.LogContainerCmdImpl; import com.github.dockerjava.core.command.PauseContainerCmdImpl; import com.github.dockerjava.core.command.PingCmdImpl; @@ -76,6 +83,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.RemoveVolumeCmdImpl; import com.github.dockerjava.core.command.RestartContainerCmdImpl; import com.github.dockerjava.core.command.SaveImageCmdImpl; import com.github.dockerjava.core.command.SearchImagesCmdImpl; @@ -389,6 +397,26 @@ public StatsCmd statsCmd(String containerId) { return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), containerId); } + @Override + public CreateVolumeCmd createVolumeCmd() { + return new CreateVolumeCmdImpl(getDockerCmdExecFactory().createCreateVolumeCmdExec()); + } + + @Override + public InspectVolumeCmd inspectVolumeCmd(String name) { + return new InspectVolumeCmdImpl(getDockerCmdExecFactory().createInspectVolumeCmdExec(), name); + } + + @Override + public RemoveVolumeCmd removeVolumeCmd(String name) { + return new RemoveVolumeCmdImpl(getDockerCmdExecFactory().createRemoveVolumeCmdExec(), name); + } + + @Override + public ListVolumesCmd listVolumesCmd() { + return new ListVolumesCmdImpl(getDockerCmdExecFactory().createListVolumesCmdExec()); + } + @Override public void close() throws IOException { getDockerCmdExecFactory().close(); diff --git a/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java new file mode 100644 index 000000000..13cb0ac83 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java @@ -0,0 +1,66 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; + +/** + * Create a volume. + * + * @author Marcus Linke + */ +public class CreateVolumeCmdImpl extends AbstrDockerCmd implements + CreateVolumeCmd { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("DriverOpts") + private Map driverOpts; + + public CreateVolumeCmdImpl(CreateVolumeCmd.Exec exec) { + super(exec); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDriver() { + return driver; + } + + @Override + public Map getDriverOpts() { + return driverOpts; + } + + @Override + public CreateVolumeCmdImpl withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public CreateVolumeCmdImpl withDriver(String driver) { + checkNotNull(driver, "driver was not specified"); + this.driver = driver; + return this; + } + + @Override + public CreateVolumeCmd withDriverOpts(Map driverOpts) { + checkNotNull(driverOpts, "driverOpts was not specified"); + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java new file mode 100644 index 000000000..c789d91c9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Inspect the details of a volume. + */ +public class InspectVolumeCmdImpl extends AbstrDockerCmd implements + InspectVolumeCmd { + + private String name; + + public InspectVolumeCmdImpl(InspectVolumeCmd.Exec exec, String name) { + super(exec); + withName(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public InspectVolumeCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + /** + * @throws NotFoundException + * No such volume + */ + @Override + public InspectVolumeResponse exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java new file mode 100644 index 000000000..35af8d7b5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; + +/** + * + * @author Marcus Linke + * + */ +public class ListVolumesCmdImpl extends AbstrDockerCmd implements ListVolumesCmd { + + private String filters; + + public ListVolumesCmdImpl(ListVolumesCmd.Exec exec) { + super(exec); + } + + @Override + public String getFilters() { + return filters; + } + + @Override + public ListVolumesCmd withFilters(String filter) { + checkNotNull(filter, "filters have not been specified"); + this.filters = filter; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java new file mode 100644 index 000000000..ee294a130 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a volume. + * + * @author Marcus Linke + */ +public class RemoveVolumeCmdImpl extends AbstrDockerCmd implements RemoveVolumeCmd { + + private String name; + + public RemoveVolumeCmdImpl(RemoveVolumeCmd.Exec exec, String name) { + super(exec); + withName(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public RemoveVolumeCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java new file mode 100644 index 000000000..c71d2297e --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.jaxrs; + +import static javax.ws.rs.client.Entity.entity; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class CreateVolumeCmdExec extends AbstrSyncDockerCmdExec implements + CreateVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateVolumeCmdExec.class); + + public CreateVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateVolumeResponse execute(CreateVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateVolumeResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 62b49d7d7..30bc5e34f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -39,6 +39,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -47,9 +48,11 @@ 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; @@ -57,6 +60,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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -154,7 +158,7 @@ public void init(DockerClientConfig dockerClientConfig) { protocol = "http"; } - if(originalUri.getScheme().equals("unix")) { + if (originalUri.getScheme().equals("unix")) { dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); } else { configureProxy(clientConfig, protocol); @@ -421,6 +425,26 @@ public StatsCmd.Exec createStatsCmdExec() { return new StatsCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return new ListVolumesCmdExec(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/InspectVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java new file mode 100644 index 000000000..9ca2ac02a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.jaxrs; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class InspectVolumeCmdExec extends AbstrSyncDockerCmdExec implements + InspectVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectVolumeCmdExec.class); + + public InspectVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectVolumeResponse execute(InspectVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/{name}").resolveTemplate("name", command.getName()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectVolumeResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java new file mode 100644 index 000000000..2550db31b --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements ListVolumesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListVolumesCmdExec.class); + + public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected ListVolumesResponse execute(ListVolumesCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(ListVolumesResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java new file mode 100644 index 000000000..618a85ed8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.core.DockerClientConfig; + +public class RemoveVolumeCmdExec extends AbstrSyncDockerCmdExec implements + RemoveVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveVolumeCmdExec.class); + + public RemoveVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveVolumeCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes/" + command.getName()); + + 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 865389fef..9ddd51288 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -38,6 +38,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -46,9 +47,11 @@ 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; @@ -56,6 +59,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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -79,6 +83,7 @@ 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.CreateVolumeCmdExec; import com.github.dockerjava.netty.exec.EventsCmdExec; import com.github.dockerjava.netty.exec.ExecCreateCmdExec; import com.github.dockerjava.netty.exec.ExecStartCmdExec; @@ -86,9 +91,11 @@ 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.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.ListVolumesCmdExec; import com.github.dockerjava.netty.exec.LogContainerCmdExec; import com.github.dockerjava.netty.exec.PauseContainerCmdExec; import com.github.dockerjava.netty.exec.PingCmdExec; @@ -96,6 +103,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.RemoveVolumeCmdExec; import com.github.dockerjava.netty.exec.RestartContainerCmdExec; import com.github.dockerjava.netty.exec.SaveImageCmdExec; import com.github.dockerjava.netty.exec.SearchImagesCmdExec; @@ -477,6 +485,26 @@ public StatsCmd.Exec createStatsCmdExec() { return new StatsCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig()); + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return new ListVolumesCmdExec(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/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index a478cf6c1..36fea48eb 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -46,8 +46,8 @@ import com.github.dockerjava.netty.handler.JsonResponseCallbackHandler; /** - * This class is basically a replacement of javax.ws.rs.client.Invocation.Builder to allow simpler - * migration of JAX-RS code to a netty based implementation. + * This class is basically a replacement of javax.ws.rs.client.Invocation.Builder to allow simpler migration of JAX-RS + * code to a netty based implementation. * * @author Marcus Linke */ @@ -236,35 +236,37 @@ public void post(final Object entity, final InputStream stdin, ResultCallback T post(final Object entity, TypeReference typeReference) { @@ -403,7 +405,6 @@ public T post(TypeReference typeReference, InputStream body) { return callback.awaitResult(); } - public void post(TypeReference typeReference, ResultCallback resultCallback, InputStream body) { HttpRequestProvider requestProvider = httpPostRequestProvider(null); diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java new file mode 100644 index 000000000..746e46067 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class CreateVolumeCmdExec extends AbstrSyncDockerCmdExec implements + CreateVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateVolumeCmdExec.class); + + public CreateVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateVolumeResponse execute(CreateVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/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/InspectVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java new file mode 100644 index 000000000..1c3adf47e --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class InspectVolumeCmdExec extends AbstrSyncDockerCmdExec implements + InspectVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectVolumeCmdExec.class); + + public InspectVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectVolumeResponse execute(InspectVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/{name}").resolveTemplate("name", command.getName()); + + 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/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java new file mode 100644 index 000000000..b99dbbf67 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements + ListVolumesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListVolumesCmdExec.class); + + public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected ListVolumesResponse execute(ListVolumesCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java new file mode 100644 index 000000000..baf6eabe1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class RemoveVolumeCmdExec extends AbstrSyncDockerCmdExec implements + RemoveVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveVolumeCmdExec.class); + + public RemoveVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveVolumeCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes/" + command.getName()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + 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 4a96e664f..6045ce56b 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -18,6 +18,7 @@ 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.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -26,9 +27,11 @@ 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; @@ -36,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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -308,6 +312,26 @@ public StatsCmd.Exec createStatsCmdExec() { return delegate.createStatsCmdExec(); } + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return delegate.createCreateVolumeCmdExec(); + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return delegate.createInspectVolumeCmdExec(); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return delegate.createRemoveVolumeCmdExec(); + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return delegate.createListVolumesCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } @@ -315,5 +339,4 @@ public List getContainerNames() { public List getImageNames() { return new ArrayList(imageNames); } - } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index 017186ccd..9623e077f 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -271,6 +271,9 @@ public void testBuildFromPrivateRegistry() throws Exception { dockerClient.startContainerCmd(testregistry.getId()).exec(); + // wait for registry to boot + Thread.sleep(3000); + AuthConfig authConfig = new AuthConfig(); // credentials as configured in /auth/htpasswd diff --git a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java new file mode 100644 index 000000000..c08c55c2c --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CreateVolumeCmdImplTest 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 createVolume() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java new file mode 100644 index 000000000..730246d3d --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java @@ -0,0 +1,56 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.InspectVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class InspectVolumeCmdImplTest 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 inspectVolume() throws DockerException { + + String volumeName = "volume1"; + + dockerClient.createVolumeCmd().withName(volumeName).withDriver("local").exec(); + + InspectVolumeResponse inspectVolumeResponse = dockerClient.inspectVolumeCmd(volumeName).exec(); + + assertThat(inspectVolumeResponse.getName(), equalTo("volume1")); + assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); + assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java new file mode 100644 index 000000000..646f502c8 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ListVolumesCmdImplTest 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 listVolumes() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + ListVolumesResponse listVolumesResponse = dockerClient.listVolumesCmd().exec(); + + assertThat(listVolumesResponse.getVolumes().size(), greaterThanOrEqualTo(1)); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java new file mode 100644 index 000000000..249bf8493 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java @@ -0,0 +1,65 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class RemoveVolumeCmdImplTest 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 removeVolume() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + dockerClient.removeVolumeCmd(volumeName).exec(); + + try { + dockerClient.inspectVolumeCmd(volumeName).exec(); + fail("Expected NotFoundException"); + } catch (NotFoundException e) { + // just ignore + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java index 6dcb435f1..44a541808 100644 --- a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java @@ -12,7 +12,6 @@ public abstract class AbstractNettyDockerClientTest extends AbstractDockerClient @Override protected TestDockerCmdExecFactory initTestDockerCmdExecFactory() { - return new TestDockerCmdExecFactory( - new DockerCmdExecFactoryImpl()); + return new TestDockerCmdExecFactory(new DockerCmdExecFactoryImpl()); } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java index 19b42420e..7fb94fcd4 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -263,6 +263,9 @@ public void testBuildFromPrivateRegistry() throws Exception { dockerClient.startContainerCmd(testregistry.getId()).exec(); + // wait for registry to boot + Thread.sleep(3000); + AuthConfig authConfig = new AuthConfig(); // credentials as configured in /auth/htpasswd diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java new file mode 100644 index 000000000..3e971dc3b --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class CreateVolumeCmdExecTest 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 createVolume() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java new file mode 100644 index 000000000..65f7ff983 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java @@ -0,0 +1,56 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.InspectVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class InspectVolumeCmdExecTest 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 inspectVolume() throws DockerException { + + String volumeName = "volume1"; + + dockerClient.createVolumeCmd().withName(volumeName).withDriver("local").exec(); + + InspectVolumeResponse inspectVolumeResponse = dockerClient.inspectVolumeCmd(volumeName).exec(); + + assertThat(inspectVolumeResponse.getName(), equalTo("volume1")); + assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); + assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java new file mode 100644 index 000000000..bca5ebece --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class ListVolumesCmdExecTest 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 listVolumes() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + ListVolumesResponse listVolumesResponse = dockerClient.listVolumesCmd().exec(); + + assertThat(listVolumesResponse.getVolumes().size(), greaterThanOrEqualTo(1)); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java new file mode 100644 index 000000000..59aafde67 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java @@ -0,0 +1,65 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +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.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class RemoveVolumeCmdExecTest 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 removeVolume() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + dockerClient.removeVolumeCmd(volumeName).exec(); + + try { + dockerClient.inspectVolumeCmd(volumeName).exec(); + fail("Expected NotFoundException"); + } catch (NotFoundException e) { + // just ignore + } + } +} From b8dd91b503398720294a928203a961a6a7243ee5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Dec 2015 23:13:41 +0100 Subject: [PATCH 2/3] Improved volume API tests --- .../dockerjava/netty/InvocationBuilder.java | 4 --- .../client/AbstractDockerClientTest.java | 9 +++++++ .../core/TestDockerCmdExecFactory.java | 25 ++++++++++++++++-- .../core/command/CreateVolumeCmdImplTest.java | 26 +++++++++++++++++-- .../command/InspectVolumeCmdImplTest.java | 9 +++++++ .../netty/exec/CreateVolumeCmdExecTest.java | 20 ++++++++++++++ .../netty/exec/InspectVolumeCmdExecTest.java | 9 +++++++ 7 files changed, 94 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index 36fea48eb..8f1641279 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -378,10 +378,6 @@ private void sendRequest(HttpRequestProvider requestProvider, Channel channel) { channelFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { - if (future.isSuccess()) { - System.err.println("Request success"); - } - } }); } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index cdf7f457e..8751e07e5 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -109,6 +109,15 @@ public void afterMethod(ITestResult result) { } } + for (String volume : dockerCmdExecFactory.getVolumeNames()) { + LOG.info("Cleaning up temporary volume with {}", volume); + try { + dockerClient.removeVolumeCmd(volume).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + LOG.info("################################## END OF {} ##################################\n", result.getName()); } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 6045ce56b..8128bb915 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -19,6 +19,7 @@ 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; @@ -65,6 +66,8 @@ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { private List imageNames = new ArrayList(); + private List volumeNames = new ArrayList(); + private DockerCmdExecFactory delegate; public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { @@ -314,7 +317,14 @@ public StatsCmd.Exec createStatsCmdExec() { @Override public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { - return delegate.createCreateVolumeCmdExec(); + return new CreateVolumeCmd.Exec() { + @Override + public CreateVolumeResponse exec(CreateVolumeCmd command) { + CreateVolumeResponse result = delegate.createCreateVolumeCmdExec().exec(command); + volumeNames.add(command.getName()); + return result; + } + }; } @Override @@ -324,7 +334,14 @@ public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { @Override public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { - return delegate.createRemoveVolumeCmdExec(); + return new RemoveVolumeCmd.Exec() { + @Override + public Void exec(RemoveVolumeCmd command) { + delegate.createRemoveVolumeCmdExec().exec(command); + volumeNames.remove(command.getName()); + return null; + } + }; } @Override @@ -339,4 +356,8 @@ public List getContainerNames() { public List getImageNames() { return new ArrayList(imageNames); } + + public List getVolumeNames() { + return new ArrayList(volumeNames); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java index c08c55c2c..39688b424 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java @@ -43,11 +43,33 @@ public void afterMethod(ITestResult result) { @Test public void createVolume() throws DockerException { - CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) .withDriver("local").exec(); - assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); assertThat(createVolumeResponse.getDriver(), equalTo("local")); assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test + public void createVolumeWithExistingName() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse1 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse1.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse1.getDriver(), equalTo("local")); + assertThat(createVolumeResponse1.getMountpoint(), containsString("/volume1/")); + + CreateVolumeResponse createVolumeResponse2 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse2.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse2.getDriver(), equalTo("local")); + assertThat(createVolumeResponse2.getMountpoint(), equalTo(createVolumeResponse1.getMountpoint())); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java index 730246d3d..c24f173df 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java @@ -15,6 +15,7 @@ import com.github.dockerjava.api.command.InspectVolumeResponse; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -53,4 +54,12 @@ public void inspectVolume() throws DockerException { assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test(expectedExceptions = NotFoundException.class) + public void inspectNonExistentVolume() throws DockerException { + + String volumeName = "non-existing"; + + dockerClient.inspectVolumeCmd(volumeName).exec(); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java index 3e971dc3b..1e1a30b73 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java @@ -50,4 +50,24 @@ public void createVolume() throws DockerException { assertThat(createVolumeResponse.getDriver(), equalTo("local")); assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test + public void createVolumeWithExistingName() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse1 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse1.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse1.getDriver(), equalTo("local")); + assertThat(createVolumeResponse1.getMountpoint(), containsString("/volume1/")); + + CreateVolumeResponse createVolumeResponse2 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse2.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse2.getDriver(), equalTo("local")); + assertThat(createVolumeResponse2.getMountpoint(), equalTo(createVolumeResponse1.getMountpoint())); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java index 65f7ff983..191767f87 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java @@ -15,6 +15,7 @@ import com.github.dockerjava.api.command.InspectVolumeResponse; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @Test(groups = "integration") @@ -53,4 +54,12 @@ public void inspectVolume() throws DockerException { assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test(expectedExceptions = NotFoundException.class) + public void inspectNonExistentVolume() throws DockerException { + + String volumeName = "non-existing"; + + dockerClient.inspectVolumeCmd(volumeName).exec(); + } } From a55a5b3cf7a395b199246f6bba89b9d6785ef94c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 19 Dec 2015 00:04:44 +0100 Subject: [PATCH 3/3] Add newline at eof --- .../java/com/github/dockerjava/api/command/CreateVolumeCmd.java | 2 +- .../com/github/dockerjava/api/command/DockerCmdExecFactory.java | 2 +- .../com/github/dockerjava/api/command/InspectVolumeCmd.java | 2 +- .../java/com/github/dockerjava/api/command/ListVolumesCmd.java | 2 +- .../java/com/github/dockerjava/api/command/RemoveVolumeCmd.java | 2 +- .../com/github/dockerjava/core/command/ListVolumesCmdImpl.java | 2 +- .../java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java | 1 + 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java index c8850a35c..0642cf902 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java @@ -36,5 +36,5 @@ public interface CreateVolumeCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } +} -} \ No newline at end of file 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 008a45005..98de728e8 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -96,4 +96,4 @@ public interface DockerCmdExecFactory extends Closeable { @Override public void close() throws IOException; -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java index aa97047dd..bf08e18b4 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java @@ -20,4 +20,4 @@ public interface InspectVolumeCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java index 342b4c034..f900f1967 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -22,4 +22,4 @@ public interface ListVolumesCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java index f752148c6..ba136af25 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java @@ -27,4 +27,4 @@ public interface RemoveVolumeCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java index 35af8d7b5..af1ca3fae 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -29,4 +29,4 @@ public ListVolumesCmd withFilters(String filter) { this.filters = filter; return this; } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java index 2550db31b..d9d150b17 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -32,3 +32,4 @@ protected ListVolumesResponse execute(ListVolumesCmd command) { return webTarget.request().accept(MediaType.APPLICATION_JSON).get(ListVolumesResponse.class); } } +