From 3ddc2c1691791f62a03c6de9ab609eff031509a0 Mon Sep 17 00:00:00 2001 From: creaink <455372644@qq.com> Date: Tue, 15 Oct 2019 10:56:23 +0800 Subject: [PATCH 1/4] Add resize container and exec command --- .../github/dockerjava/api/DockerClient.java | 6 ++ .../api/command/DockerCmdExecFactory.java | 4 ++ .../api/command/ResizeContainerCmd.java | 31 ++++++++++ .../dockerjava/api/command/ResizeExecCmd.java | 30 +++++++++ .../core/AbstractDockerCmdExecFactory.java | 14 +++++ .../dockerjava/core/DockerClientImpl.java | 14 +++++ .../core/command/ResizeContainerCmdImpl.java | 61 ++++++++++++++++++ .../core/command/ResizeExecCmdImpl.java | 62 +++++++++++++++++++ .../core/exec/ResizeContainerCmdExec.java | 30 +++++++++ .../core/exec/ResizeExecCmdExec.java | 31 ++++++++++ .../jaxrs/JerseyDockerCmdExecFactory.java | 12 ++++ .../jaxrs/ResizeContainerCmdExec.java | 31 ++++++++++ .../dockerjava/jaxrs/ResizeExecCmdExec.java | 31 ++++++++++ .../dockerjava/cmd/ResizeContainerCmdIT.java | 32 ++++++++++ .../dockerjava/cmd/ResizeExecCmdIT.java | 55 ++++++++++++++++ .../core/TestDockerCmdExecFactory.java | 12 ++++ 16 files changed, 456 insertions(+) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeContainerCmdExec.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeExecCmdExec.java create mode 100644 docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java create mode 100644 docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java index 7762be0a7..37b1d969c 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -54,6 +54,8 @@ import com.github.dockerjava.api.command.RemoveServiceCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -158,6 +160,8 @@ public interface DockerClient extends Closeable { ExecCreateCmd execCreateCmd(@Nonnull String containerId); + ResizeExecCmd resizeExecCmd(@Nonnull String execId); + InspectContainerCmd inspectContainerCmd(@Nonnull String containerId); RemoveContainerCmd removeContainerCmd(@Nonnull String containerId); @@ -235,6 +239,8 @@ public interface DockerClient extends Closeable { RestartContainerCmd restartContainerCmd(@Nonnull String containerId); + ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId); + CommitCmd commitCmd(@Nonnull String containerId); BuildImageCmd buildImageCmd(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 06cf8eae0..aeed3347e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -47,8 +47,12 @@ public interface DockerCmdExecFactory extends Closeable { AttachContainerCmd.Exec createAttachContainerCmdExec(); + ResizeContainerCmd.Exec createResizeContainerCmdExec(); + ExecStartCmd.Exec createExecStartCmdExec(); + ResizeExecCmd.Exec createResizeExecCmdExec(); + InspectExecCmd.Exec createInspectExecCmdExec(); LogContainerCmd.Exec createLogContainerCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java new file mode 100644 index 000000000..3fcfd2af5 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface ResizeContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + Integer getHeight(); + + Integer getWidth(); + + ResizeContainerCmd withContainerId(@Nonnull String execId); + + ResizeContainerCmd withSize(int height, int width); + + /** + * @throws NotFoundException + * No such container instance + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java new file mode 100644 index 000000000..ae2d69da6 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface ResizeExecCmd extends SyncDockerCmd { + @CheckForNull + String getExecId(); + + Integer getHeight(); + + Integer getWidth(); + + ResizeExecCmd withExecId(@Nonnull String execId); + + ResizeExecCmd withSize(int height, int width); + + /** + * @throws NotFoundException + * No such exec instance + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java index 34fdceb37..d6694f1fe 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java @@ -57,6 +57,8 @@ import com.github.dockerjava.api.command.RemoveSwarmNodeCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -91,6 +93,8 @@ import com.github.dockerjava.core.exec.EventsCmdExec; import com.github.dockerjava.core.exec.ExecCreateCmdExec; import com.github.dockerjava.core.exec.ExecStartCmdExec; +import com.github.dockerjava.core.exec.ResizeContainerCmdExec; +import com.github.dockerjava.core.exec.ResizeExecCmdExec; import com.github.dockerjava.core.exec.InfoCmdExec; import com.github.dockerjava.core.exec.InitializeSwarmCmdExec; import com.github.dockerjava.core.exec.InspectContainerCmdExec; @@ -277,11 +281,21 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ResizeContainerCmd.Exec createResizeContainerCmdExec() { + return new ResizeContainerCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public ExecStartCmd.Exec createExecStartCmdExec() { return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ResizeExecCmd.Exec createResizeExecCmdExec() { + return new ResizeExecCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public InspectExecCmd.Exec createInspectExecCmdExec() { return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 3f06ec0da..90ed14661 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -56,6 +56,8 @@ import com.github.dockerjava.api.command.RemoveServiceCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -131,6 +133,8 @@ import com.github.dockerjava.core.command.RemoveServiceCmdImpl; import com.github.dockerjava.core.command.RemoveVolumeCmdImpl; import com.github.dockerjava.core.command.RenameContainerCmdImpl; +import com.github.dockerjava.core.command.ResizeContainerCmdImpl; +import com.github.dockerjava.core.command.ResizeExecCmdImpl; import com.github.dockerjava.core.command.RestartContainerCmdImpl; import com.github.dockerjava.core.command.SaveImageCmdImpl; import com.github.dockerjava.core.command.SearchImagesCmdImpl; @@ -343,6 +347,11 @@ public ExecCreateCmd execCreateCmd(String containerId) { return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); } + @Override + public ResizeExecCmd resizeExecCmd(@Nonnull String execId) { + return new ResizeExecCmdImpl(getDockerCmdExecFactory().createResizeExecCmdExec(), execId); + } + @Override public RemoveContainerCmd removeContainerCmd(String containerId) { return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId); @@ -421,6 +430,11 @@ public RestartContainerCmd restartContainerCmd(String containerId) { return new RestartContainerCmdImpl(getDockerCmdExecFactory().createRestartContainerCmdExec(), containerId); } + @Override + public ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId) { + return new ResizeContainerCmdImpl(getDockerCmdExecFactory().createResizeContainerCmdExec(), containerId); + } + @Override public CommitCmd commitCmd(String containerId) { return new CommitCmdImpl(getDockerCmdExecFactory().createCommitCmdExec(), containerId); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java new file mode 100644 index 000000000..7a74673a8 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.exception.NotFoundException; + +import static com.google.common.base.Preconditions.checkNotNull; + +@JsonInclude(Include.NON_NULL) +public class ResizeContainerCmdImpl extends AbstrDockerCmd implements ResizeContainerCmd { + + private String containerId; + + private Integer height; + + private Integer width; + + public ResizeContainerCmdImpl(ResizeContainerCmd.Exec exec, String execId) { + super(exec); + withContainerId(execId); + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public Integer getHeight() { + return height; + } + + @Override + public Integer getWidth() { + return width; + } + + @Override + public ResizeContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public ResizeContainerCmd withSize(int height, int width) { + this.height = height; + this.width = width; + return this; + } + + /** + * @throws NotFoundException + * No such exec instance + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java new file mode 100644 index 000000000..5f63a257c --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.github.dockerjava.api.command.ResizeExecCmd; +import com.github.dockerjava.api.exception.NotFoundException; + +import static com.google.common.base.Preconditions.checkNotNull; + +@JsonInclude(Include.NON_NULL) +public class ResizeExecCmdImpl extends AbstrDockerCmd implements ResizeExecCmd { + + private String execId; + + private Integer height; + + private Integer width; + + public ResizeExecCmdImpl(ResizeExecCmd.Exec exec, String execId) { + super(exec); + withExecId(execId); + } + + @Override + public String getExecId() { + return execId; + } + + @Override + public Integer getHeight() { + return height; + } + + @Override + public Integer getWidth() { + return width; + } + + @Override + public ResizeExecCmd withExecId(String execId) { + checkNotNull(execId, "execId was not specified"); + this.execId = execId; + return this; + } + + @Override + public ResizeExecCmd withSize(int height, int width) { + this.height = height; + this.width = width; + return this; + } + + /** + * @throws NotFoundException + * No such exec instance + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } + +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeContainerCmdExec.java new file mode 100644 index 000000000..c31b05094 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeContainerCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.core.exec; + +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.MediaType; +import com.github.dockerjava.core.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResizeContainerCmdExec extends AbstrSyncDockerCmdExec implements ResizeContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResizeContainerCmdExec.class); + + public ResizeContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ResizeContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/resize") + .resolveTemplate("id", command.getContainerId()).queryParam("h", command.getHeight()) + .queryParam("w", command.getWidth()); + + LOGGER.trace("POST: {}", webResource); + + webResource.request().accept(MediaType.APPLICATION_JSON).post(command); + + return null; + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeExecCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeExecCmdExec.java new file mode 100644 index 000000000..ea9d3eb12 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ResizeExecCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.core.exec; + +import com.github.dockerjava.api.command.ResizeExecCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.MediaType; +import com.github.dockerjava.core.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ResizeExecCmdExec extends AbstrSyncDockerCmdExec implements ResizeExecCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResizeExecCmdExec.class); + + public ResizeExecCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ResizeExecCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/resize").resolveTemplate("id", + command.getExecId()).queryParam("h", command.getHeight()).queryParam("w", command.getWidth()); + + LOGGER.trace("POST: {}", webResource); + + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } + +} diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java index 158a93706..ffed687a6 100644 --- a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java @@ -23,6 +23,8 @@ import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.command.InfoCmd; import com.github.dockerjava.api.command.InitializeSwarmCmd; import com.github.dockerjava.api.command.InspectContainerCmd; @@ -425,11 +427,21 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ResizeContainerCmd.Exec createResizeContainerCmdExec() { + return new ResizeContainerCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public ExecStartCmd.Exec createExecStartCmdExec() { return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ResizeExecCmd.Exec createResizeExecCmdExec() { + return new ResizeExecCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public InspectExecCmd.Exec createInspectExecCmdExec() { return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java new file mode 100644 index 000000000..0151314f8 --- /dev/null +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class ResizeContainerCmdExec extends AbstrSyncDockerCmdExec implements ResizeContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResizeContainerCmdExec.class); + + public ResizeContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ResizeContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/resize") + .resolveTemplate("id", command.getContainerId()).queryParam("h", command.getHeight()) + .queryParam("w", command.getWidth()); + + LOGGER.trace("POST: {}", webResource); + + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + + return null; + } +} diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java new file mode 100644 index 000000000..8c0356a18 --- /dev/null +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ResizeExecCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class ResizeExecCmdExec extends AbstrSyncDockerCmdExec implements ResizeExecCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResizeExecCmdExec.class); + + public ResizeExecCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ResizeExecCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/resize").resolveTemplate("id", + command.getExecId()).queryParam("h", command.getHeight()).queryParam("w", command.getWidth()); + + LOGGER.trace("POST: {}", webResource); + + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + + return null; + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java new file mode 100644 index 000000000..3701f9c23 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.security.SecureRandom; + +import static com.github.dockerjava.junit.DockerRule.DEFAULT_IMAGE; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +public class ResizeContainerCmdIT extends CmdIT { + private static final Logger LOG = LoggerFactory.getLogger(ResizeContainerCmdIT.class); + + @Test + public void resizeExecTest() { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withUser("root") + .withCmd("sh").withName(containerName).withTty(true).withStdinOpen(true).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + dockerRule.getClient().resizeContainerCmd(container.getId()).withSize(30, 120).exec(); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java new file mode 100644 index 000000000..d5acd5d6f --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.core.command.ExecStartResultCallback; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.security.SecureRandom; + +import static com.github.dockerjava.junit.DockerRule.DEFAULT_IMAGE; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +public class ResizeExecCmdIT extends CmdIT { + private static final Logger LOG = LoggerFactory.getLogger(ResizeExecCmdIT.class); + + @Test + public void resizeExecTest() { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withUser("root") + .withCmd("sh").withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId()).withTty(true) + .withAttachStdout(true).withAttachStderr(true).withCmd("sh").exec(); + + final ExecStartResultCallback execStartResultCallback = new ExecStartResultCallback(System.out, System.err); + + Thread execThread = new Thread(new Runnable() { + @Override + public void run() { + try { + execStartResultCallback.awaitCompletion(); + } catch (InterruptedException ignored) { + } + } + }); + + dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).exec(execStartResultCallback); + execThread.start(); + + dockerRule.getClient().resizeExecCmd(execCreateCmdResponse.getId()).withSize(30, 120).exec(); + + execThread.interrupt(); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/docker-java/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index a052e0d58..0602fc148 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -61,6 +61,8 @@ import com.github.dockerjava.api.command.RemoveSwarmNodeCmd; import com.github.dockerjava.api.command.RemoveVolumeCmd; import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -255,11 +257,21 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return delegate.createAttachContainerCmdExec(); } + @Override + public ResizeContainerCmd.Exec createResizeContainerCmdExec() { + return delegate.createResizeContainerCmdExec(); + } + @Override public ExecStartCmd.Exec createExecStartCmdExec() { return delegate.createExecStartCmdExec(); } + @Override + public ResizeExecCmd.Exec createResizeExecCmdExec() { + return delegate.createResizeExecCmdExec(); + } + @Override public InspectExecCmd.Exec createInspectExecCmdExec() { return delegate.createInspectExecCmdExec(); From d2a134ff94e67f85ef21c4f7339421d38476b190 Mon Sep 17 00:00:00 2001 From: Creaink Date: Fri, 29 May 2020 18:13:18 +0800 Subject: [PATCH 2/4] Apply suggestions from code review fix code style Co-authored-by: Sergei Egorov --- .../com/github/dockerjava/api/command/ResizeContainerCmd.java | 3 +-- .../java/com/github/dockerjava/api/command/ResizeExecCmd.java | 3 +-- .../dockerjava/core/command/ResizeContainerCmdImpl.java | 4 +--- .../com/github/dockerjava/core/command/ResizeExecCmdImpl.java | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java index 3fcfd2af5..fef0087ed 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java @@ -19,8 +19,7 @@ public interface ResizeContainerCmd extends SyncDockerCmd { ResizeContainerCmd withSize(int height, int width); /** - * @throws NotFoundException - * No such container instance + * @throws NotFoundException no such container instance */ @Override Void exec() throws NotFoundException; diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java index ae2d69da6..5910705e0 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java @@ -18,8 +18,7 @@ public interface ResizeExecCmd extends SyncDockerCmd { ResizeExecCmd withSize(int height, int width); /** - * @throws NotFoundException - * No such exec instance + * @throws NotFoundException no such exec instance */ @Override Void exec() throws NotFoundException; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java index 7a74673a8..82b98b19e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java @@ -7,7 +7,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -@JsonInclude(Include.NON_NULL) public class ResizeContainerCmdImpl extends AbstrDockerCmd implements ResizeContainerCmd { private String containerId; @@ -51,8 +50,7 @@ public ResizeContainerCmd withSize(int height, int width) { } /** - * @throws NotFoundException - * No such exec instance + * @throws NotFoundException no such exec instance */ @Override public Void exec() throws NotFoundException { diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java index 5f63a257c..59bac0981 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java @@ -7,7 +7,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -@JsonInclude(Include.NON_NULL) public class ResizeExecCmdImpl extends AbstrDockerCmd implements ResizeExecCmd { private String execId; @@ -51,8 +50,7 @@ public ResizeExecCmd withSize(int height, int width) { } /** - * @throws NotFoundException - * No such exec instance + * @throws NotFoundException no such exec instance */ @Override public Void exec() throws NotFoundException { From aec63643321efabce197dfb7726bf16ac4265229 Mon Sep 17 00:00:00 2001 From: Creaink <455372644@qq.com> Date: Sat, 6 Jun 2020 00:20:24 +0800 Subject: [PATCH 3/4] remove DEFAULT_IMAGE in resize exec --- .../java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java | 3 +-- .../test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java index 3701f9c23..a7d29bb0e 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java @@ -7,7 +7,6 @@ import java.security.SecureRandom; -import static com.github.dockerjava.junit.DockerRule.DEFAULT_IMAGE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -19,7 +18,7 @@ public class ResizeContainerCmdIT extends CmdIT { public void resizeExecTest() { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withUser("root") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withUser("root") .withCmd("sh").withName(containerName).withTty(true).withStdinOpen(true).exec(); LOG.info("Created container {}", container.toString()); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java index f9ff3e82a..12ebf2d09 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java @@ -10,7 +10,6 @@ import java.security.SecureRandom; import java.util.concurrent.TimeUnit; -import static com.github.dockerjava.junit.DockerRule.DEFAULT_IMAGE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -22,7 +21,7 @@ public class ResizeExecCmdIT extends CmdIT { public void resizeExecTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withUser("root") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withUser("root") .withCmd("sleep", "9999").withName(containerName).exec(); LOG.info("Created container {}", container.toString()); From e475e309be37cd604feb95421e1db6d63cac6fd4 Mon Sep 17 00:00:00 2001 From: Creaink <455372644@qq.com> Date: Sat, 6 Jun 2020 12:37:30 +0800 Subject: [PATCH 4/4] add validation of resize exec test case --- .../dockerjava/cmd/ResizeContainerCmdIT.java | 24 +++++++++----- .../dockerjava/cmd/ResizeExecCmdIT.java | 33 +++++++++---------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java index a7d29bb0e..eeb79b2ff 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeContainerCmdIT.java @@ -6,26 +6,34 @@ import org.slf4j.LoggerFactory; import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.equalTo; public class ResizeContainerCmdIT extends CmdIT { private static final Logger LOG = LoggerFactory.getLogger(ResizeContainerCmdIT.class); + private static final int TTY_HEIGHT = 30; + private static final int TTY_WIDTH = 120; + @Test - public void resizeExecTest() { + public void resizeContainerTtyTest() { String containerName = "generated_" + new SecureRandom().nextInt(); + // wait until tty size changed to target size CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withUser("root") - .withCmd("sh").withName(containerName).withTty(true).withStdinOpen(true).exec(); + .withCmd("sh", "-c", String.format("until stty size | grep '%d %d'; do : ; done", TTY_HEIGHT, TTY_WIDTH)) + .withName(containerName).withTty(true).withStdinOpen(true).exec(); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + dockerRule.getClient().resizeContainerCmd(container.getId()).withSize(TTY_HEIGHT, TTY_WIDTH).exec(); - LOG.info("Created container {}", container.toString()); + int exitCode = dockerRule.getClient().waitContainerCmd(container.getId()).start() + .awaitStatusCode(10, TimeUnit.SECONDS); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Container exit code: {}", exitCode); - dockerRule.getClient().startContainerCmd(container.getId()).exec(); - dockerRule.getClient().resizeContainerCmd(container.getId()).withSize(30, 120).exec(); + assertThat(exitCode, equalTo(0)); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java index 12ebf2d09..9e5c9b65f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ResizeExecCmdIT.java @@ -11,41 +11,38 @@ import java.util.concurrent.TimeUnit; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.equalTo; + public class ResizeExecCmdIT extends CmdIT { private static final Logger LOG = LoggerFactory.getLogger(ResizeExecCmdIT.class); + private static final int TTY_HEIGHT = 30; + private static final int TTY_WIDTH = 120; + @Test - public void resizeExecTest() throws Exception { + public void resizeExecInstanceTtyTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withUser("root") .withCmd("sleep", "9999").withName(containerName).exec(); - LOG.info("Created container {}", container.toString()); - - assertThat(container.getId(), not(isEmptyString())); - dockerRule.getClient().startContainerCmd(container.getId()).exec(); + // wait until tty size changed to target size ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId()).withTty(true) - .withAttachStdout(true).withAttachStderr(true).withCmd("top").exec(); + .withAttachStdout(true).withAttachStderr(true) + .withCmd("sh", "-c", String.format("until stty size | grep '%d %d'; do : ; done", TTY_HEIGHT, TTY_WIDTH)).exec(); final ExecStartResultCallback execStartResultCallback = new ExecStartResultCallback(System.out, System.err); - Thread execThread = new Thread(() -> { - try { - execStartResultCallback.awaitCompletion(); - } catch (InterruptedException ignored) { - } - }); + dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).exec(execStartResultCallback).awaitStarted(); + + dockerRule.getClient().resizeExecCmd(execCreateCmdResponse.getId()).withSize(TTY_HEIGHT, TTY_WIDTH).exec(); - dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).exec(execStartResultCallback); - execThread.start(); - Thread.sleep(TimeUnit.SECONDS.toMillis(3)); + // time out, exec instance resize failed + boolean waitResult = execStartResultCallback.awaitCompletion(10, TimeUnit.SECONDS); - dockerRule.getClient().resizeExecCmd(execCreateCmdResponse.getId()).withSize(30, 120).exec(); + assertThat(waitResult, equalTo(true)); } }