diff --git a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java index c999652ec..5fd4effc8 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -11,10 +12,29 @@ public class BuildResponseItem extends ResponseItem { private static final long serialVersionUID = -1252904184236343612L; + private static final String BUILD_SUCCESS = "Successfully built"; + @JsonProperty("stream") private String stream; public String getStream() { return stream; } + + /** + * Returns whether the stream field indicates a successful build operation + */ + @JsonIgnore + public boolean isBuildSuccessIndicated() { + if(getStream() == null) return false; + + return getStream().contains(BUILD_SUCCESS); + } + + @JsonIgnore + public String getImageId() { + if(!isBuildSuccessIndicated()) return null; + + return getStream().replaceFirst(BUILD_SUCCESS, "").trim(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index cb856a115..6b2d46e7f 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -10,4 +11,18 @@ public class PullResponseItem extends ResponseItem { private static final long serialVersionUID = 6316219017613249047L; + /** + * Returns whether the status indicates a successful pull operation + * + * @returns true: status indicates that pull was successful, false: status doesn't indicate a successful pull + */ + @JsonIgnore + public boolean isPullSuccessIndicated() { + if (getStatus() == null) + return false; + + return (getStatus().contains("Download complete") || getStatus().contains("Image is up to date") || getStatus() + .contains("Downloaded newer image")); + } + } diff --git a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java index b97042154..2555271fd 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -9,4 +10,17 @@ public class PushResponseItem extends ResponseItem { private static final long serialVersionUID = 8256977108011295857L; + + /** + * Returns whether the error field indicates an error + * + * @returns true: the error field indicates an error, false: the error field doesn't indicate an error + */ + @JsonIgnore + public boolean isErrorIndicated() { + if (getError() == null) + return false; + + return true; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java index f7c4c502d..3ea625164 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -50,6 +50,14 @@ public String getId() { return id; } + public String getError() { + return error; + } + + public ErrorDetail getErrorDetail() { + return errorDetail; + } + @JsonIgnoreProperties(ignoreUnknown = false) public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java index 40354447f..d94ce1950 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -24,21 +24,22 @@ public abstract class ResultCallbackTemplate, A_RES_T> implements AsyncDockerCmd { - private final static Logger LOGGER = LoggerFactory.getLogger(AbstrAsyncDockerCmd.class); - protected DockerCmdAsyncExec execution; public AbstrAsyncDockerCmd(DockerCmdAsyncExec execution) { diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java new file mode 100644 index 000000000..2822b8e48 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class AttachContainerResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(AttachContainerResultCallback.class); + + @Override + public void onNext(Frame item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java new file mode 100644 index 000000000..9f33f81dc --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -0,0 +1,72 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class BuildImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class); + + private BuildResponseItem latestItem = null; + + @Override + public void onNext(BuildResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails. + */ + public String awaitImageId() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getImageId(); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails or the timeout occurs. + */ + public String awaitImageId(long timeout, TimeUnit timeUnit) { + try { + awaitCompletion(timeout, timeUnit); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getImageId(); + } + + private String getImageId() { + if (latestItem == null || !latestItem.isBuildSuccessIndicated()) { + throw new DockerClientException("Could not build image: " + latestItem.getError()); + } else { + return latestItem.getImageId(); + } + } + +} diff --git a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java new file mode 100644 index 000000000..29efac6ca --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class EventsResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(EventsResultCallback.class); + + @Override + public void onNext(Event item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java new file mode 100644 index 000000000..ffe46baf8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class LogContainerResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(LogContainerResultCallback.class); + + @Override + public void onNext(Frame item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java new file mode 100644 index 000000000..18c33f885 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -0,0 +1,47 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class PullImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class); + + private PullResponseItem latestItem = null; + + @Override + public void onNext(PullResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image to be pulled successful. + * + * @throws DockerClientException + * if the pull fails. + */ + public void awaitSuccess() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + if (latestItem == null || !latestItem.isPullSuccessIndicated()) { + throw new DockerClientException("Could not pull image: " + latestItem.getError()); + } + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java new file mode 100644 index 000000000..afcd16389 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -0,0 +1,47 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class PushImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(PushImageResultCallback.class); + + private PushResponseItem latestItem = null; + + @Override + public void onNext(PushResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image to be pulled successful. + * + * @throws DockerClientException + * if the push fails. + */ + public void awaitSuccess() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + if (latestItem == null || latestItem.isErrorIndicated()) { + throw new DockerClientException("Could not push image: " + latestItem.getError()); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java index fe4514273..05d4f9066 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -18,6 +18,8 @@ public class WrappedResponseInputStream extends InputStream { private InputStream delegate; + private boolean closed = false; + public WrappedResponseInputStream(Response response) { this.response = response; this.delegate = response.readEntity(InputStream.class); @@ -52,6 +54,7 @@ public int available() throws IOException { } public void close() throws IOException { + closed = true; response.close(); delegate.close(); } @@ -68,4 +71,8 @@ public boolean markSupported() { return delegate.markSupported(); } + public boolean isClosed() { + return closed; + } + } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index cc07540f0..8ed9164da 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -2,7 +2,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsString; import java.io.File; import java.io.IOException; @@ -23,17 +22,16 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.PullResponseItem; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.TestDockerCmdExecFactory; -import com.github.dockerjava.core.async.ResultCallbackTemplate; +import com.github.dockerjava.core.command.BuildImageResultCallback; +import com.github.dockerjava.core.command.LogContainerResultCallback; +import com.github.dockerjava.core.command.PullImageResultCallback; import com.google.common.base.Joiner; public abstract class AbstractDockerClientTest extends Assert { @@ -54,7 +52,7 @@ public void beforeTest() throws Exception { LOG.info("Pulling image 'busybox'"); // need to block until image is pulled completely - dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullImageResultCallback()).awaitSuccess(); assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); @@ -187,43 +185,18 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon assertThat(volumes, contains(expectedVolumes)); } - public static class CollectFramesCallback extends CollectStreamItemCallback { - - @Override - public void onNext(Frame frame) { - items.add(frame); - log.append(new String(frame.getPayload())); - } - - } - protected String containerLog(String containerId) throws Exception { - - CollectFramesCallback collectFramesCallback = dockerClient.logContainerCmd(containerId).withStdOut() - .exec(new CollectFramesCallback()); - - collectFramesCallback.awaitCompletion(); - - return collectFramesCallback.toString(); + return dockerClient.logContainerCmd(containerId).withStdOut() + .exec(new LogContainerTestCallback()).awaitCompletion().toString(); } - public static class CollectStreamItemCallback, A_RES_T> extends - ResultCallbackTemplate { - public final List items = new ArrayList(); - + public static class LogContainerTestCallback extends LogContainerResultCallback { protected final StringBuffer log = new StringBuffer(); @Override - public void onError(Throwable throwable) { - throwable.printStackTrace(); - super.onError(throwable); - } - - @Override - public void onNext(A_RES_T item) { - items.add(item); - log.append("" + item); - LOG.info(item.toString()); + public void onNext(Frame frame) { + log.append(new String(frame.getPayload())); + super.onNext(frame); } @Override @@ -232,21 +205,9 @@ public String toString() { } } - public static class BuildLogCallback extends CollectStreamItemCallback { - public String awaitImageId() throws Exception { - awaitCompletion(); - BuildResponseItem item = items.get(items.size() - 1); - assertThat(item.toString(), containsString("Successfully built")); - return item.getStream().replaceFirst("Successfully built", "").trim(); - } - } - - public static class PullResponseCallback extends CollectStreamItemCallback { - - } - protected String buildImage(File baseDir) throws Exception { - return dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + return dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } + } diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java index 04e344056..8fa5b2269 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -57,7 +57,7 @@ public void attachContainerWithoutTTY() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + AttachContainerTestCallback callback = new AttachContainerTestCallback() { @Override public void onNext(Frame frame) { assertEquals(frame.getStreamType(), StreamType.STDOUT); @@ -66,13 +66,9 @@ public void onNext(Frame frame) { }; dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream().withLogs() - .exec(collectFramesCallback); + .exec(callback).awaitCompletion(30, TimeUnit.SECONDS).close(); - collectFramesCallback.awaitCompletion(30, TimeUnit.SECONDS); - - collectFramesCallback.close(); - - assertThat(collectFramesCallback.toString(), containsString(snippet)); + assertThat(callback.toString(), containsString(snippet)); } @Test @@ -90,7 +86,7 @@ public void attachContainerWithTTY() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + AttachContainerTestCallback callback = new AttachContainerTestCallback() { @Override public void onNext(Frame frame) { assertEquals(frame.getStreamType(), StreamType.RAW); @@ -99,16 +95,27 @@ public void onNext(Frame frame) { }; dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream() - .exec(collectFramesCallback); + .exec(callback).awaitCompletion(15, TimeUnit.SECONDS).close(); + + System.out.println("log: " + callback.toString()); - collectFramesCallback.awaitCompletion(15, TimeUnit.SECONDS); + // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); - collectFramesCallback.close(); + assertThat(callback.toString(), containsString("stdout\r\nstderr")); + } - System.out.println("log: " + collectFramesCallback.toString()); + public static class AttachContainerTestCallback extends AttachContainerResultCallback { + private StringBuffer log = new StringBuffer(); - // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); + @Override + public void onNext(Frame item) { + log.append(new String(item.getPayload())); + super.onNext(item); + } - assertThat(collectFramesCallback.toString(), containsString("stdout\r\nstderr")); + @Override + public String toString() { + return log.toString(); + } } } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index 597a90877..6d2b4c805 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -86,7 +86,7 @@ public void testNonstandard2() throws Exception { .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile).withNoCache() - .exec(new BuildLogCallback()).awaitImageId(); + .exec(new BuildImageResultCallback()).awaitImageId(); } @Test @@ -147,13 +147,7 @@ private String dockerfileBuild(File baseDir) throws Exception { } private String execBuild(BuildImageCmd buildImageCmd) throws Exception { - - BuildLogCallback resultCallback = new BuildLogCallback(); - ; - - buildImageCmd.withNoCache().exec(resultCallback); - - String imageId = resultCallback.awaitImageId(); + String imageId = buildImageCmd.withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); // Create container based on image CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec(); @@ -165,7 +159,6 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { dockerClient.waitContainerCmd(container.getId()).exec(); return containerLog(container.getId()); - } @Test(expectedExceptions = { DockerClientException.class }) @@ -173,7 +166,7 @@ public void testDockerfileIgnored() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") .getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } @Test(expectedExceptions = { DockerClientException.class }) @@ -181,7 +174,7 @@ public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testInvalidDockerignorePattern").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } @Test(groups = "ignoreInCircleCi") @@ -193,22 +186,11 @@ public void testDockerIgnore() throws Exception { } @Test - public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { + public void testNetCatDockerfileBuilder() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); - BuildLogCallback resultCallback = new BuildLogCallback(); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(resultCallback); - - resultCallback.awaitCompletion(); - - String imageId = null; - - for (BuildResponseItem item : resultCallback.items) { - String text = item.getStream(); - if (text.startsWith("Successfully built ")) { - imageId = StringUtils.substringBetween(text, "Successfully built ", "\n").trim(); - } - } + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()) + .awaitImageId(); assertNotNull(imageId, "Not successful in build"); diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 3d6df071d..9d9b15fd1 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -9,7 +9,6 @@ import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Image; -import com.github.dockerjava.client.AbstractDockerClientTest.BuildLogCallback; /** * Start and stop a single container for testing. @@ -36,7 +35,7 @@ public void open() throws Exception { LOGGER.info("building {}", directory); dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() - .exec(new BuildLogCallback()).awaitImageId(); + .exec(new BuildImageResultCallback()).awaitImageId(); Image lastCreatedImage = dockerClient.listImagesCmd().exec().get(0); diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index 433940e2e..2d1be184a 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -17,7 +17,6 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { @@ -61,7 +60,7 @@ public void testEventStreamTimeBound() throws Exception { String endTime = getEpochTime(); CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback); @@ -78,7 +77,7 @@ public void testEventStreaming1() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); @@ -96,7 +95,7 @@ public void testEventStreaming2() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); @@ -113,8 +112,8 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventCallbackTest eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) - .exec(new EventCallbackTest(countDownLatch)); + EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + .exec(new EventsTestCallback(countDownLatch)); generateEvents(); @@ -130,7 +129,7 @@ public void testEventStreamingWithFilter() throws Exception { private int generateEvents() throws Exception { String testImage = "busybox"; - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec(); dockerClient.startContainerCmd(container.getId()).exec(); @@ -138,13 +137,13 @@ private int generateEvents() throws Exception { return KNOWN_NUM_EVENTS; } - private class EventCallbackTest extends ResultCallbackTemplate { + private class EventsTestCallback extends EventsResultCallback { private final CountDownLatch countDownLatch; private final List events = new ArrayList(); - public EventCallbackTest(CountDownLatch countDownLatch) { + public EventsTestCallback(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 6be9b2a49..5b1df2241 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -3,6 +3,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -53,16 +54,14 @@ public void canCloseFrameReaderAndReadExpectedLines() throws Exception { private List getLoggingFrames() throws Exception { - AbstractDockerClientTest.CollectFramesCallback collectFramesCallback = new AbstractDockerClientTest.CollectFramesCallback(); + FrameReaderITestCallback collectFramesCallback = new FrameReaderITestCallback(); dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut().withStdErr().withTailAll() // we can't follow stream here as it blocks reading from resulting InputStream infinitely // .withFollowStream() - .exec(collectFramesCallback); + .exec(collectFramesCallback).awaitCompletion(); - collectFramesCallback.awaitCompletion(); - - return collectFramesCallback.items; + return collectFramesCallback.frames; } @Test @@ -94,4 +93,16 @@ public void run() { thread.join(); } + + public static class FrameReaderITestCallback extends LogContainerResultCallback { + + public List frames = new ArrayList(); + + @Override + public void onNext(Frame item) { + frames.add(item); + super.onNext(item); + } + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java index 033c7a709..e41b7736f 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -58,7 +58,7 @@ public void testListContainers() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); @@ -106,7 +106,7 @@ public void testListContainersWithLabelsFilter() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitCompletion(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java index f3c8f0222..6d887f359 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -17,6 +17,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -59,7 +60,7 @@ public void asyncLogContainer() throws Exception { assertThat(exitCode, equalTo(0)); - CollectFramesCallback loggingCallback = new CollectFramesCallback(); + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); @@ -71,7 +72,7 @@ public void asyncLogContainer() throws Exception { @Test public void asyncLogNonExistingContainer() throws Exception { - CollectFramesCallback loggingCallback = new CollectFramesCallback() { + LogContainerTestCallback loggingCallback = new LogContainerTestCallback() { @Override public void onError(Throwable throwable) { @@ -113,19 +114,19 @@ public void asyncMultipleLogContainer() throws Exception { assertThat(exitCode, equalTo(0)); - CollectFramesCallback loggingCallback = new CollectFramesCallback(); + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); - loggingCallback = new CollectFramesCallback(); + loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); - loggingCallback = new CollectFramesCallback(); + loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); @@ -133,4 +134,6 @@ public void asyncMultipleLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } + + } diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 83c433775..10e31e171 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.Matchers.notNullValue; @@ -95,11 +94,7 @@ public void testPullImage() throws Exception { LOG.info("Pulling image: {}", testImage); - PullResponseCallback callback = dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()); - - callback.awaitCompletion(); - - assertThat(callback.toString(), containsString("Download complete")); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); info = dockerClient.infoCmd().exec(); LOG.info("Client info after pull, {}", info.toString()); @@ -116,7 +111,7 @@ public void testPullNonExistingImage() throws Exception { // does not throw an exception // stream needs to be fully read in order to close the underlying connection - dockerClient.pullImageCmd("xvxcv/foo").exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd("xvxcv/foo").exec(new PullImageResultCallback()).awaitCompletion(); } } diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index 23eff6db4..bb42d5b4b 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -16,8 +15,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.PushResponseItem; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -61,28 +60,23 @@ public void pushLatest() throws Exception { String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); // we have to block until image is pushed - dockerClient.pushImageCmd(username + "/busybox").exec(new PushResponseCallback()).awaitCompletion(); + dockerClient.pushImageCmd(username + "/busybox").exec(new PushImageResultCallback()).awaitSuccess(); LOG.info("Removing image: {}", imageId); dockerClient.removeImageCmd(imageId).exec(); - PullResponseCallback pushCallback = dockerClient.pullImageCmd(username + "/busybox") - .exec(new PullResponseCallback()).awaitCompletion(); - - assertThat(pushCallback.toString(), not(containsString("HTTP code: 404"))); + dockerClient.pullImageCmd(username + "/busybox") + .exec(new PullImageResultCallback()).awaitSuccess(); } - @Test + @Test(expectedExceptions = DockerClientException.class) public void pushNonExistentImage() throws Exception { - PushResponseCallback callback = dockerClient.pushImageCmd(username + "/xxx").exec(new PushResponseCallback()) - .awaitCompletion(); + dockerClient.pushImageCmd(username + "/xxx").exec(new PushImageResultCallback()) + .awaitSuccess(); - assertThat(callback.toString(), containsString("error")); - } - - public static class PushResponseCallback extends CollectStreamItemCallback { } + } diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index bea30de0e..c2d4557a4 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -6,7 +6,7 @@ - +