From 4775297de4c26605575a7519d931cef048193526 Mon Sep 17 00:00:00 2001 From: dmmax Date: Mon, 21 Aug 2023 07:03:56 +0200 Subject: [PATCH 1/4] Add signal query argument for Restart Container command --- .../api/command/RestartContainerCmd.java | 13 ++++++---- .../core/command/RestartContainerCmdImpl.java | 25 +++++++++++++++---- .../core/exec/RestartContainerCmdExec.java | 4 +++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 5f60f1125..fe63d9d11 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -8,9 +8,8 @@ /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT). + * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. */ public interface RestartContainerCmd extends SyncDockerCmd { @@ -20,6 +19,9 @@ public interface RestartContainerCmd extends SyncDockerCmd { @CheckForNull Integer getTimeout(); + @CheckForNull + String getSignal(); + RestartContainerCmd withContainerId(@Nonnull String containerId); /** @@ -32,9 +34,10 @@ default RestartContainerCmd withtTimeout(Integer timeout) { RestartContainerCmd withTimeout(Integer timeout); + RestartContainerCmd withSignal(String signal); + /** - * @throws NotFoundException - * No such container + * @throws NotFoundException No such container */ @Override Void exec() throws NotFoundException; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index 03454d6a8..db86b091b 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -7,12 +7,13 @@ import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; +import javax.annotation.CheckForNull; + /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT). + * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. */ public class RestartContainerCmdImpl extends AbstrDockerCmd implements RestartContainerCmd { @@ -20,6 +21,8 @@ public class RestartContainerCmdImpl extends AbstrDockerCmd Date: Mon, 21 Aug 2023 11:15:59 +0200 Subject: [PATCH 2/4] Add integration test for restart container with signal; Add new API versions --- .../api/command/RestartContainerCmd.java | 3 ++ .../dockerjava/core/RemoteApiVersion.java | 2 ++ .../core/command/RestartContainerCmdImpl.java | 3 ++ .../core/exec/RestartContainerCmdExec.java | 8 ++--- .../cmd/RestartContainerCmdImplIT.java | 32 ++++++++++++++++++- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index fe63d9d11..372456813 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -19,6 +19,9 @@ public interface RestartContainerCmd extends SyncDockerCmd { @CheckForNull Integer getTimeout(); + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42} + */ @CheckForNull String getSignal(); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index a38930cb3..57b15b240 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -91,6 +91,8 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_37 = RemoteApiVersion.create(1, 37); public static final RemoteApiVersion VERSION_1_38 = RemoteApiVersion.create(1, 38); public static final RemoteApiVersion VERSION_1_40 = RemoteApiVersion.create(1, 40); + public static final RemoteApiVersion VERSION_1_41 = RemoteApiVersion.create(1, 41); + public static final RemoteApiVersion VERSION_1_42 = RemoteApiVersion.create(1, 42); /** diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index db86b091b..3b1df465b 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -38,6 +38,9 @@ public Integer getTimeout() { return timeout; } + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42} + */ @CheckForNull @Override public String getSignal() { diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java index cb00799dc..42f2579e6 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java @@ -24,14 +24,14 @@ protected Void execute(RestartContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/restart").resolveTemplate("id", command.getContainerId()); - if (command.getTimeout() != null) { - webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); - } - if (command.getSignal() != null) { webResource = webResource.queryParam("signal", command.getSignal()); } + if (command.getTimeout() != null) { + webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); + } + LOGGER.trace("POST: {}", webResource); try { webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index 8017d229f..39bbc121f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -1,17 +1,21 @@ package com.github.dockerjava.cmd; +import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; public class RestartContainerCmdImplIT extends CmdIT { @@ -44,6 +48,32 @@ public void restartContainer() throws DockerException { dockerRule.getClient().killContainerCmd(container.getId()).exec(); } + @Test + public void restartContainerWithSignal() throws Exception { + DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withApiVersion(RemoteApiVersion.VERSION_1_42) + .withRegistryUrl("https://index.docker.io/v1/") + .build(); + try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { + CreateContainerResponse createCommandResponse = dockerClient + .createContainerCmd(DEFAULT_IMAGE) + .withCmd( + "/bin/sh", + "-c", + "trap 'echo \"exit trapped\"; exit 1' 10; sleep 9999;") + .exec(); + final String containerId = createCommandResponse.getId(); + assertThat(containerId, not(is(emptyString()))); + dockerClient.startContainerCmd(containerId).exec(); + + dockerClient.restartContainerCmd(containerId).withSignal("10").exec(); + String log = dockerRule.containerLog(containerId); + assertThat(log.trim(), is("exit trapped")); + + dockerClient.killContainerCmd(containerId).exec(); + } + } + @Test(expected = NotFoundException.class) public void restartNonExistingContainer() throws DockerException { From 0841a7b57a93bf65d14bbfa47184721947dc2e68 Mon Sep 17 00:00:00 2001 From: dmmax Date: Mon, 21 Aug 2023 11:58:02 +0200 Subject: [PATCH 3/4] Prevent running test if API is lower than 1.42 --- .../cmd/RestartContainerCmdImplIT.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index 39bbc121f..b321d32ae 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; +import static com.github.dockerjava.utils.TestUtils.getVersion; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; @@ -55,22 +56,33 @@ public void restartContainerWithSignal() throws Exception { .withRegistryUrl("https://index.docker.io/v1/") .build(); try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { - CreateContainerResponse createCommandResponse = dockerClient + if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)) { + LOG.info("API version is less than 1.42. Skipping test."); + return; + } + String expectedUserSignal = "10"; + String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; sleep 9999;"; + final String containerId = dockerClient .createContainerCmd(DEFAULT_IMAGE) .withCmd( "/bin/sh", "-c", - "trap 'echo \"exit trapped\"; exit 1' 10; sleep 9999;") - .exec(); - final String containerId = createCommandResponse.getId(); + String.format(initialCommandWithTrap, expectedUserSignal)) + .exec() + .getId(); assertThat(containerId, not(is(emptyString()))); dockerClient.startContainerCmd(containerId).exec(); - dockerClient.restartContainerCmd(containerId).withSignal("10").exec(); + // Restart container without signal + dockerClient.restartContainerCmd(containerId).exec(); String log = dockerRule.containerLog(containerId); + assertThat(log.trim(), emptyString()); + + dockerClient.restartContainerCmd(containerId).withSignal(expectedUserSignal).exec(); + log = dockerRule.containerLog(containerId); assertThat(log.trim(), is("exit trapped")); - dockerClient.killContainerCmd(containerId).exec(); + dockerClient.removeContainerCmd(containerId).withForce(true).withRemoveVolumes(true).exec(); } } From eaee35752194cad5e799124afd63827304dd47f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 27 Oct 2023 15:26:26 -0600 Subject: [PATCH 4/4] Use assumeThat --- .../github/dockerjava/cmd/RestartContainerCmdImplIT.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index b321d32ae..ac2415281 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -12,12 +12,13 @@ import org.slf4j.LoggerFactory; import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; -import static com.github.dockerjava.utils.TestUtils.getVersion; +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; public class RestartContainerCmdImplIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(RestartContainerCmdImplIT.class); @@ -51,15 +52,13 @@ public void restartContainer() throws DockerException { @Test public void restartContainerWithSignal() throws Exception { + assumeThat("API version should be >= 1.42", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)); + DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() .withApiVersion(RemoteApiVersion.VERSION_1_42) .withRegistryUrl("https://index.docker.io/v1/") .build(); try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { - if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)) { - LOG.info("API version is less than 1.42. Skipping test."); - return; - } String expectedUserSignal = "10"; String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; sleep 9999;"; final String containerId = dockerClient