diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index ef16085bb..cd276ec16 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -44,8 +44,11 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.api.model.PushResponseItem; import com.github.dockerjava.api.model.Statistics; // https://godoc.org/github.com/fsouza/go-dockerclient @@ -114,13 +117,13 @@ public interface DockerClient extends Closeable { public WaitContainerCmd waitContainerCmd(String containerId); - public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback); + public AttachContainerCmd attachContainerCmd(String containerId); public ExecStartCmd execStartCmd(String containerId); public InspectExecCmd inspectExecCmd(String execId); - public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback); + public LogContainerCmd logContainerCmd(String containerId); public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); @@ -148,9 +151,9 @@ public interface DockerClient extends Closeable { public UnpauseContainerCmd unpauseContainerCmd(String containerId); - public EventsCmd eventsCmd(ResultCallback resultCallback); + public EventsCmd eventsCmd(); - public StatsCmd statsCmd(ResultCallback resultCallback); + public StatsCmd statsCmd(); @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index fc3e5985e..1eb7ebce1 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -5,7 +5,7 @@ /** * Result callback */ -public interface ResultCallback extends Closeable { +public interface ResultCallback extends Closeable { /** * Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the * processing @@ -13,7 +13,7 @@ public interface ResultCallback extends Closeable { void onStart(Closeable closeable); /** Called when an async result event occurs */ - void onNext(RES_T object); + void onNext(A_RES_T object); /** Called when an exception occurs while processing */ void onError(Throwable throwable); diff --git a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java index 4745fae18..fb1b894d0 100644 --- a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java @@ -11,10 +11,9 @@ * @author marcus * */ -public interface AsyncDockerCmd, A_RES_T, RES_T> extends DockerCmd { +public interface AsyncDockerCmd, A_RES_T> extends DockerCmd { - public ResultCallback getResultCallback(); - public CMD_T withResultCallback(ResultCallback resultCallback); + public > T exec(T resultCallback); } diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 3261be28c..f837c89c5 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -3,7 +3,6 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Frame; /** @@ -21,7 +20,7 @@ * @param timestamps * - true or false, if true, print timestamps for every log line. Defaults to false. */ -public interface AttachContainerCmd extends AsyncDockerCmd { +public interface AttachContainerCmd extends AsyncDockerCmd { public String getContainerId(); @@ -63,16 +62,7 @@ public interface AttachContainerCmd extends AsyncDockerCmd { + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index c84fcb3b9..26e05c1e6 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -5,11 +5,11 @@ import com.github.dockerjava.api.model.AuthResponse; /** - * + * * Authenticate with the server, useful for checking authentication. - * + * */ -public interface AuthCmd extends DockerCmd { +public interface AuthCmd extends SyncDockerCmd { public AuthConfig getAuthConfig(); @@ -24,7 +24,7 @@ public interface AuthCmd extends DockerCmd { @Override public AuthResponse exec() throws UnauthorizedException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index 5dd1cc177..5fd6015c3 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,20 +1,19 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.model.AuthConfigurations; -import com.github.dockerjava.api.model.EventStreamItem; - import java.io.File; -import java.io.IOException; import java.io.InputStream; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.BuildResponseItem; + /** - * + * * Build an image from Dockerfile. - * + * * TODO: http://docs.docker.com/reference/builder/#dockerignore - * + * */ -public interface BuildImageCmd extends DockerCmd { +public interface BuildImageCmd extends AsyncDockerCmd { public BuildImageCmd withTag(String tag); @@ -58,14 +57,9 @@ public interface BuildImageCmd extends DockerCmd { public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdAsyncExec { } - /** - * @see {@link com.github.dockerjava.core.command.EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; - } + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index 2c24a0f42..10de66459 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -9,7 +9,7 @@ * Create a new image from a container's changes. Returns the new image ID. * */ -public interface CommitCmd extends DockerCmd { +public interface CommitCmd extends SyncDockerCmd { public String getContainerId(); @@ -110,7 +110,7 @@ public interface CommitCmd extends DockerCmd { @Override public String exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index ed7028460..968fb5c7c 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.ChangeLog; -public interface ContainerDiffCmd extends DockerCmd> { +public interface ContainerDiffCmd extends SyncDockerCmd> { public String getContainerId(); @@ -27,7 +27,7 @@ public interface ContainerDiffCmd extends DockerCmd> { @Override public List exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec> { + public static interface Exec extends DockerCmdSyncExec> { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index eb67dfbd9..1bc3ca909 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -4,7 +4,7 @@ import com.github.dockerjava.api.NotFoundException; -public interface CopyFileFromContainerCmd extends DockerCmd { +public interface CopyFileFromContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -20,14 +20,14 @@ public interface CopyFileFromContainerCmd extends DockerCmd { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. - * + * * @throws NotFoundException * No such container */ @Override public InputStream exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index 9ad44b2c4..371774414 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -17,9 +17,9 @@ import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; -public interface CreateContainerCmd extends DockerCmd { +public interface CreateContainerCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } /** diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java index a25535d5b..93b00efac 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -2,7 +2,7 @@ import java.io.InputStream; -public interface CreateImageCmd extends DockerCmd { +public interface CreateImageCmd extends SyncDockerCmd { public String getRepository(); @@ -30,7 +30,7 @@ public interface CreateImageCmd extends DockerCmd { */ public CreateImageCmd withTag(String tag); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java index 79236b890..ba9992bed 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -4,6 +4,6 @@ public interface DockerCmd extends Closeable { - public RES_T exec(); + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java new file mode 100644 index 000000000..dfd2a371e --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java @@ -0,0 +1,9 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; + +public interface DockerCmdAsyncExec, A_RES_T> { + + public Void exec(CMD_T command, ResultCallback resultCallback); + +} diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java similarity index 53% rename from src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java rename to src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java index 635395ed0..678b4afe1 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.command; -public interface DockerCmdExec, RES_T> { +public interface DockerCmdSyncExec, RES_T> { public RES_T exec(CMD_T command); diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index 057bed644..cbcd122a6 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -10,7 +10,7 @@ * @param until * - Stream events until this timestamp */ -public interface EventsCmd extends AsyncDockerCmd { +public interface EventsCmd extends AsyncDockerCmd { public EventsCmd withSince(String since); public EventsCmd withUntil(String until); @@ -19,6 +19,6 @@ public interface EventsCmd extends AsyncDockerCmd { public String getUntil(); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java index ffeef0153..8094f371e 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.command; -public interface ExecCreateCmd extends DockerCmd { +public interface ExecCreateCmd extends SyncDockerCmd { public String getContainerId(); @@ -32,6 +32,6 @@ public interface ExecCreateCmd extends DockerCmd { public boolean hasTtyEnabled(); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index 339e2c9a0..cd9eaa017 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -4,7 +4,7 @@ import java.io.InputStream; -public interface ExecStartCmd extends DockerCmd { +public interface ExecStartCmd extends SyncDockerCmd { public String getExecId(); @@ -24,13 +24,13 @@ public interface ExecStartCmd extends DockerCmd { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. - * + * * @throws com.github.dockerjava.api.NotFoundException * No such exec instance */ @Override public InputStream exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java index 10e3597e6..2fe7f2bf6 100644 --- a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java @@ -2,9 +2,9 @@ import com.github.dockerjava.api.model.Info; -public interface InfoCmd extends DockerCmd { +public interface InfoCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index e0d087847..d9988085f 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.NotFoundException; -public interface InspectContainerCmd extends DockerCmd { +public interface InspectContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -15,7 +15,7 @@ public interface InspectContainerCmd extends DockerCmd @Override public InspectContainerResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java index 82243614c..36ce45fc5 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.NotFoundException; -public interface InspectExecCmd extends DockerCmd { +public interface InspectExecCmd extends SyncDockerCmd { public String getExecId(); public InspectExecCmd withExecId(String execId); @@ -14,6 +14,6 @@ public interface InspectExecCmd extends DockerCmd { @Override public InspectExecResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index ebf6550d2..6eaea9075 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -5,7 +5,7 @@ /** * Inspect the details of an image. */ -public interface InspectImageCmd extends DockerCmd { +public interface InspectImageCmd extends SyncDockerCmd { public String getImageId(); @@ -18,7 +18,7 @@ public interface InspectImageCmd extends DockerCmd { @Override public InspectImageResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index 33fceba3b..513bf09c5 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -5,7 +5,7 @@ /** * Kill a running container. */ -public interface KillContainerCmd extends DockerCmd { +public interface KillContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -22,7 +22,7 @@ public interface KillContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index c2a116bed..5cba11755 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -20,7 +20,7 @@ * - Show only containers created before Id, include non-running ones. * */ -public interface ListContainersCmd extends DockerCmd> { +public interface ListContainersCmd extends SyncDockerCmd> { public int getLimit(); @@ -46,7 +46,7 @@ public interface ListContainersCmd extends DockerCmd> { public ListContainersCmd withFilters(Filters filters); - public static interface Exec extends DockerCmdExec> { + public static interface Exec extends DockerCmdSyncExec> { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 4c6a899cf..170ed8102 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -12,7 +12,7 @@ * @param filters * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ -public interface ListImagesCmd extends DockerCmd> { +public interface ListImagesCmd extends SyncDockerCmd> { public String getFilters(); @@ -22,7 +22,7 @@ public interface ListImagesCmd extends DockerCmd> { public ListImagesCmd withFilters(String filters); - public static interface Exec extends DockerCmdExec> { + public static interface Exec extends DockerCmdSyncExec> { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index a0e9d6ba5..a97393aa5 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -1,11 +1,10 @@ package com.github.dockerjava.api.command; +import java.io.InputStream; + import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Frame; -import java.io.InputStream; - /** * Get container logs * @@ -20,7 +19,7 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs */ -public interface LogContainerCmd extends AsyncDockerCmd { +public interface LogContainerCmd extends AsyncDockerCmd { public String getContainerId(); @@ -64,16 +63,7 @@ public interface LogContainerCmd extends AsyncDockerCmd { + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index a052c8bcf..21039bb42 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -9,7 +9,7 @@ * - Id of the container * */ -public interface PauseContainerCmd extends DockerCmd { +public interface PauseContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -22,7 +22,7 @@ public interface PauseContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/PingCmd.java b/src/main/java/com/github/dockerjava/api/command/PingCmd.java index a5d88056a..0be834e9a 100644 --- a/src/main/java/com/github/dockerjava/api/command/PingCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PingCmd.java @@ -2,11 +2,11 @@ /** * Ping the Docker server - * + * */ -public interface PingCmd extends DockerCmd { +public interface PingCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index b3e6db6aa..53edbe9a4 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -1,16 +1,14 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.core.command.EventStreamReader; - -import java.io.InputStream; +import com.github.dockerjava.api.model.PullResponseItem; /** * * Pull image from repository. * */ -public interface PullImageCmd extends DockerCmd { +public interface PullImageCmd extends AsyncDockerCmd { public String getRepository(); @@ -28,15 +26,6 @@ public interface PullImageCmd extends DockerCmd { public PullImageCmd withAuthConfig(AuthConfig authConfig); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdAsyncExec { } - - /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. - * - * @see {@link EventStreamReader} - */ - @Override - public InputStream exec(); - } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index 6b9a67ebe..9b8c55918 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -1,12 +1,9 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.PushEventStreamItem; -import com.github.dockerjava.core.command.EventStreamReader; - -import java.io.IOException; -import java.io.InputStream; +import com.github.dockerjava.api.model.PushResponseItem; /** * Push the latest image to the repository. @@ -14,7 +11,7 @@ * @param name * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public interface PushImageCmd extends DockerCmd { +public interface PushImageCmd extends AsyncDockerCmd { public String getName(); @@ -40,16 +37,9 @@ public interface PushImageCmd extends DockerCmd { * @throws NotFoundException * No such image */ - public Response exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + @Override + public > T exec(T resultCallback); - /** - * @see {@link EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; + public static interface Exec extends DockerCmdAsyncExec { } - } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index 9f917a327..fe5378dc2 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -4,13 +4,13 @@ /** * Remove a container. - * + * * @param removeVolumes * - true or false, Remove the volumes associated to the container. Defaults to false * @param force * - true or false, Removes the container even if it was running. Defaults to false */ -public interface RemoveContainerCmd extends DockerCmd { +public interface RemoveContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -33,7 +33,7 @@ public interface RemoveContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 1ce1cd210..99f2835f8 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -7,7 +7,7 @@ * Remove an image, deleting any tags it might have. * */ -public interface RemoveImageCmd extends DockerCmd { +public interface RemoveImageCmd extends SyncDockerCmd { public String getImageId(); @@ -34,7 +34,7 @@ public interface RemoveImageCmd extends DockerCmd { /** * noprune parameter to prevent the deletion of parent images - * + * */ public RemoveImageCmd withNoPrune(boolean noPrune); @@ -45,7 +45,7 @@ public interface RemoveImageCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index aa07fffd1..c2a5219a8 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -9,7 +9,7 @@ * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ -public interface RestartContainerCmd extends DockerCmd { +public interface RestartContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -26,7 +26,7 @@ public interface RestartContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 67425ab66..0b027a764 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -4,7 +4,7 @@ import java.io.InputStream; -public interface SaveImageCmd extends DockerCmd { +public interface SaveImageCmd extends SyncDockerCmd { public String getName(); @@ -24,13 +24,13 @@ public interface SaveImageCmd extends DockerCmd { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. - * + * * @throws com.github.dockerjava.api.NotFoundException * No such image */ public InputStream exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java index 9279272d3..a1229da9c 100644 --- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -11,13 +11,13 @@ * - search term * */ -public interface SearchImagesCmd extends DockerCmd> { +public interface SearchImagesCmd extends SyncDockerCmd> { public String getTerm(); public SearchImagesCmd withTerm(String term); - public static interface Exec extends DockerCmdExec> { + public static interface Exec extends DockerCmdSyncExec> { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index 2195e1eca..0cfb3ea8e 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -7,9 +7,9 @@ * Start a container. * */ -public interface StartContainerCmd extends DockerCmd { +public interface StartContainerCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } String getContainerId(); diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java index f394d7f3e..64b38d472 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -6,11 +6,11 @@ * Get container stats. The result of {@link Statistics} is handled asynchronously because the docker remote API will * block when a container is stopped until the container is up again. */ -public interface StatsCmd extends AsyncDockerCmd { +public interface StatsCmd extends AsyncDockerCmd { public StatsCmd withContainerId(String containerId); public String getContainerId(); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index d5bf2e610..dc620b699 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -12,7 +12,7 @@ * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ -public interface StopContainerCmd extends DockerCmd { +public interface StopContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -31,7 +31,7 @@ public interface StopContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException, NotModifiedException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java new file mode 100644 index 000000000..7192e46f3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java @@ -0,0 +1,8 @@ +package com.github.dockerjava.api.command; + + +public interface SyncDockerCmd extends DockerCmd { + + public RES_T exec(); + +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index 44fd588f1..21895e358 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -9,9 +9,9 @@ * The repository to tag in * @param force * (not documented) - * + * */ -public interface TagImageCmd extends DockerCmd { +public interface TagImageCmd extends SyncDockerCmd { public String getImageId(); @@ -31,7 +31,7 @@ public interface TagImageCmd extends DockerCmd { public TagImageCmd withForce(boolean force); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index cc7e33aa3..3e1762f1d 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -5,7 +5,7 @@ /** * List processes running inside a container */ -public interface TopContainerCmd extends DockerCmd { +public interface TopContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -22,7 +22,7 @@ public interface TopContainerCmd extends DockerCmd { @Override public TopContainerResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 442191416..44f5658e2 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -9,7 +9,7 @@ * - Id of the container * */ -public interface UnpauseContainerCmd extends DockerCmd { +public interface UnpauseContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -22,7 +22,7 @@ public interface UnpauseContainerCmd extends DockerCmd { @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java index 703524623..5f823c6cb 100644 --- a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java @@ -5,9 +5,9 @@ /** * Returns the Docker version info. */ -public interface VersionCmd extends DockerCmd { +public interface VersionCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 8841b08a3..2accc3af9 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -4,10 +4,10 @@ /** * Wait a container - * + * * Block until container stops, then returns its exit code */ -public interface WaitContainerCmd extends DockerCmd { +public interface WaitContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -20,7 +20,7 @@ public interface WaitContainerCmd extends DockerCmd { @Override public Integer exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java new file mode 100644 index 000000000..c999652ec --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -0,0 +1,20 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Represents a build response stream item + */ +@JsonIgnoreProperties(ignoreUnknown = false) +public class BuildResponseItem extends ResponseItem { + + private static final long serialVersionUID = -1252904184236343612L; + + @JsonProperty("stream") + private String stream; + + public String getStream() { + return stream; + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java deleted file mode 100644 index 9c7489812..000000000 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.github.dockerjava.api.model; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -import com.google.common.base.Objects; - -/** - * Represents an event stream - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class EventStreamItem implements Serializable { - - private static final long serialVersionUID = 638778515773898651L; - - @JsonProperty("stream") - private String stream; - - // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} - @JsonProperty("error") - private String error; - - @JsonProperty("errorDetail") - private ErrorDetail errorDetail; - - public String getStream() { - return stream; - } - - public String getError() { - return error; - } - - public ErrorDetail getErrorDetail() { - return errorDetail; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class ErrorDetail implements Serializable { - @JsonProperty("code") - String code; - - @JsonProperty("message") - String message; - - @Override - public String toString() { - return Objects.toStringHelper(this).add("code", code).add("message", message).toString(); - } - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("stream", stream).add("error", error).add("errorDetail", errorDetail) - .toString(); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java deleted file mode 100644 index cd49e846e..000000000 --- a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.dockerjava.api.model; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Objects; - -import java.io.Serializable; - -/** - * Represents an item returned from pull - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class PullEventStreamItem implements Serializable { - - private static final long serialVersionUID = -5187169652557467828L; - - @JsonProperty("status") - private String status; - - @JsonProperty("progress") - private String progress; - - @JsonProperty("progressDetail") - private ProgressDetail progressDetail; - - public String getStatus() { - return status; - } - - public String getProgress() { - return progress; - } - - public ProgressDetail getProgressDetail() { - return progressDetail; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class ProgressDetail implements Serializable { - @JsonProperty("current") - int current; - - @Override - public String toString() { - return "current " + current; - } - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("status", status).add("progress", progress) - .add("progressDetail", progressDetail).toString(); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java new file mode 100644 index 000000000..cb856a115 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -0,0 +1,13 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Represents a pull response stream item + */ +@JsonIgnoreProperties(ignoreUnknown = false) +public class PullResponseItem extends ResponseItem { + + private static final long serialVersionUID = 6316219017613249047L; + +} diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java deleted file mode 100644 index e022f0c1a..000000000 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.dockerjava.api.model; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -import com.google.common.base.Objects; - -/** - * Represents an item returned from push - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class PushEventStreamItem implements Serializable { - - private static final long serialVersionUID = -5187169652557467828L; - - @JsonProperty("status") - private String status; - - @JsonProperty("progress") - private String progress; - - @JsonProperty("progressDetail") - private ProgressDetail progressDetail; - - public String getStatus() { - return status; - } - - public String getProgress() { - return progress; - } - - public ProgressDetail getProgressDetail() { - return progressDetail; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class ProgressDetail implements Serializable { - @JsonProperty("current") - int current; - - @Override - public String toString() { - return "current " + current; - } - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("status", status).add("progress", progress) - .add("progressDetail", progressDetail).toString(); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java new file mode 100644 index 000000000..b97042154 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -0,0 +1,12 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * Represents a push response stream item + */ +@JsonIgnoreProperties(ignoreUnknown = false) +public class PushResponseItem extends ResponseItem { + + private static final long serialVersionUID = 8256977108011295857L; +} diff --git a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java new file mode 100644 index 000000000..f7c4c502d --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -0,0 +1,89 @@ +package com.github.dockerjava.api.model; + +import java.io.Serializable; + +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Represents a pull response stream item + */ +@JsonIgnoreProperties(ignoreUnknown = false) +public class ResponseItem implements Serializable { + + private static final long serialVersionUID = -5187169652557467828L; + + @JsonProperty("status") + private String status; + + @JsonProperty("progress") + private String progress; + + @JsonProperty("progressDetail") + private ProgressDetail progressDetail; + + @JsonProperty("error") + private String error; + + @JsonProperty("errorDetail") + private ErrorDetail errorDetail; + + @JsonProperty("id") + private String id; + + public String getStatus() { + return status; + } + + public String getProgress() { + return progress; + } + + public ProgressDetail getProgressDetail() { + return progressDetail; + } + + public String getId() { + return id; + } + + @JsonIgnoreProperties(ignoreUnknown = false) + public static class ProgressDetail implements Serializable { + private static final long serialVersionUID = -1954994695645715264L; + + @JsonProperty("current") + int current; + + @JsonProperty("total") + int total; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); + } + } + + @JsonIgnoreProperties(ignoreUnknown = false) + public static class ErrorDetail implements Serializable { + private static final long serialVersionUID = -9136704865403084083L; + + @JsonProperty("code") + String code; + + @JsonProperty("message") + String message; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); + } + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 810910393..947d42bf8 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -49,8 +49,11 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.api.model.PushResponseItem; import com.github.dockerjava.api.model.Statistics; import com.github.dockerjava.core.command.AttachContainerCmdImpl; import com.github.dockerjava.core.command.AuthCmdImpl; @@ -284,9 +287,8 @@ public WaitContainerCmd waitContainerCmd(String containerId) { } @Override - public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback) { - return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId, - resultCallback); + public AttachContainerCmd attachContainerCmd(String containerId) { + return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); } @Override @@ -300,9 +302,8 @@ public InspectExecCmd inspectExecCmd(String execId) { } @Override - public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback) { - return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId, - resultCallback); + public LogContainerCmd logContainerCmd(String containerId) { + return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); } @Override @@ -383,13 +384,13 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) { } @Override - public EventsCmd eventsCmd(ResultCallback eventCallback) { - return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback); + public EventsCmd eventsCmd() { + return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec()); } @Override - public StatsCmd statsCmd(ResultCallback statisticsCallback) { - return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), statisticsCallback); + public StatsCmd statsCmd() { + return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec()); } @Override diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 5339b3ed0..8c8cb8d3d 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -7,6 +7,7 @@ import java.io.InputStream; import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonFactory.Feature; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.ObjectMapper; @@ -33,15 +34,22 @@ public JsonStreamProcessor(Class clazz) { public void processResponseStream(InputStream response, ResultCallback resultCallback) { resultCallback.onStart(response); + OBJECT_MAPPER.configure(com.fasterxml.jackson.core.JsonParser.Feature.AUTO_CLOSE_SOURCE, true); try { JsonParser jp = JSON_FACTORY.createParser(response); - while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) { + boolean closed = jp.isClosed(); + JsonToken nextToken = jp.nextToken(); + while (!closed && nextToken != null && nextToken != JsonToken.END_OBJECT) { try { - resultCallback.onNext(OBJECT_MAPPER.readValue(jp, clazz)); + T next = OBJECT_MAPPER.readValue(jp, clazz); + resultCallback.onNext(next); } catch (Exception e) { resultCallback.onError(e); } + + closed = jp.isClosed(); + nextToken = jp.nextToken(); } } catch (Throwable t) { resultCallback.onError(t); 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 50cc1fd91..a4e08e5a9 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -16,7 +16,7 @@ * @author marcus * */ -public abstract class ResultCallbackTemplate implements ResultCallback { +public abstract class ResultCallbackTemplate, A_RES_T> implements ResultCallback { private final CountDownLatch finished = new CountDownLatch(1); @@ -28,7 +28,7 @@ public void onStart(Closeable stream) { } @Override - public void onNext(T object) { + public void onNext(A_RES_T object) { } @Override @@ -60,11 +60,21 @@ public void close() throws IOException { finished.countDown(); } - public void awaitFinish() throws InterruptedException { + /** + * Blocks until {@link ResultCallback#onComplete()} was called + */ + @SuppressWarnings("unchecked") + public RC_T awaitCompletion() throws InterruptedException { finished.await(); + return (RC_T) this; } - public void awaitFinish(long timeout, TimeUnit timeUnit) throws InterruptedException { + /** + * Blocks until {@link ResultCallback#onComplete()} was called or the given timeout occurs + */ + @SuppressWarnings("unchecked") + public RC_T awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedException { finished.await(timeout, timeUnit); + return (RC_T) this; } } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java new file mode 100644 index 000000000..43293f3fe --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AsyncDockerCmd; +import com.github.dockerjava.api.command.DockerCmdAsyncExec; + +public abstract class AbstrAsyncDockerCmd, A_RES_T> implements + AsyncDockerCmd { + + private final static Logger LOGGER = LoggerFactory.getLogger(AbstrAsyncDockerCmd.class); + + protected DockerCmdAsyncExec execution; + + public AbstrAsyncDockerCmd(DockerCmdAsyncExec execution) { + checkNotNull(execution, "execution was not specified"); + this.execution = execution; + } + + @Override + public > T exec(T resultCallback) { + execution.exec((CMD_T) this, resultCallback); + return resultCallback; + } + + @Override + public void close() throws IOException { + } + + + +} diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 7e9957cbf..341b6a886 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -8,17 +8,17 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.command.DockerCmd; -import com.github.dockerjava.api.command.DockerCmdExec; +import com.github.dockerjava.api.command.DockerCmdSyncExec; import com.github.dockerjava.api.model.AuthConfig; public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { - public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { + public AbstrAuthCfgDockerCmd(DockerCmdSyncExec execution, AuthConfig authConfig) { super(execution); withOptionalAuthConfig(authConfig); } - public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { + public AbstrAuthCfgDockerCmd(DockerCmdSyncExec execution) { super(execution); } @@ -39,12 +39,6 @@ private T withOptionalAuthConfig(AuthConfig authConfig) { return (T) this; } - protected String registryAuth() { - try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 069fba09e..c4fedac58 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -4,20 +4,24 @@ import java.io.IOException; +import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; -import com.github.dockerjava.api.command.DockerCmdExec; +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.SyncDockerCmd; +import com.github.dockerjava.api.model.AuthConfig; -public abstract class AbstrDockerCmd, RES_T> implements DockerCmd { +public abstract class AbstrDockerCmd, RES_T> implements SyncDockerCmd { private final static Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); - protected DockerCmdExec execution; + protected DockerCmdSyncExec execution; - public AbstrDockerCmd(DockerCmdExec execution) { + public AbstrDockerCmd(DockerCmdSyncExec execution) { checkNotNull(execution, "execution was not specified"); this.execution = execution; } @@ -32,4 +36,12 @@ public RES_T exec() throws DockerException { @Override public void close() throws IOException { } + + protected String registryAuth(AuthConfig authConfig) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index eabbb8488..222ea9b3b 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -22,29 +22,15 @@ * @param timestamps * - true or false, if true, print timestamps for every log line. Defaults to false. */ -public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { - - private ResultCallback resultCallback; +public class AttachContainerCmdImpl extends AbstrAsyncDockerCmd implements AttachContainerCmd { private String containerId; private boolean logs, followStream, timestamps, stdout, stderr; - public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { + public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); - withResultCallback(resultCallback); - } - - public ResultCallback getResultCallback() { - return resultCallback; - } - - @Override - public AttachContainerCmd withResultCallback(ResultCallback resultCallback) { - checkNotNull(resultCallback, "resultCallback was not specified"); - this.resultCallback = resultCallback; - return this; } @Override @@ -133,13 +119,4 @@ public AttachContainerCmd withLogs(boolean logs) { public AttachContainerCmd withLogs() { return withLogs(true); } - - /** - * @throws NotFoundException - * No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index f61d3b7ac..56ce8f78f 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -8,15 +8,16 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; /** - * + * * Build an image from Dockerfile. - * + * */ -public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { +public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd { private InputStream tarInputStream = null; diff --git a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java deleted file mode 100644 index ffa71d6c9..000000000 --- a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.dockerjava.core.command; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.io.InputStream; - -public class EventStreamReader implements AutoCloseable { - - private final ObjectMapper objectMapper = new ObjectMapper(); - - private final Class type; - - private final InputStream inputStream; - - public EventStreamReader(InputStream inputStream, Class type) { - this.inputStream = inputStream; - this.type = type; - } - - public I readItem() throws IOException { - try { - return objectMapper.readValue(inputStream, type); - } catch (IOException e) { - // dirty, but works - if (e.getMessage().equals("Stream closed")) { - return null; - } - throw e; - } - } - - @Override - public void close() throws IOException { - inputStream.close(); - } -} diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index d1de2e60f..f371c5b7c 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -7,17 +7,14 @@ /** * Stream docker events */ -public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd { +public class EventsCmdImpl extends AbstrAsyncDockerCmd implements EventsCmd { private String since; private String until; - private ResultCallback resultCallback; - - public EventsCmdImpl(EventsCmd.Exec exec, ResultCallback resultCallback) { + public EventsCmdImpl(EventsCmd.Exec exec) { super(exec); - withResultCallback(resultCallback); } @Override @@ -32,12 +29,6 @@ public EventsCmd withUntil(String until) { return this; } - @Override - public EventsCmd withResultCallback(ResultCallback resultCallback) { - this.resultCallback = resultCallback; - return this; - } - @Override public String getSince() { return since; @@ -48,11 +39,6 @@ public String getUntil() { return until; } - @Override - public ResultCallback getResultCallback() { - return resultCallback; - } - @Override public String toString() { return new StringBuilder("events").append(since != null ? " --since=" + since : "") diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 55fad8c9c..ade3923f3 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.command.DockerCmdExec; +import com.github.dockerjava.api.command.DockerCmdSyncExec; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectExecResponse; import com.google.common.base.Preconditions; diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index 9476ecc9b..490b6b1a1 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -24,9 +24,7 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs */ -public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd { - - private ResultCallback resultCallback; +public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { private String containerId; @@ -34,10 +32,9 @@ public class LogContainerCmdImpl extends AbstrDockerCmd i private boolean followStream, timestamps, stdout, stderr; - public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { + public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); - withResultCallback(resultCallback); } @Override @@ -45,18 +42,6 @@ public String getContainerId() { return containerId; } - @Override - public ResultCallback getResultCallback() { - return resultCallback; - } - - @Override - public LogContainerCmd withResultCallback(ResultCallback resultCallback) { - checkNotNull(resultCallback, "resultCallback was not specified"); - this.resultCallback = resultCallback; - return this; - } - @Override public int getTail() { return tail; @@ -151,12 +136,4 @@ public String toString() { .append(timestamps ? "--timestamps=true" : "").append(containerId).toString(); } - /** - * @throws NotFoundException - * No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index 488562b99..2fe46f12c 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -2,25 +2,42 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.InputStream; - +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PullResponseItem; /** * * Pull image from repository. * */ -public class PullImageCmdImpl extends AbstrAuthCfgDockerCmd implements PullImageCmd { +public class PullImageCmdImpl extends AbstrAsyncDockerCmd implements PullImageCmd { private String repository, tag, registry; + private AuthConfig authConfig; + public PullImageCmdImpl(PullImageCmd.Exec exec, AuthConfig authConfig, String repository) { - super(exec, authConfig); + super(exec); + withOptionalAuthConfig(authConfig); withRepository(repository); } + public AuthConfig getAuthConfig() { + return authConfig; + } + + public PullImageCmd withAuthConfig(AuthConfig authConfig) { + checkNotNull(authConfig, "authConfig was not specified"); + return withOptionalAuthConfig(authConfig); + } + + private PullImageCmd withOptionalAuthConfig(AuthConfig authConfig) { + this.authConfig = authConfig; + return this; + } + @Override public String getRepository() { return repository; diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 76bbe46b6..81f1262f1 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -2,8 +2,9 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushResponseItem; /** * Push the latest image to the repository. @@ -11,13 +12,14 @@ * @param name * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd implements - PushImageCmd { +public class PushImageCmdImpl extends AbstrAsyncDockerCmd implements PushImageCmd { private String name; private String tag; + private AuthConfig authConfig; + public PushImageCmdImpl(PushImageCmd.Exec exec, String name) { super(exec); withName(name); @@ -55,17 +57,24 @@ public PushImageCmd withTag(String tag) { return this; } + public AuthConfig getAuthConfig() { + return authConfig; + } + + public PushImageCmd withAuthConfig(AuthConfig authConfig) { + checkNotNull(authConfig, "authConfig was not specified"); + return withOptionalAuthConfig(authConfig); + } + + private PushImageCmd withOptionalAuthConfig(AuthConfig authConfig) { + this.authConfig = authConfig; + return this; + } + @Override public String toString() { return new StringBuilder("push ").append(name).toString(); } - /** - * @throws NotFoundException - * No such image - */ - @Override - public Response exec() throws NotFoundException { - return super.exec(); - } + } diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java index 678a9ef49..205f619b7 100644 --- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -9,15 +9,12 @@ /** * Container stats */ -public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd { +public class StatsCmdImpl extends AbstrAsyncDockerCmd implements StatsCmd { private String containerId; - private ResultCallback resultCallback; - - public StatsCmdImpl(StatsCmd.Exec exec, ResultCallback resultCallback) { + public StatsCmdImpl(StatsCmd.Exec exec) { super(exec); - withResultCallback(resultCallback); } @Override @@ -32,22 +29,6 @@ public String getContainerId() { return containerId; } - @Override - public StatsCmd withResultCallback(ResultCallback resultCallback) { - this.resultCallback = resultCallback; - return this; - } - - @Override - public ResultCallback getResultCallback() { - return resultCallback; - } - - @Override - public Void exec() { - return super.exec(); - } - @Override public String toString() { return new StringBuilder("stats").append(containerId != null ? " --id=" + containerId : "").toString(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java new file mode 100644 index 000000000..cb91a56e7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java @@ -0,0 +1,71 @@ +package com.github.dockerjava.jaxrs; + +import java.io.Closeable; +import java.io.IOException; + +import javax.ws.rs.client.WebTarget; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AsyncDockerCmd; +import com.github.dockerjava.api.command.DockerCmdAsyncExec; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; + +public abstract class AbstrAsyncDockerCmdExec, A_RES_T> extends + AbstrDockerCmdExec implements DockerCmdAsyncExec { + + public AbstrAsyncDockerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + public Void exec(CMD_T command, ResultCallback resultCallback) { + return execute(command, resultCallback); + } + + protected final Void execute(final CMD_T command, final ResultCallback resultCallback) { + + ResultCallback delegatingResultCallback = new ResultCallback() { + + @Override + public void close() throws IOException { + resultCallback.close(); + command.close(); + } + + @Override + public void onStart(Closeable closeable) { + resultCallback.onStart(closeable); + } + + @Override + public void onNext(A_RES_T object) { + resultCallback.onNext(object); + } + + @Override + public void onError(Throwable throwable) { + resultCallback.onError(throwable); + } + + @Override + public void onComplete() { + resultCallback.onComplete(); + try { + command.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + + AbstractCallbackNotifier callbackNotifier = callbackNotifier(command, delegatingResultCallback); + + AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); + + return null; + } + + protected abstract AbstractCallbackNotifier callbackNotifier(CMD_T command, + ResultCallback resultCallback); + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 7ce68eed8..beca08c13 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -4,19 +4,15 @@ import java.io.IOException; -import javax.ws.rs.ProcessingException; import javax.ws.rs.client.WebTarget; import org.apache.commons.codec.binary.Base64; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.DockerCmd; -import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; -public abstract class AbstrDockerCmdExec, RES_T> implements DockerCmdExec { +public abstract class AbstrDockerCmdExec { private WebTarget baseResource; @@ -45,29 +41,5 @@ protected String registryConfigs(AuthConfigurations authConfigs) { } } - @Override - public RES_T exec(CMD_T command) { - // this hack works because of ResponseStatusExceptionFilter - RES_T result; - try { - result = execute(command); - - } catch (ProcessingException e) { - if (e.getCause() instanceof DockerException) { - throw (DockerException) e.getCause(); - } else { - throw e; - } - } finally { - try { - command.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - return result; - } - protected abstract RES_T execute(CMD_T command); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java new file mode 100644 index 000000000..7e26c519e --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.jaxrs; + +import java.io.IOException; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.client.WebTarget; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.DockerCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; + +public abstract class AbstrSyncDockerCmdExec, RES_T> extends AbstrDockerCmdExec + implements DockerCmdSyncExec { + + public AbstrSyncDockerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + public RES_T exec(CMD_T command) { + // this hack works because of ResponseStatusExceptionFilter + RES_T result; + try { + result = execute(command); + + } catch (ProcessingException e) { + if (e.getCause() instanceof DockerException) { + throw (DockerException) e.getCause(); + } else { + throw e; + } + } finally { + try { + command.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return result; + } + + protected abstract RES_T execute(CMD_T command); +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index edf837d7f..36b904dd2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -5,13 +5,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.async.FrameStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class AttachContainerCmdExec extends AbstrDockerCmdExec implements +public class AttachContainerCmdExec extends AbstrAsyncDockerCmdExec implements AttachContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); @@ -21,7 +22,9 @@ public AttachContainerCmdExec(WebTarget baseResource) { } @Override - protected Void execute(AttachContainerCmd command) { + protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd command, + ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/attach") .resolveTemplate("id", command.getContainerId()) .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") @@ -32,11 +35,7 @@ protected Void execute(AttachContainerCmd command) { LOGGER.trace("POST: {}", webTarget); - POSTCallbackNotifier callbackNotifier = new POSTCallbackNotifier(new FrameStreamProcessor(), - command.getResultCallback(), webTarget); - - AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); - - return null; + return new POSTCallbackNotifier(new FrameStreamProcessor(), + resultCallback, webTarget.request(), null); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java index 8ceca593e..9dfe9d118 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java @@ -12,7 +12,7 @@ import static javax.ws.rs.client.Entity.entity; -public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { +public class AuthCmdExec extends AbstrSyncDockerCmdExec implements AuthCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(AuthCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 3380832ec..00d907a43 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,28 +1,25 @@ package com.github.dockerjava.jaxrs; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.model.AuthConfigurations; -import com.github.dockerjava.api.model.EventStreamItem; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -import com.google.common.collect.ImmutableList; -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.RequestEntityProcessing; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static javax.ws.rs.client.Entity.entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; -import static javax.ws.rs.client.Entity.entity; +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class BuildImageCmdExec extends AbstrDockerCmdExec implements +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; + +public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); @@ -31,81 +28,48 @@ public BuildImageCmdExec(WebTarget baseResource) { super(baseResource); } + private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + @Override - protected ResponseImpl execute(BuildImageCmd command) { - WebTarget webResource = getBaseResource().path("/build"); + protected AbstractCallbackNotifier callbackNotifier(BuildImageCmd command, + ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/build"); String dockerFilePath = command.getPathToDockerfile(); if (command.getTag() != null) { - webResource = webResource.queryParam("t", command.getTag()); + webTarget = webTarget.queryParam("t", command.getTag()); } if (command.hasNoCacheEnabled()) { - webResource = webResource.queryParam("nocache", "true"); + webTarget = webTarget.queryParam("nocache", "true"); } if (!command.hasRemoveEnabled()) { - webResource = webResource.queryParam("rm", "false"); + webTarget = webTarget.queryParam("rm", "false"); } if (command.isQuiet()) { - webResource = webResource.queryParam("q", "true"); + webTarget = webTarget.queryParam("q", "true"); } if (command.hasPullEnabled()) { - webResource = webResource.queryParam("pull", "true"); + webTarget = webTarget.queryParam("pull", "true"); } if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webResource = webResource.queryParam("dockerfile", dockerFilePath); - } - - webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); - webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); - - LOGGER.debug("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept(MediaType.TEXT_PLAIN) - .post(entity(command.getTarInputStream(), "application/tar"), Response.class); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - - } - - private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { - AuthConfigurations authConfigs = command.getBuildAuthConfigs(); - if (authConfigs != null) { - request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + webTarget = webTarget.queryParam("dockerfile", dockerFilePath); } - return request; - } - public static class ResponseImpl extends BuildImageCmd.Response { - - private final InputStream proxy; - - public ResponseImpl(InputStream proxy) { - this.proxy = proxy; - } + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); + webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); - @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(EventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); + LOGGER.trace("POST: {}", webTarget); - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } - } - - @Override - public int read() throws IOException { - return proxy.read(); - } - - @Override - public void close() throws IOException { - proxy.close(); - super.close(); - } + return new POSTCallbackNotifier( + new JsonStreamProcessor(BuildResponseItem.class), resultCallback, + resourceWithOptionalAuthConfig(command, webTarget.request()).accept(MediaType.TEXT_PLAIN), entity( + command.getTarInputStream(), "application/tar")); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java index b07f5e338..fec4da6ac 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.command.CommitCmd; -public class CommitCmdExec extends AbstrDockerCmdExec implements CommitCmd.Exec { +public class CommitCmdExec extends AbstrSyncDockerCmdExec implements CommitCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CommitCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java index c7c8c293a..aa7878a65 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java @@ -12,7 +12,7 @@ import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; -public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements +public class ContainerDiffCmdExec extends AbstrSyncDockerCmdExec> implements ContainerDiffCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ContainerDiffCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 88e8c3086..ec6d0b765 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -14,7 +14,7 @@ import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements +public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileFromContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java index c02b9f4b7..265057c00 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java @@ -11,7 +11,7 @@ import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; -public class CreateContainerCmdExec extends AbstrDockerCmdExec implements +public class CreateContainerCmdExec extends AbstrSyncDockerCmdExec implements CreateContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java index c5733241d..baba39829 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java @@ -11,7 +11,7 @@ import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; -public class CreateImageCmdExec extends AbstrDockerCmdExec implements +public class CreateImageCmdExec extends AbstrSyncDockerCmdExec implements CreateImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CreateImageCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index e6f27ae69..1bd38048a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -5,13 +5,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; -public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { +public class EventsCmdExec extends AbstrAsyncDockerCmdExec implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); @@ -20,18 +21,13 @@ public EventsCmdExec(WebTarget baseResource) { } @Override - protected Void execute(EventsCmd command) { - + protected AbstractCallbackNotifier callbackNotifier(EventsCmd command, ResultCallback resultCallback) { WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); LOGGER.trace("GET: {}", webTarget); - GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(new JsonStreamProcessor( - Event.class), command.getResultCallback(), webTarget); - - AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); - - return null; + return new GETCallbackNotifier(new JsonStreamProcessor( + Event.class), resultCallback, webTarget.request()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index e2d986bbf..573d89470 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -10,7 +10,7 @@ import static javax.ws.rs.client.Entity.entity; -public class ExecCreateCmdExec extends AbstrDockerCmdExec implements +public class ExecCreateCmdExec extends AbstrSyncDockerCmdExec implements ExecCreateCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index 46d0e2d29..58c19e55c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -14,7 +14,7 @@ import static javax.ws.rs.client.Entity.entity; -public class ExecStartCmdExec extends AbstrDockerCmdExec implements ExecStartCmd.Exec { +public class ExecStartCmdExec extends AbstrSyncDockerCmdExec implements ExecStartCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java index eafb87b98..141d7d1dd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java @@ -9,7 +9,7 @@ import com.github.dockerjava.api.command.InfoCmd; import com.github.dockerjava.api.model.Info; -public class InfoCmdExec extends AbstrDockerCmdExec implements InfoCmd.Exec { +public class InfoCmdExec extends AbstrSyncDockerCmdExec implements InfoCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java index a06e46e7c..9c6e34a92 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java @@ -9,7 +9,7 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; -public class InspectContainerCmdExec extends AbstrDockerCmdExec +public class InspectContainerCmdExec extends AbstrSyncDockerCmdExec implements InspectContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java index a58a520cd..0a99acc08 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java @@ -8,7 +8,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -public class InspectExecCmdExec extends AbstrDockerCmdExec implements +public class InspectExecCmdExec extends AbstrSyncDockerCmdExec implements InspectExecCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java index b03cdd799..9148887ef 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java @@ -9,7 +9,7 @@ import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; -public class InspectImageCmdExec extends AbstrDockerCmdExec implements +public class InspectImageCmdExec extends AbstrSyncDockerCmdExec implements InspectImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectImageCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index bbfd0dbee..9b132dee5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.KillContainerCmd; -public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { +public class KillContainerCmdExec extends AbstrSyncDockerCmdExec implements KillContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(KillContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index 5feb5bdac..ddd5d3211 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -14,7 +14,7 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -public class ListContainersCmdExec extends AbstrDockerCmdExec> implements +public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements ListContainersCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index b18470e12..df88cf1d9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -14,7 +14,7 @@ import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; -public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { +public class ListImagesCmdExec extends AbstrSyncDockerCmdExec> implements ListImagesCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index d6e62cd7a..0ab3da7a5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -5,13 +5,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.async.FrameStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; -public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { +public class LogContainerCmdExec extends AbstrAsyncDockerCmdExec implements + LogContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); @@ -20,7 +22,9 @@ public LogContainerCmdExec(WebTarget baseResource) { } @Override - protected Void execute(LogContainerCmd command) { + protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd command, + ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/logs") .resolveTemplate("id", command.getContainerId()) .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") @@ -31,11 +35,6 @@ protected Void execute(LogContainerCmd command) { LOGGER.trace("GET: {}", webTarget); - GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(new FrameStreamProcessor(), - command.getResultCallback(), webTarget); - - AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); - - return null; + return new GETCallbackNotifier(new FrameStreamProcessor(), resultCallback, webTarget.request()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index 4bd8ddd9a..04bb68a6f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.PauseContainerCmd; -public class PauseContainerCmdExec extends AbstrDockerCmdExec implements +public class PauseContainerCmdExec extends AbstrSyncDockerCmdExec implements PauseContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index 9e2677e58..875155c96 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.command.PingCmd; -public class PingCmdExec extends AbstrDockerCmdExec implements PingCmd.Exec { +public class PingCmdExec extends AbstrSyncDockerCmdExec implements PingCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index c317aa1c9..dfba3c1c6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -1,20 +1,25 @@ package com.github.dockerjava.jaxrs; -import java.io.InputStream; +import static javax.ws.rs.client.Entity.entity; import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { +public class PullImageCmdExec extends AbstrAsyncDockerCmdExec implements + PullImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); @@ -22,18 +27,6 @@ public PullImageCmdExec(WebTarget baseResource) { super(baseResource); } - @Override - protected InputStream execute(PullImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) - .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); - - LOGGER.trace("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept( - MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); - - return new WrappedResponseInputStream(response); - } - private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { AuthConfig authConfig = command.getAuthConfig(); if (authConfig != null) { @@ -42,4 +35,18 @@ private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, return request; } + @Override + protected AbstractCallbackNotifier callbackNotifier(PullImageCmd command, + ResultCallback resultCallback) { + + WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + + LOGGER.trace("POST: {}", webResource); + Builder builder = resourceWithOptionalAuthConfig(command, webResource.request()).accept( + MediaType.APPLICATION_OCTET_STREAM_TYPE); + + return new POSTCallbackNotifier(new JsonStreamProcessor( + PullResponseItem.class), resultCallback, builder, entity(null, MediaType.APPLICATION_JSON)); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 4f5ca5d0a..8e79fc662 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -2,28 +2,23 @@ import static javax.ws.rs.client.Entity.entity; -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; - +import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.PushImageCmd; -import com.github.dockerjava.api.command.PushImageCmd.Response; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.PushEventStreamItem; - -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -// Shaded, but imported -import com.google.common.collect.ImmutableList; +import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { +public class PushImageCmdExec extends AbstrAsyncDockerCmdExec implements + PushImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); @@ -31,51 +26,26 @@ public PushImageCmdExec(WebTarget baseResource) { super(baseResource); } - @Override - protected ResponseImpl execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push").queryParam("tag", - command.getTag()); - - final String registryAuth = registryAuth(command.getAuthConfig()); - LOGGER.trace("POST: {}", webResource); - javax.ws.rs.core.Response response = webResource.request().header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON).post(entity(Response.class, MediaType.APPLICATION_JSON)); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - } - private String name(PushImageCmd command) { String name = command.getName(); AuthConfig authConfig = command.getAuthConfig(); return name.contains("/") ? name : authConfig.getUsername(); } - public static class ResponseImpl extends Response { - - private final InputStream proxy; + @Override + protected AbstractCallbackNotifier callbackNotifier(PushImageCmd command, + ResultCallback resultCallback) { - ResponseImpl(InputStream proxy) { - this.proxy = proxy; - } + WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); - @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(PushEventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("POST: {}", webResource); - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } - } + Builder builder = webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON); - @Override - public int read() throws IOException { - return proxy.read(); - } + return new POSTCallbackNotifier(new JsonStreamProcessor( + PushResponseItem.class), resultCallback, builder, entity(null, MediaType.APPLICATION_JSON)); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index ebd98fc6f..2e72c37bc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.RemoveContainerCmd; -public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements +public class RemoveContainerCmdExec extends AbstrSyncDockerCmdExec implements RemoveContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 8db23112b..18d477c51 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.command.RemoveImageCmd; -public class RemoveImageCmdExec extends AbstrDockerCmdExec implements RemoveImageCmd.Exec { +public class RemoveImageCmdExec extends AbstrSyncDockerCmdExec implements RemoveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index f640945a2..0a4fced89 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.RestartContainerCmd; -public class RestartContainerCmdExec extends AbstrDockerCmdExec implements +public class RestartContainerCmdExec extends AbstrSyncDockerCmdExec implements RestartContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index de56a39b6..39a06f15a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -12,7 +12,7 @@ import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { +public class SaveImageCmdExec extends AbstrSyncDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); public SaveImageCmdExec(WebTarget baseResource) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java index 00aeb91ec..1de9943d9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java @@ -12,7 +12,7 @@ import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; -public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements +public class SearchImagesCmdExec extends AbstrSyncDockerCmdExec> implements SearchImagesCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index c90f5e1cc..8b41f2cd9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -10,7 +10,7 @@ import com.github.dockerjava.api.command.StartContainerCmd; -public class StartContainerCmdExec extends AbstrDockerCmdExec implements +public class StartContainerCmdExec extends AbstrSyncDockerCmdExec implements StartContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java index 683ecca46..10fbd1ca6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -5,13 +5,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.StatsCmd; import com.github.dockerjava.api.model.Statistics; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; -public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec { +public class StatsCmdExec extends AbstrAsyncDockerCmdExec implements StatsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); public StatsCmdExec(WebTarget baseResource) { @@ -19,17 +20,15 @@ public StatsCmdExec(WebTarget baseResource) { } @Override - protected Void execute(StatsCmd command) { + protected AbstractCallbackNotifier callbackNotifier(StatsCmd command, + ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id", command.getContainerId()); LOGGER.trace("GET: {}", webTarget); - GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( - new JsonStreamProcessor(Statistics.class), command.getResultCallback(), webTarget); - - AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); - - return null; + return new GETCallbackNotifier(new JsonStreamProcessor(Statistics.class), + resultCallback, webTarget.request()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index 3197e0c0e..d881ce1c2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.StopContainerCmd; -public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { +public class StopContainerCmdExec extends AbstrSyncDockerCmdExec implements StopContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index 3cddd63f2..f697b22b2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.command.TagImageCmd; -public class TagImageCmdExec extends AbstrDockerCmdExec implements TagImageCmd.Exec { +public class TagImageCmdExec extends AbstrSyncDockerCmdExec implements TagImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(TagImageCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java index daff2224b..092e9548d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java @@ -11,7 +11,7 @@ import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; -public class TopContainerCmdExec extends AbstrDockerCmdExec implements +public class TopContainerCmdExec extends AbstrSyncDockerCmdExec implements TopContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java index de507e8ff..3005f6630 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.api.command.UnpauseContainerCmd; -public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements +public class UnpauseContainerCmdExec extends AbstrSyncDockerCmdExec implements UnpauseContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java index e8af1cb29..0c1611bc4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java @@ -9,7 +9,7 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.model.Version; -public class VersionCmdExec extends AbstrDockerCmdExec implements VersionCmd.Exec { +public class VersionCmdExec extends AbstrSyncDockerCmdExec implements VersionCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index 47af2bcfa..a916e1b5b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.command.WaitContainerCmd; -public class WaitContainerCmdExec extends AbstrDockerCmdExec implements +public class WaitContainerCmdExec extends AbstrSyncDockerCmdExec implements WaitContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java index 6cfc7a76e..3076b136a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -12,7 +12,7 @@ import java.util.concurrent.Future; import javax.ws.rs.ProcessingException; -import javax.ws.rs.client.WebTarget; +import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.core.Response; import com.github.dockerjava.api.async.ResultCallback; @@ -25,15 +25,15 @@ public abstract class AbstractCallbackNotifier implements Callable { private final ResultCallback resultCallback; - protected final WebTarget webTarget; + protected final Builder requestBuilder; protected AbstractCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, - ResultCallback resultCallback, WebTarget webTarget) { - checkNotNull(webTarget, "An WebTarget must be provided"); + ResultCallback resultCallback, Builder requestBuilder) { + checkNotNull(requestBuilder, "An WebTarget must be provided"); checkNotNull(responseStreamProcessor, "A ResponseStreamProcessor must be provided"); this.responseStreamProcessor = responseStreamProcessor; this.resultCallback = resultCallback; - this.webTarget = webTarget; + this.requestBuilder = requestBuilder; } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java index cddfe49ed..996696479 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java @@ -3,14 +3,13 @@ */ package com.github.dockerjava.jaxrs.async; -import javax.ws.rs.client.WebTarget; +import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.core.Response; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.core.async.ResponseStreamProcessor; /** - * * * @author marcus * @@ -18,12 +17,12 @@ public class GETCallbackNotifier extends AbstractCallbackNotifier { public GETCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, - WebTarget webTarget) { - super(responseStreamProcessor, resultCallback, webTarget); + Builder requestBuilder) { + super(responseStreamProcessor, resultCallback, requestBuilder); } protected Response response() { - return webTarget.request().get(Response.class); + return requestBuilder.get(Response.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java index 0d380b5db..9fe848950 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java @@ -3,27 +3,30 @@ */ package com.github.dockerjava.jaxrs.async; -import javax.ws.rs.client.WebTarget; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation.Builder; import javax.ws.rs.core.Response; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.core.async.ResponseStreamProcessor; /** - * * * @author marcus * */ public class POSTCallbackNotifier extends AbstractCallbackNotifier { + Entity entity = null; + public POSTCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, - WebTarget webTarget) { - super(responseStreamProcessor, resultCallback, webTarget); + Builder requestBuilder, Entity entity) { + super(responseStreamProcessor, resultCallback, requestBuilder); + this.entity = entity; } protected Response response() { - return webTarget.request().post(null, Response.class); + return requestBuilder.post(entity, Response.class); } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 7faca0370..d492c415b 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -2,11 +2,15 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsString; 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; @@ -17,11 +21,13 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.ITestResult; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; @@ -40,15 +46,16 @@ public abstract class AbstractDockerClientTest extends Assert { protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory( DockerClientBuilder.getDefaultDockerCmdExecFactory()); - public void beforeTest() { + public void beforeTest() throws Exception { LOG.info("======================= BEFORETEST ======================="); LOG.info("Connecting to Docker server"); dockerClient = DockerClientBuilder.getInstance(config()).withDockerCmdExecFactory(dockerCmdExecFactory).build(); LOG.info("Pulling image 'busybox'"); + // need to block until image is pulled completely - asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); + dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullResponseCallback()).awaitCompletion(); assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); @@ -181,10 +188,30 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon assertThat(volumes, contains(expectedVolumes)); } - public static class CollectFramesCallback extends ResultCallbackTemplate { - public final List frames = new ArrayList(); + 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()); - private final StringBuffer log = new StringBuffer(); + collectFramesCallback.awaitCompletion(); + + return collectFramesCallback.toString(); + } + + public static class CollectStreamItemCallback, A_RES_T> extends ResultCallbackTemplate { + public final List items = new ArrayList(); + + protected final StringBuffer log = new StringBuffer(); @Override public void onError(Throwable throwable) { @@ -193,9 +220,10 @@ public void onError(Throwable throwable) { } @Override - public void onNext(Frame frame) { - frames.add(frame); - log.append(new String(frame.getPayload())); + public void onNext(A_RES_T item) { + items.add(item); + log.append("" + item); + LOG.info(item.toString()); } @Override @@ -204,14 +232,21 @@ public String toString() { } } - protected String containerLog(String containerId) throws Exception { + 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(); + } + } - CollectFramesCallback collectFramesCallback = new CollectFramesCallback(); + public static class PullResponseCallback extends CollectStreamItemCallback { - dockerClient.logContainerCmd(containerId, collectFramesCallback).withStdOut().exec(); + } - collectFramesCallback.awaitFinish(); + protected String buildImage(File baseDir) throws Exception { - return collectFramesCallback.toString(); + return dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); } } diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index 85ee0d7ac..120f4e823 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -27,7 +27,7 @@ public class DockerClientTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(DockerClientTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 380f5dd9f..fdc582083 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -1,21 +1,58 @@ package com.github.dockerjava.core; import java.io.IOException; -import java.io.InputStream; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; -import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd.Exec; -import com.github.dockerjava.jaxrs.BuildImageCmdExec; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.model.BuildResponseItem; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution * for the purpose of automatically cleanup. - * + * * @author marcus - * + * */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { @@ -91,16 +128,16 @@ public Void exec(RemoveImageCmd command) { public BuildImageCmd.Exec createBuildImageCmdExec() { return new BuildImageCmd.Exec() { @Override - public BuildImageCmd.Response exec(BuildImageCmd command) { + public Void exec(BuildImageCmd command, ResultCallback resultCallback) { // can't detect image id here so tagging it String tag = command.getTag(); if (tag == null || "".equals(tag.trim())) { tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); command.withTag(tag); } - InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); + delegate.createBuildImageCmdExec().exec(command, resultCallback); imageNames.add(tag); - return new BuildImageCmdExec.ResponseImpl(inputStream); + return null; } }; } 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 9c5c5c691..cb9fb794f 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -6,12 +6,9 @@ import static org.hamcrest.Matchers.not; import java.io.File; -import java.io.InputStream; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; -import org.apache.commons.io.HexDump; -import org.apache.commons.lang.StringUtils; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -19,7 +16,6 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; @@ -29,7 +25,7 @@ public class AttachContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -69,10 +65,10 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut() - .withFollowStream().withLogs().exec(); + dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut() + .withFollowStream().withLogs().exec(collectFramesCallback); - collectFramesCallback.awaitFinish(30, TimeUnit.SECONDS); + collectFramesCallback.awaitCompletion(30, TimeUnit.SECONDS); collectFramesCallback.close(); @@ -85,12 +81,7 @@ public void attachContainerWithTTY() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("attachContainerTestDockerfile").getFile()); - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); - - String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); + String imageId = buildImage(baseDir); CreateContainerResponse container = dockerClient.createContainerCmd(imageId).withTty(true).exec(); @@ -107,16 +98,16 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut() - .withFollowStream().exec(); + dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut() + .withFollowStream().exec(collectFramesCallback); - collectFramesCallback.awaitFinish(10, TimeUnit.SECONDS); + collectFramesCallback.awaitCompletion(15, TimeUnit.SECONDS); collectFramesCallback.close(); System.out.println("log: " + collectFramesCallback.toString()); - HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); + //HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); assertThat(collectFramesCallback.toString(), containsString("stdout\r\nstderr")); } diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java index 180d835b6..36211b205 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -1,20 +1,24 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; +import java.lang.reflect.Method; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + import com.github.dockerjava.api.UnauthorizedException; import com.github.dockerjava.api.model.AuthResponse; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.DockerClientBuilder; -import org.testng.ITestResult; -import org.testng.annotations.*; - -import java.lang.reflect.Method; @Test(groups = "integration") public class AuthCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } 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 f90250ea3..51dfd37a0 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -27,12 +27,11 @@ import org.testng.annotations.Test; import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; -import com.github.dockerjava.api.model.EventStreamItem; +import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.CompressArchiveUtil; @@ -40,7 +39,7 @@ public class BuildImageCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -60,15 +59,10 @@ public void afterMethod(ITestResult result) { } @Test - public void testNginxDockerfileBuilder() { + public void testNginxDockerfileBuilder() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile()); - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); - - String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); + String imageId = buildImage(baseDir); InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); assertThat(inspectImageResponse, not(nullValue())); @@ -78,27 +72,21 @@ public void testNginxDockerfileBuilder() { } @Test(groups = "ignoreInCircleCi") - public void testNonstandard1() { + public void testNonstandard1() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); + buildImage(baseDir); } @Test(groups = "ignoreInCircleCi") - public void testNonstandard2() { + public void testNonstandard2() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nonstandard").getFile()); File dockerFile = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); - InputStream response = dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile) - .withNoCache().exec(); - - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); + dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile) + .withNoCache().exec(new BuildLogCallback()).awaitImageId(); } @Test @@ -149,21 +137,22 @@ public void testDockerBuilderEnv() throws Exception { } private String dockerfileBuild(InputStream tarInputStream) throws Exception { + return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream)); } private String dockerfileBuild(File baseDir) throws Exception { + return execBuild(dockerClient.buildImageCmd(baseDir)); } private String execBuild(BuildImageCmd buildImageCmd) throws Exception { - // Build image - InputStream response = buildImageCmd.withNoCache().exec(); - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); + BuildLogCallback resultCallback = new BuildLogCallback();; + + buildImageCmd.withNoCache().exec(resultCallback); - String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); + String imageId = resultCallback.awaitImageId(); // Create container based on image CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec(); @@ -179,17 +168,19 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { } @Test(expectedExceptions = { DockerClientException.class }) - public void testDockerfileIgnored() { + public void testDockerfileIgnored() throws Exception{ File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") .getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); } @Test(expectedExceptions = { DockerClientException.class }) - public void testInvalidDockerIgnorePattern() { + public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testInvalidDockerignorePattern").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + dockerClient.buildImageCmd(baseDir).withNoCache().exec( new BuildLogCallback()).awaitImageId(); } @Test(groups = "ignoreInCircleCi") @@ -204,11 +195,14 @@ public void testDockerIgnore() throws Exception { public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); - Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); + BuildLogCallback resultCallback = new BuildLogCallback(); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(resultCallback); + + resultCallback.awaitCompletion(); String imageId = null; - for (EventStreamItem item : response) { + for (BuildResponseItem item : resultCallback.items) { String text = item.getStream(); if (text.startsWith("Successfully built ")) { imageId = StringUtils.substringBetween(text, "Successfully built ", "\n").trim(); diff --git a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java index 415ca8f0b..657edf8d7 100644 --- a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java @@ -26,7 +26,7 @@ public class CommitCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java index e94c8c6c2..3db2b7282 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -27,7 +27,7 @@ public class ContainerDiffCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java index 72a97d04c..4f53bb774 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -17,7 +17,7 @@ public class CopyFileFromContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index 9876e43d5..d35efb636 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -26,7 +26,7 @@ public class CreateContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } 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 2d6ec9522..74ed3dae3 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -8,6 +8,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.client.AbstractDockerClientTest.BuildLogCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,18 +37,12 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { this.directory = directory; } - public void open() throws IOException { + public void open() throws Exception { LOGGER.info("building {}", directory); - InputStream response = dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() // remove - // alternatives, - // cause - // problems - .exec(); - String log = AbstractDockerClientTest.consumeAsString(response); - - assertThat(log, containsString("Successfully built")); + dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() + .exec(new BuildLogCallback()).awaitImageId(); Image lastCreatedImage = dockerClient.listImagesCmd().exec().get(0); diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java deleted file mode 100644 index c311540b1..000000000 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.github.dockerjava.core.command; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.model.EventStreamItem; -import com.github.dockerjava.api.model.PullEventStreamItem; -import com.github.dockerjava.core.DockerClientBuilder; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import java.io.File; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; -import static org.hamcrest.core.AllOf.allOf; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.hamcrest.core.IsNull.nullValue; -import static org.testng.AssertJUnit.assertNull; - -@Test(groups = "integration") -public class EventStreamReaderITest { - - private DockerClient dockerClient; - - @BeforeTest - public void setUp() throws Exception { - dockerClient = DockerClientBuilder.getInstance().build(); - } - - @AfterTest - public void tearDown() throws Exception { - dockerClient.close(); - } - - @Test(groups = "ignoreInCircleCi") - public void pullCanBeStreamed() throws Exception { - - try (EventStreamReader reader = new EventStreamReader<>(dockerClient.pullImageCmd( - "busybox:latest").exec(), PullEventStreamItem.class)) { - ; - assertThat( - reader.readItem(), - allOf(hasProperty("status", equalTo("Pulling from busybox")), hasProperty("progress", nullValue()), - hasProperty("progressDetail", nullValue()))); - assertNull(reader.readItem()); - } - } - - @Test - public void buildCanBeStreamed() throws Exception { - - try (EventStreamReader reader = new EventStreamReader<>(dockerClient.buildImageCmd( - new File("src/test/resources/eventStreamReaderDockerfile")).exec(), EventStreamItem.class)) { - assertThat( - reader.readItem(), - allOf(hasProperty("stream", equalTo("Step 0 : FROM busybox:latest\n")), - hasProperty("error", nullValue()), hasProperty("errorDetail", nullValue()))); - assertNull(reader.readItem()); - - } - } -} \ No newline at end of file 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 eb490d7e9..c3f2c0075 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -31,7 +31,7 @@ private static String getEpochTime() { } @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -54,7 +54,7 @@ public void afterMethod(ITestResult result) { * This specific test may fail with boot2docker as time may not in sync with host system */ @Test - public void testEventStreamTimeBound() throws InterruptedException, IOException { + public void testEventStreamTimeBound() throws Exception { // Don't include other tests events TimeUnit.SECONDS.sleep(1); @@ -65,8 +65,7 @@ public void testEventStreamTimeBound() throws InterruptedException, IOException CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(startTime).withUntil(endTime); - eventsCmd.exec(); + dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback); boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); @@ -76,15 +75,14 @@ public void testEventStreamTimeBound() throws InterruptedException, IOException } @Test - public void testEventStreaming1() throws InterruptedException, IOException { + public void testEventStreaming1() throws Exception { // Don't include other tests events TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(getEpochTime()); - eventsCmd.exec(); + dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); generateEvents(); @@ -95,15 +93,14 @@ public void testEventStreaming1() throws InterruptedException, IOException { } @Test - public void testEventStreaming2() throws InterruptedException, IOException { + public void testEventStreaming2() throws Exception { // Don't include other tests events TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(getEpochTime()); - eventsCmd.exec(); + dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); generateEvents(); @@ -116,16 +113,18 @@ public void testEventStreaming2() throws InterruptedException, IOException { /** * This method generates {#link KNOWN_NUM_EVENTS} events */ - private int generateEvents() { + private int generateEvents() throws Exception { String testImage = "busybox"; - asString(dockerClient.pullImageCmd(testImage).exec()); + + dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec(); dockerClient.startContainerCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); return KNOWN_NUM_EVENTS; } - private class EventCallbackTest extends ResultCallbackTemplate { + private class EventCallbackTest extends ResultCallbackTemplate { private final CountDownLatch countDownLatch; diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java index d5ec79307..139c81f56 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -1,23 +1,27 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.ExecCreateCmdResponse; -import com.github.dockerjava.client.AbstractDockerClientTest; -import org.testng.ITestResult; -import org.testng.annotations.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; import java.lang.reflect.Method; import java.security.SecureRandom; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class ExecCreateCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index c3586a965..94934296b 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -1,24 +1,28 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.ExecCreateCmdResponse; -import com.github.dockerjava.client.AbstractDockerClientTest; -import org.testng.ITestResult; -import org.testng.annotations.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; import java.io.InputStream; import java.lang.reflect.Method; import java.security.SecureRandom; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class ExecStartCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } 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 6f847ebed..5f647b1f5 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -55,15 +55,15 @@ private List getLoggingFrames() throws Exception { AbstractDockerClientTest.CollectFramesCallback collectFramesCallback = new AbstractDockerClientTest.CollectFramesCallback(); - dockerClient.logContainerCmd(dockerfileFixture.getContainerId(), collectFramesCallback).withStdOut() + dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut() .withStdErr().withTailAll() // we can't follow stream here as it blocks reading from resulting InputStream infinitely // .withFollowStream() - .exec(); + .exec(collectFramesCallback); - collectFramesCallback.awaitFinish(); + collectFramesCallback.awaitCompletion(); - return collectFramesCallback.frames; + return collectFramesCallback.items; } @Test diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index 19e275078..f6551d573 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -1,5 +1,9 @@ package com.github.dockerjava.core.command; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + import java.lang.reflect.Method; import org.testng.ITestResult; @@ -14,15 +18,11 @@ import com.github.dockerjava.api.model.Info; import com.github.dockerjava.client.AbstractDockerClientTest; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.isEmptyOrNullString; -import static org.hamcrest.Matchers.not; - @Test(groups = "integration") public class InfoCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 69f4d78e1..62f530bf2 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -1,30 +1,33 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectExecResponse; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.test.serdes.JSONTestHelper; -import java.io.IOException; - -import org.testng.ITestResult; -import org.testng.annotations.*; - -import java.io.InputStream; -import java.lang.reflect.Method; -import java.security.SecureRandom; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; @Test(groups = "integration") public class InspectExecCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java index e60930d88..6346ce165 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -29,7 +29,7 @@ public class KillContainerCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(KillContainerCmdImplTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } 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 2f052f841..1669728c9 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -35,7 +35,7 @@ public class ListContainersCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -54,12 +54,12 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - public void testListContainers() throws DockerException { + public void testListContainers() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - asString(dockerClient.pullImageCmd(testImage).exec()); + dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); @@ -102,12 +102,12 @@ public void testListContainers() throws DockerException { } @Test - public void testListContainersWithLabelsFilter() throws DockerException { + public void testListContainersWithLabelsFilter() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - asString(dockerClient.pullImageCmd(testImage).exec()); + dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index e91641eeb..d47dbb50a 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -23,7 +23,7 @@ public class ListImagesCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } 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 7453b3402..f3c8f0222 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -7,8 +7,6 @@ import java.io.IOException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -17,18 +15,15 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; 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; -import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class LogContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -66,9 +61,9 @@ public void asyncLogContainer() throws Exception { CollectFramesCallback loggingCallback = new CollectFramesCallback(); - dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); - loggingCallback.awaitFinish(); + loggingCallback.awaitCompletion(); assertTrue(loggingCallback.toString().contains(snippet)); } @@ -98,9 +93,7 @@ public void onComplete() { }; }; - dockerClient.logContainerCmd("non-existing", loggingCallback).withStdErr().withStdOut().exec(); - - loggingCallback.awaitFinish(); + dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec(loggingCallback).awaitCompletion(); } @Test @@ -122,21 +115,21 @@ public void asyncMultipleLogContainer() throws Exception { CollectFramesCallback loggingCallback = new CollectFramesCallback(); - dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); loggingCallback = new CollectFramesCallback(); - dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); loggingCallback = new CollectFramesCallback(); - dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); - loggingCallback.awaitFinish(); + loggingCallback.awaitCompletion(); 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 f3871e042..83c433775 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -1,34 +1,38 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.notNullValue; + +import java.lang.reflect.Method; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.api.model.PullResponseItem; import com.github.dockerjava.client.AbstractDockerClientTest; -import org.testng.ITestResult; -import org.testng.annotations.*; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Method; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; @Test(groups = "integration") public class PullImageCmdImplTest extends AbstractDockerClientTest { private static final PullImageCmd.Exec NOP_EXEC = new PullImageCmd.Exec() { - @Override - public InputStream exec(PullImageCmd command) { + public Void exec(PullImageCmd command, ResultCallback resultCallback) { return null; - } + }; }; @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -55,11 +59,13 @@ public void nullAuthConfig() throws Exception { fail(); } catch (Exception e) { assertEquals(e.getMessage(), "authConfig was not specified"); + } finally { + pullImageCmd.close(); } } @Test - public void testPullImage() throws DockerException, IOException { + public void testPullImage() throws Exception { Info info = dockerClient.infoCmd().exec(); LOG.info("Client info: {}", info.toString()); @@ -89,9 +95,11 @@ public void testPullImage() throws DockerException, IOException { LOG.info("Pulling image: {}", testImage); - InputStream response = dockerClient.pullImageCmd(testImage).exec(); + PullResponseCallback callback = dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()); + + callback.awaitCompletion(); - assertThat(asString(response), containsString("Download complete")); + assertThat(callback.toString(), containsString("Download complete")); info = dockerClient.infoCmd().exec(); LOG.info("Client info after pull, {}", info.toString()); @@ -104,12 +112,11 @@ public void testPullImage() throws DockerException, IOException { } @Test - public void testPullNonExistingImage() throws DockerException, IOException { + public void testPullNonExistingImage() throws Exception { // does not throw an exception - InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); // stream needs to be fully read in order to close the underlying connection - asString(is); + dockerClient.pullImageCmd("xvxcv/foo").exec(new PullResponseCallback()).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 8498256a8..23eff6db4 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -1,17 +1,24 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.client.AbstractDockerClientTest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.ITestResult; -import org.testng.annotations.*; - -import java.lang.reflect.Method; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class PushImageCmdImplTest extends AbstractDockerClientTest { @@ -21,7 +28,7 @@ public class PushImageCmdImplTest extends AbstractDockerClientTest { String username; @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); username = dockerClient.authConfig().getUsername(); } @@ -54,20 +61,28 @@ public void pushLatest() throws Exception { String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); // we have to block until image is pushed - asString(dockerClient.pushImageCmd(username + "/busybox").exec()); + dockerClient.pushImageCmd(username + "/busybox").exec(new PushResponseCallback()).awaitCompletion(); LOG.info("Removing image: {}", imageId); dockerClient.removeImageCmd(imageId).exec(); - String response = asString(dockerClient.pullImageCmd(username + "/busybox").exec()); + PullResponseCallback pushCallback = dockerClient.pullImageCmd(username + "/busybox") + .exec(new PullResponseCallback()).awaitCompletion(); - assertThat(response, not(containsString("HTTP code: 404"))); + assertThat(pushCallback.toString(), not(containsString("HTTP code: 404"))); } @Test - public void pushExistentImage() throws Exception { + public void pushNonExistentImage() throws Exception { + + PushResponseCallback callback = dockerClient.pushImageCmd(username + "/xxx").exec(new PushResponseCallback()) + .awaitCompletion(); + + assertThat(callback.toString(), containsString("error")); + } + + public static class PushResponseCallback extends CollectStreamItemCallback { - assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); } } diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java index 22fbb096c..3241f0739 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -31,7 +31,7 @@ public class RemoveContainerCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(RemoveContainerCmdImplTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java index 1c0f3db1c..75f58828b 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -32,7 +32,7 @@ public class RemoveImageCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(RemoveImageCmdImplTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java index 866800163..1258cd7df 100644 --- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java @@ -25,7 +25,7 @@ public class RestartContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java index 9facdc2d9..ffc81d4e0 100644 --- a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java @@ -1,8 +1,11 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.client.AbstractDockerClientTest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; + +import java.io.InputStream; +import java.lang.reflect.Method; + import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,16 +16,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.InputStream; -import java.lang.reflect.Method; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class SaveImageCmdImplTest extends AbstractDockerClientTest { @@ -31,7 +25,7 @@ public class SaveImageCmdImplTest extends AbstractDockerClientTest { String username; @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java index f61ff078a..6b3d2adb9 100644 --- a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java @@ -26,7 +26,7 @@ public class SearchImagesCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index d690f4e13..ae323c4c0 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -46,7 +46,7 @@ public class StartContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index 5ccb01038..cd6646e6b 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -17,7 +17,6 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.StatsCmd; import com.github.dockerjava.api.model.Statistics; @@ -30,7 +29,7 @@ public class StatsCmdImplTest extends AbstractDockerClientTest { private static int NUM_STATS = 5; @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } @@ -54,7 +53,6 @@ public void testStatsStreaming() throws InterruptedException, IOException { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS); - StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch); String containerName = "generated_" + new SecureRandom().nextInt(); @@ -65,8 +63,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { dockerClient.startContainerCmd(container.getId()).exec(); - StatsCmd statsCmd = dockerClient.statsCmd(statsCallback).withContainerId(container.getId()); - statsCmd.exec(); + StatsCallbackTest statsCallback = dockerClient.statsCmd().withContainerId(container.getId()).exec(new StatsCallbackTest(countDownLatch)); countDownLatch.await(3, TimeUnit.SECONDS); boolean gotStats = statsCallback.gotStats(); @@ -84,7 +81,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { } - private class StatsCallbackTest extends ResultCallbackTemplate { + private class StatsCallbackTest extends ResultCallbackTemplate { private final CountDownLatch countDownLatch; private boolean gotStats = false; diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java index 8a2a2f13e..1342471ca 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -29,7 +29,7 @@ public class StopContainerCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(StopContainerCmdImplTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java index b7c8bc4ff..116d2b68d 100644 --- a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java @@ -12,7 +12,6 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; @@ -22,7 +21,7 @@ public class TagImageCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(TagImageCmdImplTest.class); @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java index edb5560e6..7bac10c6e 100644 --- a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java @@ -18,7 +18,7 @@ public class VersionCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); } diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 576506498..3b5172b9e 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -25,7 +25,7 @@ public class WaitContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws Exception { super.beforeTest(); }