diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 8fe841cce..8c91bf2aa 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -47,6 +47,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; @@ -147,6 +149,8 @@ public interface DockerClient extends Closeable { */ StartContainerCmd startContainerCmd(@Nonnull String containerId); + ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId); + ExecCreateCmd execCreateCmd(@Nonnull String containerId); InspectContainerCmd inspectContainerCmd(@Nonnull String containerId); @@ -159,6 +163,8 @@ public interface DockerClient extends Closeable { ExecStartCmd execStartCmd(@Nonnull String execId); + ResizeExecCmd resizeExecCmd(@Nonnull String execId); + InspectExecCmd inspectExecCmd(@Nonnull String execId); LogContainerCmd logContainerCmd(@Nonnull String containerId); 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 f6cc6b903..718ae3b7e 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -52,8 +52,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/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java new file mode 100644 index 000000000..38780b9b2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +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/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java b/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java new file mode 100644 index 000000000..664f2b343 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +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/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 3abfdbe38..98ec37f41 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -49,6 +49,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; @@ -114,6 +116,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; @@ -341,11 +345,21 @@ public AttachContainerCmd attachContainerCmd(String containerId) { return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); } + @Override + public ResizeContainerCmd resizeContainerCmd(String containerId) { + return new ResizeContainerCmdImpl(getDockerCmdExecFactory().createResizeContainerCmdExec(), containerId); + } + @Override public ExecStartCmd execStartCmd(String execId) { return new ExecStartCmdImpl(getDockerCmdExecFactory().createExecStartCmdExec(), execId); } + @Override + public ResizeExecCmd resizeExecCmd(String execId) { + return new ResizeExecCmdImpl(getDockerCmdExecFactory().createResizeExecCmdExec(), execId); + } + @Override public InspectExecCmd inspectExecCmd(String execId) { return new InspectExecCmdImpl(getDockerCmdExecFactory().createInspectExecCmdExec(), execId); diff --git a/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java new file mode 100644 index 000000000..67aedbacc --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +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; + +@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/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java new file mode 100644 index 000000000..807a20b1e --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +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; + +@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/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java index 4acc89b1c..14ef873e8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java @@ -54,6 +54,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.Exec; +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; @@ -413,11 +415,21 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public 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/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.java new file mode 100644 index 000000000..ccd37511c --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ResizeContainerCmdExec.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.ResizeContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; + +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/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.java new file mode 100644 index 000000000..0b94cd003 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ResizeExecCmdExec.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.ResizeExecCmd; +import com.github.dockerjava.core.DockerClientConfig; + +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/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java index 525043f99..76c51e8e3 100644 --- a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java @@ -64,6 +64,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.Exec; +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; @@ -132,6 +134,8 @@ import com.github.dockerjava.netty.exec.RemoveSwarmNodeCmdExec; import com.github.dockerjava.netty.exec.RemoveVolumeCmdExec; import com.github.dockerjava.netty.exec.RenameContainerCmdExec; +import com.github.dockerjava.netty.exec.ResizeContainerCmdExec; +import com.github.dockerjava.netty.exec.ResizeExecCmdExec; import com.github.dockerjava.netty.exec.RestartContainerCmdExec; import com.github.dockerjava.netty.exec.SaveImageCmdExec; import com.github.dockerjava.netty.exec.SearchImagesCmdExec; @@ -509,11 +513,21 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public 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/src/main/java/com/github/dockerjava/netty/exec/ResizeContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ResizeContainerCmdExec.java new file mode 100644 index 000000000..5612488da --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ResizeContainerCmdExec.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.ResizeContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +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/src/main/java/com/github/dockerjava/netty/exec/ResizeExecCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ResizeExecCmdExec.java new file mode 100644 index 000000000..33fcce06c --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ResizeExecCmdExec.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.ResizeExecCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +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(command); + + return null; + } +} diff --git a/src/test/java/com/github/dockerjava/cmd/ResizeCmdIT.java b/src/test/java/com/github/dockerjava/cmd/ResizeCmdIT.java new file mode 100644 index 000000000..e79134880 --- /dev/null +++ b/src/test/java/com/github/dockerjava/cmd/ResizeCmdIT.java @@ -0,0 +1,54 @@ +package com.github.dockerjava.cmd; + +import static com.github.dockerjava.junit.DockerAssume.assumeNotSwarm; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.security.SecureRandom; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.core.command.ExecStartResultCallback; + +public class ResizeCmdIT extends CmdIT { + private static final Logger LOG = LoggerFactory.getLogger(ResizeCmdIT.class); + + @Test + public void execResize() throws Exception { + assumeNotSwarm("no network in swarm", dockerRule); + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").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(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId()) + .withAttachStdout(true).withTty(true).withCmd("/bin/sh").exec(); + dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).exec( + new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); + dockerRule.getClient().resizeExecCmd(execCreateCmdResponse.getId()).withSize(1024, 1024); + } + + @Test + public void containerResize() throws Exception { + assumeNotSwarm("no network in swarm", dockerRule); + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").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(1024, 1024).exec(); + } +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 77fd775f9..1d286cc2c 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -56,6 +56,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; @@ -267,11 +269,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();