Skip to content

Commit fd5da16

Browse files
dmmaxeddumelendez
andauthored
Add signal query argument for Restart Container command (#2186)
Co-authored-by: Eddú Meléndez Gonzales <eddu.melendez@gmail.com>
1 parent 278a3ac commit fd5da16

File tree

5 files changed

+82
-11
lines changed

5 files changed

+82
-11
lines changed

docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@
88
/**
99
* Restart a running container.
1010
*
11-
* @param timeout
12-
* - Timeout in seconds before killing the container. Defaults to 10 seconds.
13-
*
11+
* @param signal - Signal to send to the container as an integer or string (e.g. SIGINT).
12+
* @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds.
1413
*/
1514
public interface RestartContainerCmd extends SyncDockerCmd<Void> {
1615

@@ -20,6 +19,12 @@ public interface RestartContainerCmd extends SyncDockerCmd<Void> {
2019
@CheckForNull
2120
Integer getTimeout();
2221

22+
/**
23+
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42}
24+
*/
25+
@CheckForNull
26+
String getSignal();
27+
2328
RestartContainerCmd withContainerId(@Nonnull String containerId);
2429

2530
/**
@@ -32,9 +37,10 @@ default RestartContainerCmd withtTimeout(Integer timeout) {
3237

3338
RestartContainerCmd withTimeout(Integer timeout);
3439

40+
RestartContainerCmd withSignal(String signal);
41+
3542
/**
36-
* @throws NotFoundException
37-
* No such container
43+
* @throws NotFoundException No such container
3844
*/
3945
@Override
4046
Void exec() throws NotFoundException;

docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public class RemoteApiVersion implements Serializable {
9191
public static final RemoteApiVersion VERSION_1_37 = RemoteApiVersion.create(1, 37);
9292
public static final RemoteApiVersion VERSION_1_38 = RemoteApiVersion.create(1, 38);
9393
public static final RemoteApiVersion VERSION_1_40 = RemoteApiVersion.create(1, 40);
94+
public static final RemoteApiVersion VERSION_1_41 = RemoteApiVersion.create(1, 41);
95+
public static final RemoteApiVersion VERSION_1_42 = RemoteApiVersion.create(1, 42);
9496

9597

9698
/**

docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,22 @@
77
import com.github.dockerjava.api.command.RestartContainerCmd;
88
import com.github.dockerjava.api.exception.NotFoundException;
99

10+
import javax.annotation.CheckForNull;
11+
1012
/**
1113
* Restart a running container.
1214
*
13-
* @param timeout
14-
* - Timeout in seconds before killing the container. Defaults to 10 seconds.
15-
*
15+
* @param signal - Signal to send to the container as an integer or string (e.g. SIGINT).
16+
* @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds.
1617
*/
1718
public class RestartContainerCmdImpl extends AbstrDockerCmd<RestartContainerCmd, Void> implements RestartContainerCmd {
1819

1920
private String containerId;
2021

2122
private Integer timeout = 10;
2223

24+
private String signal;
25+
2326
public RestartContainerCmdImpl(RestartContainerCmd.Exec exec, String containerId) {
2427
super(exec);
2528
withContainerId(containerId);
@@ -35,6 +38,15 @@ public Integer getTimeout() {
3538
return timeout;
3639
}
3740

41+
/**
42+
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42}
43+
*/
44+
@CheckForNull
45+
@Override
46+
public String getSignal() {
47+
return signal;
48+
}
49+
3850
@Override
3951
public RestartContainerCmd withContainerId(String containerId) {
4052
Objects.requireNonNull(containerId, "containerId was not specified");
@@ -50,9 +62,15 @@ public RestartContainerCmd withTimeout(Integer timeout) {
5062
return this;
5163
}
5264

65+
@Override
66+
public RestartContainerCmd withSignal(String signal) {
67+
Objects.requireNonNull(signal, "signal was not specified");
68+
this.signal = signal;
69+
return this;
70+
}
71+
5372
/**
54-
* @throws NotFoundException
55-
* No such container
73+
* @throws NotFoundException No such container
5674
*/
5775
@Override
5876
public Void exec() throws NotFoundException {

docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ protected Void execute(RestartContainerCmd command) {
2424
WebTarget webResource = getBaseResource().path("/containers/{id}/restart").resolveTemplate("id",
2525
command.getContainerId());
2626

27+
if (command.getSignal() != null) {
28+
webResource = webResource.queryParam("signal", command.getSignal());
29+
}
30+
2731
if (command.getTimeout() != null) {
2832
webResource = webResource.queryParam("t", String.valueOf(command.getTimeout()));
2933
}

docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package com.github.dockerjava.cmd;
22

3+
import com.github.dockerjava.api.DockerClient;
34
import com.github.dockerjava.api.command.CreateContainerResponse;
45
import com.github.dockerjava.api.command.InspectContainerResponse;
56
import com.github.dockerjava.api.exception.DockerException;
67
import com.github.dockerjava.api.exception.NotFoundException;
8+
import com.github.dockerjava.core.DefaultDockerClientConfig;
9+
import com.github.dockerjava.core.RemoteApiVersion;
710
import org.junit.Test;
811
import org.slf4j.Logger;
912
import org.slf4j.LoggerFactory;
1013

14+
import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE;
15+
import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual;
1116
import static org.hamcrest.MatcherAssert.assertThat;
17+
import static org.hamcrest.Matchers.emptyString;
1218
import static org.hamcrest.Matchers.equalTo;
1319
import static org.hamcrest.Matchers.is;
14-
import static org.hamcrest.Matchers.emptyString;
1520
import static org.hamcrest.Matchers.not;
21+
import static org.junit.Assume.assumeThat;
1622

1723
public class RestartContainerCmdImplIT extends CmdIT {
1824
public static final Logger LOG = LoggerFactory.getLogger(RestartContainerCmdImplIT.class);
@@ -44,6 +50,41 @@ public void restartContainer() throws DockerException {
4450
dockerRule.getClient().killContainerCmd(container.getId()).exec();
4551
}
4652

53+
@Test
54+
public void restartContainerWithSignal() throws Exception {
55+
assumeThat("API version should be >= 1.42", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_42));
56+
57+
DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
58+
.withApiVersion(RemoteApiVersion.VERSION_1_42)
59+
.withRegistryUrl("https://index.docker.io/v1/")
60+
.build();
61+
try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) {
62+
String expectedUserSignal = "10";
63+
String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; sleep 9999;";
64+
final String containerId = dockerClient
65+
.createContainerCmd(DEFAULT_IMAGE)
66+
.withCmd(
67+
"/bin/sh",
68+
"-c",
69+
String.format(initialCommandWithTrap, expectedUserSignal))
70+
.exec()
71+
.getId();
72+
assertThat(containerId, not(is(emptyString())));
73+
dockerClient.startContainerCmd(containerId).exec();
74+
75+
// Restart container without signal
76+
dockerClient.restartContainerCmd(containerId).exec();
77+
String log = dockerRule.containerLog(containerId);
78+
assertThat(log.trim(), emptyString());
79+
80+
dockerClient.restartContainerCmd(containerId).withSignal(expectedUserSignal).exec();
81+
log = dockerRule.containerLog(containerId);
82+
assertThat(log.trim(), is("exit trapped"));
83+
84+
dockerClient.removeContainerCmd(containerId).withForce(true).withRemoveVolumes(true).exec();
85+
}
86+
}
87+
4788
@Test(expected = NotFoundException.class)
4889
public void restartNonExistingContainer() throws DockerException {
4990

0 commit comments

Comments
 (0)