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..0642cf902 --- /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 { + } +} + 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..98de728e8 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..bf08e18b4 --- /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 { + } +} 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..f900f1967 --- /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 { + } +} 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..ba136af25 --- /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 { + } +} 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..af1ca3fae --- /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; + } +} 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..d9d150b17 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -0,0 +1,35 @@ +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..8f1641279 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) { @@ -376,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"); - } - } }); } @@ -403,7 +401,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/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 4a96e664f..8128bb915 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -18,6 +18,8 @@ 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; @@ -26,9 +28,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 +40,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; @@ -61,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) { @@ -308,6 +315,40 @@ public StatsCmd.Exec createStatsCmdExec() { return delegate.createStatsCmdExec(); } + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return new CreateVolumeCmd.Exec() { + @Override + public CreateVolumeResponse exec(CreateVolumeCmd command) { + CreateVolumeResponse result = delegate.createCreateVolumeCmdExec().exec(command); + volumeNames.add(command.getName()); + return result; + } + }; + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return delegate.createInspectVolumeCmdExec(); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return new RemoveVolumeCmd.Exec() { + @Override + public Void exec(RemoveVolumeCmd command) { + delegate.createRemoveVolumeCmdExec().exec(command); + volumeNames.remove(command.getName()); + return null; + } + }; + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return delegate.createListVolumesCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } @@ -316,4 +357,7 @@ 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/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..39688b424 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java @@ -0,0 +1,75 @@ +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 { + + 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/")); + } + + @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 new file mode 100644 index 000000000..c24f173df --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.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.InspectVolumeResponse; +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 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/")); + } + + @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/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..1e1a30b73 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java @@ -0,0 +1,73 @@ +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/")); + } + + @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 new file mode 100644 index 000000000..191767f87 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.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.InspectVolumeResponse; +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 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/")); + } + + @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/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 + } + } +}