From cdd29fdc16e77945237b63f950e98f1aa9000648 Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Fri, 10 Nov 2023 11:29:25 -0500 Subject: [PATCH 1/6] Ignore dependency-reduced-pom.xml generated by maven at build time --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 201acaa5f..006641e8c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # Ignore all build/dist directories target +dependency-reduced-pom.xml # Ignore InteliJ Idea project files .idea/ From f18fa411f7f70447ebf4d5f152198ca72a12c244 Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Fri, 10 Nov 2023 11:29:45 -0500 Subject: [PATCH 2/6] Add newly supported StartInterval --- .../dockerjava/api/model/HealthCheck.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index 6c8d425e1..0e41b873f 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -55,6 +55,12 @@ public class HealthCheck extends DockerObject implements Serializable { @JsonProperty("StartPeriod") private Long startPeriod; + /** + * @since 1.44 + */ + @JsonProperty("StartInterval") + private Long startInterval; + public Long getInterval() { return interval; } @@ -111,4 +117,17 @@ public HealthCheck withStartPeriod(Long startPeriod) { this.startPeriod = startPeriod; return this; } + + public Long getStartInterval() { + return startInterval; + } + + /** + * Set startInterval in nanoseconds + * @return this {@link HealthCheck} instance + */ + public HealthCheck withStartInterval(Long startInterval) { + this.startInterval = startInterval; + return this; + } } From 71d683b331c5c17dd85d2dd613e2e471ef7aa377 Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Mon, 13 Nov 2023 23:43:41 -0500 Subject: [PATCH 3/6] Add APIs 43 and 44 --- .../main/java/com/github/dockerjava/core/RemoteApiVersion.java | 2 ++ 1 file changed, 2 insertions(+) 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 57b15b240..373a67332 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 @@ -93,6 +93,8 @@ public class RemoteApiVersion implements Serializable { 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); + public static final RemoteApiVersion VERSION_1_43 = RemoteApiVersion.create(1, 43); + public static final RemoteApiVersion VERSION_1_44 = RemoteApiVersion.create(1, 44); /** From a48de8d3035d0f0884edc6a877c54d7cfd3e6f92 Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Mon, 13 Nov 2023 23:44:14 -0500 Subject: [PATCH 4/6] Add test on the healthcheck API --- .../github/dockerjava/cmd/HealthCmdIT.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java new file mode 100644 index 000000000..656be769e --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java @@ -0,0 +1,86 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.HealthState; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.HealthCheck; +import com.github.dockerjava.core.RemoteApiVersion; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; +import static org.awaitility.Awaitility.await; +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 HealthCmdIT extends CmdIT { + private final Logger LOG = LoggerFactory.getLogger(HealthCmdIT.class); + + @Test + public void healthiness() throws DockerException, Exception { + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(1)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + HealthState healthState = await().atMost(60L, TimeUnit.SECONDS).until( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + return inspectContainerResponse.getState().getHealth(); + }, + Objects::nonNull + ); + + assertThat(healthState.getStatus(), is(equalTo("healthy"))); + } + + @Test + public void healthiness_startInterval() throws Exception { + assumeThat("API version should be >= 1.44", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_44)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(1)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) + .withStartInterval(TimeUnit.SECONDS.toNanos(5)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + HealthState healthState = await().atMost(60L, TimeUnit.SECONDS).until( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + return inspectContainerResponse.getState().getHealth(); + }, + Objects::nonNull + ); + + assertThat(healthState.getStatus(), is(equalTo("healthy"))); + } + +} From 32c151613dd6dd2dff7abb9fcea84e98670a5c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Dec 2023 16:52:35 -0600 Subject: [PATCH 5/6] Fix test --- .../java/com/github/dockerjava/cmd/HealthCmdIT.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java index 656be769e..6103513f4 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java @@ -3,13 +3,13 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.HealthState; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.Duration; import java.util.Arrays; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -27,11 +27,11 @@ public class HealthCmdIT extends CmdIT { private final Logger LOG = LoggerFactory.getLogger(HealthCmdIT.class); @Test - public void healthiness() throws DockerException, Exception { + public void healthiness() { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withCmd("nc", "-l", "-p", "8080") .withHealthcheck(new HealthCheck() - .withTest(Arrays.asList("sh", "-c", "netstat -ltn | grep 8080")) + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) .withInterval(TimeUnit.SECONDS.toNanos(1)) .withTimeout(TimeUnit.MINUTES.toNanos(1)) .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) @@ -42,7 +42,7 @@ public void healthiness() throws DockerException, Exception { assertThat(container.getId(), not(is(emptyString()))); dockerRule.getClient().startContainerCmd(container.getId()).exec(); - HealthState healthState = await().atMost(60L, TimeUnit.SECONDS).until( + HealthState healthState = await().pollInterval(Duration.ofSeconds(5)).atMost(60L, TimeUnit.SECONDS).until( () -> { InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); return inspectContainerResponse.getState().getHealth(); @@ -54,13 +54,13 @@ public void healthiness() throws DockerException, Exception { } @Test - public void healthiness_startInterval() throws Exception { + public void healthiness_startInterval() { assumeThat("API version should be >= 1.44", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_44)); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withCmd("nc", "-l", "-p", "8080") .withHealthcheck(new HealthCheck() - .withTest(Arrays.asList("sh", "-c", "netstat -ltn | grep 8080")) + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) .withInterval(TimeUnit.SECONDS.toNanos(1)) .withTimeout(TimeUnit.MINUTES.toNanos(1)) .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) From 6bed5078ba56a6f92f87e625a11482d2ce3c3b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 25 Jan 2024 16:11:28 -0500 Subject: [PATCH 6/6] Polish --- .../github/dockerjava/cmd/HealthCmdIT.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java index 6103513f4..bdca27572 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java @@ -1,7 +1,7 @@ package com.github.dockerjava.cmd; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.HealthState; +import com.github.dockerjava.api.command.HealthStateLog; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.core.RemoteApiVersion; @@ -9,9 +9,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.Arrays; -import java.util.Objects; +import java.util.List; import java.util.concurrent.TimeUnit; import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; @@ -19,6 +20,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assume.assumeThat; @@ -42,15 +44,12 @@ public void healthiness() { assertThat(container.getId(), not(is(emptyString()))); dockerRule.getClient().startContainerCmd(container.getId()).exec(); - HealthState healthState = await().pollInterval(Duration.ofSeconds(5)).atMost(60L, TimeUnit.SECONDS).until( + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( () -> { InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); - return inspectContainerResponse.getState().getHealth(); - }, - Objects::nonNull + assertThat(inspectContainerResponse.getState().getHealth().getStatus(), is(equalTo("healthy"))); + } ); - - assertThat(healthState.getStatus(), is(equalTo("healthy"))); } @Test @@ -61,10 +60,10 @@ public void healthiness_startInterval() { .withCmd("nc", "-l", "-p", "8080") .withHealthcheck(new HealthCheck() .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) - .withInterval(TimeUnit.SECONDS.toNanos(1)) + .withInterval(TimeUnit.SECONDS.toNanos(5)) .withTimeout(TimeUnit.MINUTES.toNanos(1)) - .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) - .withStartInterval(TimeUnit.SECONDS.toNanos(5)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(2)) + .withStartInterval(TimeUnit.SECONDS.toNanos(1)) .withRetries(10)) .exec(); @@ -72,15 +71,18 @@ public void healthiness_startInterval() { assertThat(container.getId(), not(is(emptyString()))); dockerRule.getClient().startContainerCmd(container.getId()).exec(); - HealthState healthState = await().atMost(60L, TimeUnit.SECONDS).until( + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( () -> { InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); - return inspectContainerResponse.getState().getHealth(); - }, - Objects::nonNull + List healthStateLogs = inspectContainerResponse.getState().getHealth().getLog(); + assertThat(healthStateLogs.size(), is(greaterThanOrEqualTo(2))); + healthStateLogs.forEach(log -> LOG.info("Health log: {}", log.getStart())); + HealthStateLog log1 = healthStateLogs.get(healthStateLogs.size() - 1); + HealthStateLog log2 = healthStateLogs.get(healthStateLogs.size() - 2); + long diff = ChronoUnit.NANOS.between(ZonedDateTime.parse(log2.getStart()), ZonedDateTime.parse(log1.getStart())); + assertThat(diff, is(greaterThanOrEqualTo(inspectContainerResponse.getConfig().getHealthcheck().getInterval()))); + } ); - - assertThat(healthState.getStatus(), is(equalTo("healthy"))); } }