diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index 53674cbaa..ca5bf5d3a 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -25,6 +25,9 @@ * @param since * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: * 0 (unfiltered) + * @param until + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries before that timestamp. Default: + * 0 (unfiltered) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -49,6 +52,9 @@ public interface LogContainerCmd extends AsyncDockerCmd @CheckForNull Integer getSince(); + @CheckForNull + Integer getUntil(); + LogContainerCmd withContainerId(@Nonnull String containerId); /** @@ -69,6 +75,8 @@ public interface LogContainerCmd extends AsyncDockerCmd LogContainerCmd withSince(Integer since); + LogContainerCmd withUntil(Integer until); + /** * @throws com.github.dockerjava.api.NotFoundException * No such container diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index aa267fc8f..65e337c5d 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -24,6 +24,9 @@ * @param since * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: * 0 (unfiltered) + * @param until + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries before that timestamp. Default: + * 0 (unfiltered) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -31,7 +34,7 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd resultCal webTarget = webTarget.queryParam("since", command.getSince()); } + if (command.getUntil() != null) { + webTarget = webTarget.queryParam("until", command.getUntil()); + } + webTarget = booleanQueryParam(webTarget, "timestamps", command.hasTimestampsEnabled()); webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java index 37bf5f393..f2b481095 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java @@ -1,15 +1,19 @@ package com.github.dockerjava.cmd; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.StreamType; import com.github.dockerjava.utils.LogContainerTestCallback; +import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.time.OffsetDateTime; import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -197,4 +201,52 @@ public void asyncLogContainerWithSince() throws Exception { assertThat(loggingCallback.toString(), containsString(snippet)); } + + @Test + public void asyncLogContainerWithUntil() throws Exception { + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("/bin/sh", "-c", "while true; do echo hello; sleep 1; done") + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + Thread.sleep(5000); + + int timestamp = (int) (System.currentTimeMillis() / 1000); + + Thread.sleep(2000); + dockerRule.getClient().stopContainerCmd(container.getId()).exec(); + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); + + dockerRule.getClient().logContainerCmd(container.getId()) + .withStdErr(true) + .withStdOut(true) + .withUntil(timestamp) + .exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + String logs_until = loggingCallback.toString(); + assertThat(logs_until, containsString("hello")); + assertEquals(5, StringUtils.countMatches(logs_until,"hello")); + + loggingCallback = new LogContainerTestCallback(); + + dockerRule.getClient().logContainerCmd(container.getId()) + .withStdErr(true) + .withStdOut(true) + .exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + String logs = loggingCallback.toString(); + assertThat(logs, containsString("hello")); + + assertTrue(logs.length() > logs_until.length()); + } + }