Date: Wed, 17 Jun 2015 08:33:38 +0200
Subject: [PATCH 0036/1200] Refactored streaming API's
---
.../github/dockerjava/api/DockerClient.java | 174 ++--
.../dockerjava/api/async/ResultCallback.java | 18 +
.../dockerjava/api/async/StreamCallback.java | 18 -
.../api/command/AsyncDockerCmd.java | 20 +
.../api/command/AttachContainerCmd.java | 13 +-
.../dockerjava/api/command/EventsCmd.java | 14 +-
.../api/command/LogContainerCmd.java | 17 +-
.../dockerjava/api/command/StatsCmd.java | 19 +-
.../dockerjava/core/DockerClientImpl.java | 625 ++++++++-------
.../core/async/FrameStreamProcessor.java | 51 ++
.../core/async/JsonStreamProcessor.java | 59 ++
.../core/async/ResponseStreamProcessor.java | 20 +
.../core/async/ResultCallbackTemplate.java | 70 ++
.../core/command/AttachContainerCmdImpl.java | 34 +-
.../core/command/EventsCmdImpl.java | 31 +-
.../core/command/LogContainerCmdImpl.java | 30 +-
.../dockerjava/core/command/StatsCmdImpl.java | 18 +-
.../jaxrs/AttachContainerCmdExec.java | 30 +-
.../dockerjava/jaxrs/EventsCmdExec.java | 77 +-
.../dockerjava/jaxrs/LogContainerCmdExec.java | 26 +-
.../github/dockerjava/jaxrs/StatsCmdExec.java | 50 +-
.../jaxrs/async/AbstractCallbackNotifier.java | 78 ++
.../jaxrs/async/GETCallbackNotifier.java | 29 +
.../jaxrs/async/POSTCallbackNotifier.java | 29 +
.../dockerjava/jaxrs/util/Streaming.java | 52 --
.../client/AbstractDockerClientTest.java | 35 +
.../command/AttachContainerCmdImplTest.java | 70 ++
.../core/command/BuildImageCmdImplTest.java | 52 +-
.../command/CreateContainerCmdImplTest.java | 758 ++++++++----------
.../core/command/EventsCmdImplTest.java | 17 +-
.../core/command/ExecStartCmdImplTest.java | 30 +-
.../core/command/FrameReaderITest.java | 159 ++--
.../core/command/LogContainerCmdImplTest.java | 169 ++--
.../core/command/StatsCmdImplTest.java | 7 +-
34 files changed, 1648 insertions(+), 1251 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/async/ResultCallback.java
delete mode 100644 src/main/java/com/github/dockerjava/api/async/StreamCallback.java
create mode 100644 src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java
create mode 100644 src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
create mode 100644 src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java
create mode 100644 src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java
create mode 100644 src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java
delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 82f727355..ef16085bb 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -1,124 +1,158 @@
package com.github.dockerjava.api;
-import java.io.*;
-
-import com.github.dockerjava.api.command.*;
-import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback;
-import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback;
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+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.CreateImageCmd;
+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.AuthConfig;
+import com.github.dockerjava.api.model.Event;
+import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.Identifier;
+import com.github.dockerjava.api.model.Statistics;
// https://godoc.org/github.com/fsouza/go-dockerclient
public interface DockerClient extends Closeable {
- public AuthConfig authConfig() throws DockerException;
+ public AuthConfig authConfig() throws DockerException;
- /**
- * Authenticate with the server, useful for checking authentication.
- */
- public AuthCmd authCmd();
+ /**
+ * Authenticate with the server, useful for checking authentication.
+ */
+ public AuthCmd authCmd();
- public InfoCmd infoCmd();
+ public InfoCmd infoCmd();
- public PingCmd pingCmd();
+ public PingCmd pingCmd();
- public VersionCmd versionCmd();
+ public VersionCmd versionCmd();
- /**
- * * IMAGE API *
- */
+ /**
+ * * IMAGE API *
+ */
- public PullImageCmd pullImageCmd(String repository);
+ public PullImageCmd pullImageCmd(String repository);
- public PushImageCmd pushImageCmd(String name);
+ public PushImageCmd pushImageCmd(String name);
- public PushImageCmd pushImageCmd(Identifier identifier);
+ public PushImageCmd pushImageCmd(Identifier identifier);
- public CreateImageCmd createImageCmd(String repository,
- InputStream imageStream);
+ public CreateImageCmd createImageCmd(String repository, InputStream imageStream);
- public SearchImagesCmd searchImagesCmd(String term);
+ public SearchImagesCmd searchImagesCmd(String term);
- public RemoveImageCmd removeImageCmd(String imageId);
+ public RemoveImageCmd removeImageCmd(String imageId);
- public ListImagesCmd listImagesCmd();
+ public ListImagesCmd listImagesCmd();
- public InspectImageCmd inspectImageCmd(String imageId);
+ public InspectImageCmd inspectImageCmd(String imageId);
public SaveImageCmd saveImageCmd(String name);
- /**
- * * CONTAINER API *
- */
-
- public ListContainersCmd listContainersCmd();
-
- public CreateContainerCmd createContainerCmd(String image);
-
- /**
- * Creates a new {@link StartContainerCmd} for the container with the
- * given ID.
- * The command can then be further customized by using builder
- * methods on it like {@link StartContainerCmd#withDns(String...)}.
- *
- * If you customize the command, any existing configuration of the
- * target container will get reset to its default before applying the
- * new configuration. To preserve the existing configuration, use an
- * unconfigured {@link StartContainerCmd}.
- *
- * This command corresponds to the /containers/{id}/start
- * endpoint of the Docker Remote API.
- */
- public StartContainerCmd startContainerCmd(String containerId);
+ /**
+ * * CONTAINER API *
+ */
+
+ public ListContainersCmd listContainersCmd();
+
+ public CreateContainerCmd createContainerCmd(String image);
+
+ /**
+ * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further
+ * customized by using builder methods on it like {@link StartContainerCmd#withDns(String...)}.
+ *
+ * If you customize the command, any existing configuration of the target container will get reset to its default
+ * before applying the new configuration. To preserve the existing configuration, use an unconfigured
+ * {@link StartContainerCmd}.
+ *
+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API.
+ */
+ public StartContainerCmd startContainerCmd(String containerId);
public ExecCreateCmd execCreateCmd(String containerId);
- public InspectContainerCmd inspectContainerCmd(String containerId);
+ public InspectContainerCmd inspectContainerCmd(String containerId);
- public RemoveContainerCmd removeContainerCmd(String containerId);
+ public RemoveContainerCmd removeContainerCmd(String containerId);
- public WaitContainerCmd waitContainerCmd(String containerId);
+ public WaitContainerCmd waitContainerCmd(String containerId);
- public AttachContainerCmd attachContainerCmd(String containerId);
+ public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback);
public ExecStartCmd execStartCmd(String containerId);
public InspectExecCmd inspectExecCmd(String execId);
- public LogContainerCmd logContainerCmd(String containerId);
+ public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback);
- public CopyFileFromContainerCmd copyFileFromContainerCmd(
- String containerId, String resource);
+ public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource);
- public ContainerDiffCmd containerDiffCmd(String containerId);
+ public ContainerDiffCmd containerDiffCmd(String containerId);
- public StopContainerCmd stopContainerCmd(String containerId);
+ public StopContainerCmd stopContainerCmd(String containerId);
- public KillContainerCmd killContainerCmd(String containerId);
+ public KillContainerCmd killContainerCmd(String containerId);
- public RestartContainerCmd restartContainerCmd(String containerId);
+ public RestartContainerCmd restartContainerCmd(String containerId);
- public CommitCmd commitCmd(String containerId);
+ public CommitCmd commitCmd(String containerId);
public BuildImageCmd buildImageCmd();
- public BuildImageCmd buildImageCmd(File dockerFileOrFolder);
+ public BuildImageCmd buildImageCmd(File dockerFileOrFolder);
- public BuildImageCmd buildImageCmd(InputStream tarInputStream);
+ public BuildImageCmd buildImageCmd(InputStream tarInputStream);
- public TopContainerCmd topContainerCmd(String containerId);
+ public TopContainerCmd topContainerCmd(String containerId);
- public TagImageCmd tagImageCmd(String imageId, String repository, String tag);
+ public TagImageCmd tagImageCmd(String imageId, String repository, String tag);
- public PauseContainerCmd pauseContainerCmd(String containerId);
+ public PauseContainerCmd pauseContainerCmd(String containerId);
- public UnpauseContainerCmd unpauseContainerCmd(String containerId);
+ public UnpauseContainerCmd unpauseContainerCmd(String containerId);
- public EventsCmd eventsCmd(EventStreamCallback eventCallback);
+ public EventsCmd eventsCmd(ResultCallback resultCallback);
- public StatsCmd statsCmd(StatisticsCallback statisticsCallback);
+ public StatsCmd statsCmd(ResultCallback resultCallback);
- @Override
- public void close() throws IOException;
+ @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
new file mode 100644
index 000000000..f4f519d3e
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
@@ -0,0 +1,18 @@
+package com.github.dockerjava.api.async;
+
+import java.io.Closeable;
+
+/**
+ * Result callback
+ */
+public interface ResultCallback {
+ /** Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the processing */
+ void onStart(Closeable closeable);
+ /** Called when an async result event occurs */
+ void onResult(RES_T object);
+ /** Called when an exception occurs while processing */
+ void onError(Throwable throwable);
+ /** Called when processing was finished either by reaching the end or by aborting it */
+ void onFinish();
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/async/StreamCallback.java b/src/main/java/com/github/dockerjava/api/async/StreamCallback.java
deleted file mode 100644
index b719c227c..000000000
--- a/src/main/java/com/github/dockerjava/api/async/StreamCallback.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.github.dockerjava.api.async;
-
-import java.io.Closeable;
-
-/**
- * Stream callback
- */
-public interface StreamCallback {
- /** Called when the stream starts. The passed {@link Closeable} can be used to close/interrupt the stream */
- void onStart(Closeable stream);
- /** Called when a stream event occurs */
- void onStream(T object);
- /** Called when an exception occurs while processing the stream */
- void onError(Throwable throwable);
- /** Called when streaming was finished either by reaching the end of the stream or by aborting it */
- void onFinish();
-
-}
diff --git a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java
new file mode 100644
index 000000000..4745fae18
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java
@@ -0,0 +1,20 @@
+/*
+ * Created on 17.06.2015
+ */
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallback;
+
+/**
+ *
+ *
+ * @author marcus
+ *
+ */
+public interface AsyncDockerCmd, A_RES_T, RES_T> extends DockerCmd {
+
+ public ResultCallback getResultCallback();
+
+ public CMD_T withResultCallback(ResultCallback 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 0fb72d452..ffb282095 100644
--- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
@@ -4,13 +4,14 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.Frame;
/**
* Attach to container
- *
+ *
* @param logs
* - true or false, includes logs. Defaults to false.
- *
+ *
* @param followStream
* - true or false, return stream. Defaults to false.
* @param stdout
@@ -21,7 +22,7 @@
* - true or false, if true, print timestamps for every log line.
* Defaults to false.
*/
-public interface AttachContainerCmd extends DockerCmd {
+public interface AttachContainerCmd extends AsyncDockerCmd {
public String getContainerId();
@@ -67,15 +68,15 @@ public interface AttachContainerCmd 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 Void exec() throws NotFoundException;
public static interface Exec extends
- DockerCmdExec {
+ DockerCmdExec {
}
}
\ No newline at end of file
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 fdab3700e..17ec37248 100644
--- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
@@ -1,6 +1,5 @@
package com.github.dockerjava.api.command;
-import com.github.dockerjava.api.async.StreamCallback;
import com.github.dockerjava.api.model.Event;
@@ -10,7 +9,7 @@
* @param since - Show all events created since timestamp
* @param until - Stream events until this timestamp
*/
-public interface EventsCmd extends DockerCmd {
+public interface EventsCmd extends AsyncDockerCmd {
public EventsCmd withSince(String since);
public EventsCmd withUntil(String until);
@@ -19,17 +18,6 @@ public interface EventsCmd extends DockerCmd {
public String getUntil();
- public EventStreamCallback getEventCallback();
-
- public EventsCmd withEventCallback(EventStreamCallback eventCallback);
-
public static interface Exec extends DockerCmdExec {
}
-
- /**
- * {@link Event} stream callback
- */
- public interface EventStreamCallback extends StreamCallback {
- }
-
}
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 c966ef953..2eff3c217 100644
--- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
@@ -2,12 +2,14 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.Frame;
import java.io.InputStream;
+import java.util.concurrent.Future;
/**
* Get container logs
- *
+ *
* @param followStream
* - true or false, return stream. Defaults to false.
* @param stdout
@@ -20,13 +22,12 @@
* @param tail
* - `all` or ``, Output specified number of lines at the end
* of logs
- *
+ *
* Consider wrapping any input stream you get with a frame reader to
* make reading frame easier.
- *
- * @see com.github.dockerjava.core.command.FrameReader
+ *
*/
-public interface LogContainerCmd extends DockerCmd {
+public interface LogContainerCmd extends AsyncDockerCmd {
public String getContainerId();
@@ -74,15 +75,15 @@ public interface LogContainerCmd 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 Void exec() throws NotFoundException;
public static interface Exec extends
- DockerCmdExec {
+ DockerCmdExec {
}
}
\ No newline at end of file
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 d06d09835..0547cc616 100644
--- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
@@ -1,28 +1,17 @@
package com.github.dockerjava.api.command;
-import com.github.dockerjava.api.async.StreamCallback;
import com.github.dockerjava.api.model.Statistics;
/**
- * Get stats
- *
+ * 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 DockerCmd {
+public interface StatsCmd extends AsyncDockerCmd {
public StatsCmd withContainerId(String containerId);
public String getContainerId();
- public StatsCmd withStatisticsCallback(StatisticsCallback callback);
-
- public StatisticsCallback getStatisticsCallback();
-
public static interface Exec extends DockerCmdExec {
}
-
- /**
- * {@link Statistics} stream callback
- */
- public interface StatisticsCallback extends StreamCallback {
- }
-
}
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
index 4503e4f17..b9bdb7edc 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -8,13 +8,86 @@
import java.io.InputStream;
import com.github.dockerjava.api.DockerClient;
-import com.github.dockerjava.api.command.*;
-import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback;
-import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback;
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+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.CreateImageCmd;
+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.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
+import com.github.dockerjava.api.model.Event;
+import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.Identifier;
-import com.github.dockerjava.core.command.*;
+import com.github.dockerjava.api.model.Statistics;
+import com.github.dockerjava.core.command.AttachContainerCmdImpl;
+import com.github.dockerjava.core.command.AuthCmdImpl;
+import com.github.dockerjava.core.command.BuildImageCmdImpl;
+import com.github.dockerjava.core.command.CommitCmdImpl;
+import com.github.dockerjava.core.command.ContainerDiffCmdImpl;
+import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl;
+import com.github.dockerjava.core.command.CreateContainerCmdImpl;
+import com.github.dockerjava.core.command.CreateImageCmdImpl;
+import com.github.dockerjava.core.command.EventsCmdImpl;
+import com.github.dockerjava.core.command.ExecCreateCmdImpl;
+import com.github.dockerjava.core.command.ExecStartCmdImpl;
+import com.github.dockerjava.core.command.InfoCmdImpl;
+import com.github.dockerjava.core.command.InspectContainerCmdImpl;
+import com.github.dockerjava.core.command.InspectExecCmdImpl;
+import com.github.dockerjava.core.command.InspectImageCmdImpl;
+import com.github.dockerjava.core.command.KillContainerCmdImpl;
+import com.github.dockerjava.core.command.ListContainersCmdImpl;
+import com.github.dockerjava.core.command.ListImagesCmdImpl;
+import com.github.dockerjava.core.command.LogContainerCmdImpl;
+import com.github.dockerjava.core.command.PauseContainerCmdImpl;
+import com.github.dockerjava.core.command.PingCmdImpl;
+import com.github.dockerjava.core.command.PullImageCmdImpl;
+import com.github.dockerjava.core.command.PushImageCmdImpl;
+import com.github.dockerjava.core.command.RemoveContainerCmdImpl;
+import com.github.dockerjava.core.command.RemoveImageCmdImpl;
+import com.github.dockerjava.core.command.RestartContainerCmdImpl;
+import com.github.dockerjava.core.command.SaveImageCmdImpl;
+import com.github.dockerjava.core.command.SearchImagesCmdImpl;
+import com.github.dockerjava.core.command.StartContainerCmdImpl;
+import com.github.dockerjava.core.command.StatsCmdImpl;
+import com.github.dockerjava.core.command.StopContainerCmdImpl;
+import com.github.dockerjava.core.command.TagImageCmdImpl;
+import com.github.dockerjava.core.command.TopContainerCmdImpl;
+import com.github.dockerjava.core.command.UnpauseContainerCmdImpl;
+import com.github.dockerjava.core.command.VersionCmdImpl;
+import com.github.dockerjava.core.command.WaitContainerCmdImpl;
/**
* @author Konstantin Pelykh (kpelykh@gmail.com)
@@ -23,221 +96,197 @@
*/
public class DockerClientImpl implements Closeable, DockerClient {
- private final DockerClientConfig dockerClientConfig;
-
- private DockerCmdExecFactory dockerCmdExecFactory;
-
- private DockerClientImpl() {
- this(DockerClientConfig.createDefaultConfigBuilder().build());
- }
-
- private DockerClientImpl(String serverUrl) {
- this(configWithServerUrl(serverUrl));
- }
-
- private DockerClientImpl(DockerClientConfig dockerClientConfig) {
- checkNotNull(dockerClientConfig,
- "config was not specified");
- this.dockerClientConfig = dockerClientConfig;
- }
-
- private static DockerClientConfig configWithServerUrl(String serverUrl) {
- return DockerClientConfig.createDefaultConfigBuilder()
- .withUri(serverUrl).build();
- }
-
- public static DockerClientImpl getInstance() {
- return new DockerClientImpl();
- }
-
- public static DockerClientImpl getInstance(
- DockerClientConfig dockerClientConfig) {
- return new DockerClientImpl(dockerClientConfig);
- }
-
- public static DockerClientImpl getInstance(String serverUrl) {
- return new DockerClientImpl(serverUrl);
- }
-
- public DockerClientImpl withDockerCmdExecFactory(
- DockerCmdExecFactory dockerCmdExecFactory) {
- checkNotNull(dockerCmdExecFactory,
- "dockerCmdExecFactory was not specified");
- this.dockerCmdExecFactory = dockerCmdExecFactory;
- this.dockerCmdExecFactory.init(dockerClientConfig);
- return this;
- }
-
- private DockerCmdExecFactory getDockerCmdExecFactory() {
- checkNotNull(dockerCmdExecFactory,
- "dockerCmdExecFactory was not specified");
- return dockerCmdExecFactory;
- }
-
- @Override
- public AuthConfig authConfig() {
- checkNotNull(dockerClientConfig.getUsername(),
- "Configured username is null.");
- checkNotNull(dockerClientConfig.getServerAddress(),
- "Configured serverAddress is null.");
-
- AuthConfig authConfig = new AuthConfig();
- authConfig.setUsername(dockerClientConfig.getUsername());
- authConfig.setPassword(dockerClientConfig.getPassword());
- authConfig.setEmail(dockerClientConfig.getEmail());
- authConfig.setServerAddress(dockerClientConfig.getServerAddress());
-
- return authConfig;
- }
-
- /**
- * * MISC API *
- */
-
- /**
- * Authenticate with the server, useful for checking authentication.
- */
- @Override
- public AuthCmd authCmd() {
- return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(),
- authConfig());
- }
-
- @Override
- public InfoCmd infoCmd() {
- return new InfoCmdImpl(getDockerCmdExecFactory().createInfoCmdExec());
- }
-
- @Override
- public PingCmd pingCmd() {
- return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec());
- }
-
- @Override
- public VersionCmd versionCmd() {
- return new VersionCmdImpl(getDockerCmdExecFactory()
- .createVersionCmdExec());
- }
-
- /**
- * * IMAGE API *
- */
- @Override
- public PullImageCmd pullImageCmd(String repository) {
- return new PullImageCmdImpl(getDockerCmdExecFactory()
- .createPullImageCmdExec(), dockerClientConfig.effectiveAuthConfig(repository), repository);
- }
-
- @Override
- public PushImageCmd pushImageCmd(String name) {
- PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory()
- .createPushImageCmdExec(), name);
-
- AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name);
- if( cfg != null )
+ private final DockerClientConfig dockerClientConfig;
+
+ private DockerCmdExecFactory dockerCmdExecFactory;
+
+ private DockerClientImpl() {
+ this(DockerClientConfig.createDefaultConfigBuilder().build());
+ }
+
+ private DockerClientImpl(String serverUrl) {
+ this(configWithServerUrl(serverUrl));
+ }
+
+ private DockerClientImpl(DockerClientConfig dockerClientConfig) {
+ checkNotNull(dockerClientConfig, "config was not specified");
+ this.dockerClientConfig = dockerClientConfig;
+ }
+
+ private static DockerClientConfig configWithServerUrl(String serverUrl) {
+ return DockerClientConfig.createDefaultConfigBuilder().withUri(serverUrl).build();
+ }
+
+ public static DockerClientImpl getInstance() {
+ return new DockerClientImpl();
+ }
+
+ public static DockerClientImpl getInstance(DockerClientConfig dockerClientConfig) {
+ return new DockerClientImpl(dockerClientConfig);
+ }
+
+ public static DockerClientImpl getInstance(String serverUrl) {
+ return new DockerClientImpl(serverUrl);
+ }
+
+ public DockerClientImpl withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) {
+ checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified");
+ this.dockerCmdExecFactory = dockerCmdExecFactory;
+ this.dockerCmdExecFactory.init(dockerClientConfig);
+ return this;
+ }
+
+ private DockerCmdExecFactory getDockerCmdExecFactory() {
+ checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified");
+ return dockerCmdExecFactory;
+ }
+
+ @Override
+ public AuthConfig authConfig() {
+ checkNotNull(dockerClientConfig.getUsername(), "Configured username is null.");
+ checkNotNull(dockerClientConfig.getServerAddress(), "Configured serverAddress is null.");
+
+ AuthConfig authConfig = new AuthConfig();
+ authConfig.setUsername(dockerClientConfig.getUsername());
+ authConfig.setPassword(dockerClientConfig.getPassword());
+ authConfig.setEmail(dockerClientConfig.getEmail());
+ authConfig.setServerAddress(dockerClientConfig.getServerAddress());
+
+ return authConfig;
+ }
+
+ /**
+ * * MISC API *
+ */
+
+ /**
+ * Authenticate with the server, useful for checking authentication.
+ */
+ @Override
+ public AuthCmd authCmd() {
+ return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), authConfig());
+ }
+
+ @Override
+ public InfoCmd infoCmd() {
+ return new InfoCmdImpl(getDockerCmdExecFactory().createInfoCmdExec());
+ }
+
+ @Override
+ public PingCmd pingCmd() {
+ return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec());
+ }
+
+ @Override
+ public VersionCmd versionCmd() {
+ return new VersionCmdImpl(getDockerCmdExecFactory().createVersionCmdExec());
+ }
+
+ /**
+ * * IMAGE API *
+ */
+ @Override
+ public PullImageCmd pullImageCmd(String repository) {
+ return new PullImageCmdImpl(getDockerCmdExecFactory().createPullImageCmdExec(),
+ dockerClientConfig.effectiveAuthConfig(repository), repository);
+ }
+
+ @Override
+ public PushImageCmd pushImageCmd(String name) {
+ PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory().createPushImageCmdExec(), name);
+
+ AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name);
+ if (cfg != null)
cmd.withAuthConfig(cfg);
- return cmd;
- }
+ return cmd;
+ }
- @Override
- public PushImageCmd pushImageCmd(Identifier identifier) {
- PushImageCmd cmd = pushImageCmd(identifier.repository.name);
- if( identifier.tag.isPresent() )
+ @Override
+ public PushImageCmd pushImageCmd(Identifier identifier) {
+ PushImageCmd cmd = pushImageCmd(identifier.repository.name);
+ if (identifier.tag.isPresent())
cmd.withTag(identifier.tag.get());
- AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(identifier.repository.name);
- if( cfg != null )
+ AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(identifier.repository.name);
+ if (cfg != null)
cmd.withAuthConfig(cfg);
- return cmd;
- }
+ return cmd;
+ }
- @Override
+ @Override
public SaveImageCmd saveImageCmd(String name) {
return new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name);
}
- @Override
- public CreateImageCmd createImageCmd(String repository,
- InputStream imageStream) {
- return new CreateImageCmdImpl(getDockerCmdExecFactory()
- .createCreateImageCmdExec(), repository, imageStream);
- }
-
- @Override
- public SearchImagesCmd searchImagesCmd(String term) {
- return new SearchImagesCmdImpl(getDockerCmdExecFactory()
- .createSearchImagesCmdExec(), term);
- }
-
- @Override
- public RemoveImageCmd removeImageCmd(String imageId) {
- return new RemoveImageCmdImpl(getDockerCmdExecFactory()
- .createRemoveImageCmdExec(), imageId);
- }
-
- @Override
- public ListImagesCmd listImagesCmd() {
- return new ListImagesCmdImpl(getDockerCmdExecFactory()
- .createListImagesCmdExec());
- }
-
- @Override
- public InspectImageCmd inspectImageCmd(String imageId) {
- return new InspectImageCmdImpl(getDockerCmdExecFactory()
- .createInspectImageCmdExec(), imageId);
- }
-
- /**
- * * CONTAINER API *
- */
-
- @Override
- public ListContainersCmd listContainersCmd() {
- return new ListContainersCmdImpl(getDockerCmdExecFactory()
- .createListContainersCmdExec());
- }
-
- @Override
- public CreateContainerCmd createContainerCmd(String image) {
- return new CreateContainerCmdImpl(getDockerCmdExecFactory()
- .createCreateContainerCmdExec(), image);
- }
-
- @Override
- public StartContainerCmd startContainerCmd(String containerId) {
- return new StartContainerCmdImpl(getDockerCmdExecFactory()
- .createStartContainerCmdExec(), containerId);
- }
-
- @Override
- public InspectContainerCmd inspectContainerCmd(String containerId) {
- return new InspectContainerCmdImpl(getDockerCmdExecFactory()
- .createInspectContainerCmdExec(), containerId);
- }
+ @Override
+ public CreateImageCmd createImageCmd(String repository, InputStream imageStream) {
+ return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream);
+ }
+
+ @Override
+ public SearchImagesCmd searchImagesCmd(String term) {
+ return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term);
+ }
+
+ @Override
+ public RemoveImageCmd removeImageCmd(String imageId) {
+ return new RemoveImageCmdImpl(getDockerCmdExecFactory().createRemoveImageCmdExec(), imageId);
+ }
+
+ @Override
+ public ListImagesCmd listImagesCmd() {
+ return new ListImagesCmdImpl(getDockerCmdExecFactory().createListImagesCmdExec());
+ }
+
+ @Override
+ public InspectImageCmd inspectImageCmd(String imageId) {
+ return new InspectImageCmdImpl(getDockerCmdExecFactory().createInspectImageCmdExec(), imageId);
+ }
+
+ /**
+ * * CONTAINER API *
+ */
+
+ @Override
+ public ListContainersCmd listContainersCmd() {
+ return new ListContainersCmdImpl(getDockerCmdExecFactory().createListContainersCmdExec());
+ }
+
+ @Override
+ public CreateContainerCmd createContainerCmd(String image) {
+ return new CreateContainerCmdImpl(getDockerCmdExecFactory().createCreateContainerCmdExec(), image);
+ }
+
+ @Override
+ public StartContainerCmd startContainerCmd(String containerId) {
+ return new StartContainerCmdImpl(getDockerCmdExecFactory().createStartContainerCmdExec(), containerId);
+ }
+
+ @Override
+ public InspectContainerCmd inspectContainerCmd(String containerId) {
+ return new InspectContainerCmdImpl(getDockerCmdExecFactory().createInspectContainerCmdExec(), containerId);
+ }
@Override
public ExecCreateCmd execCreateCmd(String containerId) {
return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId);
}
- @Override
- public RemoveContainerCmd removeContainerCmd(String containerId) {
- return new RemoveContainerCmdImpl(getDockerCmdExecFactory()
- .createRemoveContainerCmdExec(), containerId);
- }
+ @Override
+ public RemoveContainerCmd removeContainerCmd(String containerId) {
+ return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId);
+ }
- @Override
- public WaitContainerCmd waitContainerCmd(String containerId) {
- return new WaitContainerCmdImpl(getDockerCmdExecFactory()
- .createWaitContainerCmdExec(), containerId);
- }
+ @Override
+ public WaitContainerCmd waitContainerCmd(String containerId) {
+ return new WaitContainerCmdImpl(getDockerCmdExecFactory().createWaitContainerCmdExec(), containerId);
+ }
- @Override
- public AttachContainerCmd attachContainerCmd(String containerId) {
- return new AttachContainerCmdImpl(getDockerCmdExecFactory()
- .createAttachContainerCmdExec(), containerId);
- }
+ @Override
+ public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback) {
+ return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId, resultCallback);
+ }
@Override
public ExecStartCmd execStartCmd(String containerId) {
@@ -250,114 +299,100 @@ public InspectExecCmd inspectExecCmd(String execId) {
}
@Override
- public LogContainerCmd logContainerCmd(String containerId) {
- return new LogContainerCmdImpl(getDockerCmdExecFactory()
- .createLogContainerCmdExec(), containerId);
- }
+ public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback) {
+ return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId, resultCallback);
+ }
- @Override
- public CopyFileFromContainerCmd copyFileFromContainerCmd(
- String containerId, String resource) {
- return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory()
- .createCopyFileFromContainerCmdExec(), containerId, resource);
- }
+ @Override
+ public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) {
+ return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(),
+ containerId, resource);
+ }
- @Override
- public ContainerDiffCmd containerDiffCmd(String containerId) {
- return new ContainerDiffCmdImpl(getDockerCmdExecFactory()
- .createContainerDiffCmdExec(), containerId);
- }
+ @Override
+ public ContainerDiffCmd containerDiffCmd(String containerId) {
+ return new ContainerDiffCmdImpl(getDockerCmdExecFactory().createContainerDiffCmdExec(), containerId);
+ }
- @Override
- public StopContainerCmd stopContainerCmd(String containerId) {
- return new StopContainerCmdImpl(getDockerCmdExecFactory()
- .createStopContainerCmdExec(), containerId);
- }
+ @Override
+ public StopContainerCmd stopContainerCmd(String containerId) {
+ return new StopContainerCmdImpl(getDockerCmdExecFactory().createStopContainerCmdExec(), containerId);
+ }
- @Override
- public KillContainerCmd killContainerCmd(String containerId) {
- return new KillContainerCmdImpl(getDockerCmdExecFactory()
- .createKillContainerCmdExec(), containerId);
- }
+ @Override
+ public KillContainerCmd killContainerCmd(String containerId) {
+ return new KillContainerCmdImpl(getDockerCmdExecFactory().createKillContainerCmdExec(), containerId);
+ }
- @Override
- public RestartContainerCmd restartContainerCmd(String containerId) {
- return new RestartContainerCmdImpl(getDockerCmdExecFactory()
- .createRestartContainerCmdExec(), containerId);
- }
+ @Override
+ public RestartContainerCmd restartContainerCmd(String containerId) {
+ return new RestartContainerCmdImpl(getDockerCmdExecFactory().createRestartContainerCmdExec(), containerId);
+ }
- @Override
- public CommitCmd commitCmd(String containerId) {
- return new CommitCmdImpl(getDockerCmdExecFactory()
- .createCommitCmdExec(), containerId);
- }
+ @Override
+ public CommitCmd commitCmd(String containerId) {
+ return new CommitCmdImpl(getDockerCmdExecFactory().createCommitCmdExec(), containerId);
+ }
@Override
public BuildImageCmd buildImageCmd() {
- return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec()));
+ return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec()));
}
- @Override
- public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
- return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec(), dockerFileOrFolder));
- }
+ @Override
+ public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
+ return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
+ dockerFileOrFolder));
+ }
@Override
public BuildImageCmd buildImageCmd(InputStream tarInputStream) {
- return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec(), tarInputStream));
- }
-
- private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) {
- final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations();
- if (!authConfigurations.getConfigs().isEmpty()) {
- buildImageCmd.withBuildAuthConfigs(authConfigurations);
- }
-
- return buildImageCmd;
- }
-
- @Override
- public TopContainerCmd topContainerCmd(String containerId) {
- return new TopContainerCmdImpl(getDockerCmdExecFactory()
- .createTopContainerCmdExec(), containerId);
- }
-
- @Override
- public TagImageCmd tagImageCmd(String imageId, String repository, String tag) {
- return new TagImageCmdImpl(getDockerCmdExecFactory()
- .createTagImageCmdExec(), imageId, repository, tag);
- }
-
- @Override
- public PauseContainerCmd pauseContainerCmd(String containerId) {
- return new PauseContainerCmdImpl(getDockerCmdExecFactory()
- .createPauseContainerCmdExec(), containerId);
- }
-
- @Override
- public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
- return new UnpauseContainerCmdImpl(getDockerCmdExecFactory()
- .createUnpauseContainerCmdExec(), containerId);
- }
-
- @Override
- public EventsCmd eventsCmd(EventStreamCallback eventCallback) {
- return new EventsCmdImpl(getDockerCmdExecFactory()
- .createEventsCmdExec(), eventCallback);
- }
-
- @Override
- public StatsCmd statsCmd(StatisticsCallback statisticsCallback) {
- return new StatsCmdImpl(getDockerCmdExecFactory()
- .createStatsCmdExec(), statisticsCallback);
- }
-
- @Override
- public void close() throws IOException {
- getDockerCmdExecFactory().close();
- }
+ return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
+ tarInputStream));
+ }
+
+ private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) {
+ final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations();
+ if (!authConfigurations.getConfigs().isEmpty()) {
+ buildImageCmd.withBuildAuthConfigs(authConfigurations);
+ }
+
+ return buildImageCmd;
+ }
+
+ @Override
+ public TopContainerCmd topContainerCmd(String containerId) {
+ return new TopContainerCmdImpl(getDockerCmdExecFactory().createTopContainerCmdExec(), containerId);
+ }
+
+ @Override
+ public TagImageCmd tagImageCmd(String imageId, String repository, String tag) {
+ return new TagImageCmdImpl(getDockerCmdExecFactory().createTagImageCmdExec(), imageId, repository, tag);
+ }
+
+ @Override
+ public PauseContainerCmd pauseContainerCmd(String containerId) {
+ return new PauseContainerCmdImpl(getDockerCmdExecFactory().createPauseContainerCmdExec(), containerId);
+ }
+
+ @Override
+ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
+ return new UnpauseContainerCmdImpl(getDockerCmdExecFactory().createUnpauseContainerCmdExec(), containerId);
+ }
+
+ @Override
+ public EventsCmd eventsCmd(ResultCallback eventCallback) {
+ return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback);
+ }
+
+ @Override
+ public StatsCmd statsCmd(ResultCallback statisticsCallback) {
+ return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), statisticsCallback);
+ }
+
+ @Override
+ public void close() throws IOException {
+ getDockerCmdExecFactory().close();
+ }
}
diff --git a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
new file mode 100644
index 000000000..cc6474d09
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
@@ -0,0 +1,51 @@
+/*
+ * Created on 23.06.2015
+ */
+package com.github.dockerjava.core.async;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.core.command.FrameReader;
+
+/**
+ *
+ *
+ * @author marcus
+ *
+ */
+public class FrameStreamProcessor implements ResponseStreamProcessor {
+
+ @Override
+ public void processResponseStream(InputStream response, ResultCallback resultCallback) {
+ resultCallback.onStart(response);
+
+ FrameReader frameReader = new FrameReader(response);
+ try {
+
+ Frame frame = frameReader.readFrame();
+ while (frame != null) {
+ try {
+ resultCallback.onResult(frame);
+ } catch (Exception e) {
+ resultCallback.onError(e);
+ } finally {
+ frame = frameReader.readFrame();
+ }
+ }
+ } catch (Throwable t) {
+ resultCallback.onError(t);
+ } finally {
+ try {
+ frameReader.close();
+ response.close();
+ } catch (IOException e) {
+ resultCallback.onError(e);
+ } finally {
+ resultCallback.onFinish();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java
new file mode 100644
index 000000000..24d83b129
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java
@@ -0,0 +1,59 @@
+/*
+ * Created on 18.06.2015
+ */
+package com.github.dockerjava.core.async;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.api.async.ResultCallback;
+
+/**
+ *
+ * @author marcus
+ *
+ */
+public class JsonStreamProcessor implements ResponseStreamProcessor {
+
+ private static final JsonFactory JSON_FACTORY = new JsonFactory();
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private final Class clazz;
+
+ public JsonStreamProcessor(Class clazz) {
+ this.clazz = clazz;
+ }
+
+ @Override
+ public void processResponseStream(InputStream response, ResultCallback resultCallback) {
+
+ resultCallback.onStart(response);
+
+ try {
+ JsonParser jp = JSON_FACTORY.createParser(response);
+ while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) {
+ try {
+ resultCallback.onResult(OBJECT_MAPPER.readValue(jp, clazz));
+ } catch (Exception e) {
+ resultCallback.onError(e);
+ }
+ }
+ } catch (Throwable t) {
+ resultCallback.onError(t);
+ } finally {
+ try {
+ response.close();
+ } catch (IOException e) {
+ resultCallback.onError(e);
+ } finally {
+ resultCallback.onFinish();
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java
new file mode 100644
index 000000000..c88575889
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java
@@ -0,0 +1,20 @@
+/*
+ * Created on 18.06.2015
+ */
+package com.github.dockerjava.core.async;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.async.ResultCallback;
+
+/**
+ *
+ * @author marcus
+ *
+ */
+public interface ResponseStreamProcessor {
+
+ void processResponseStream(InputStream response,
+ ResultCallback resultCallback);
+
+}
diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
new file mode 100644
index 000000000..c98cddf4c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
@@ -0,0 +1,70 @@
+/*
+ * Created on 16.06.2015
+ */
+package com.github.dockerjava.core.async;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.github.dockerjava.api.async.ResultCallback;
+
+/**
+ * Template implementation of {@link ResultCallback}
+ *
+ * @author marcus
+ *
+ */
+public class ResultCallbackTemplate implements ResultCallback, Closeable {
+
+ private final CountDownLatch finished = new CountDownLatch(1);
+
+ private Closeable stream;
+
+ @Override
+ public void onStart(Closeable stream) {
+ this.stream = stream;
+ }
+
+ @Override
+ public void onResult(T object) {
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ try {
+ throw new RuntimeException(throwable);
+ } finally {
+ try {
+ close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @Override
+ public void onFinish() {
+ try {
+ close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if(stream != null)
+ stream.close();
+ finished.countDown();
+ }
+
+ public void awaitFinish() throws InterruptedException {
+ finished.await();
+ }
+
+ public void awaitFinish(long timeout, TimeUnit timeUnit) throws InterruptedException {
+ finished.await(timeout, timeUnit);
+ }
+}
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 fc38ae7d9..749f61500 100644
--- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java
@@ -2,17 +2,17 @@
import static com.google.common.base.Preconditions.checkNotNull;
-import java.io.InputStream;
-
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.model.Frame;
/**
* Attach to container
- *
+ *
* @param logs
* - true or false, includes logs. Defaults to false.
- *
+ *
* @param followStream
* - true or false, return stream. Defaults to false.
* @param stdout
@@ -23,17 +23,31 @@
* - true or false, if true, print timestamps for every log line.
* Defaults to false.
*/
-public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd {
+public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd {
+
+ private ResultCallback resultCallback;
private String containerId;
private boolean logs, followStream, timestamps, stdout, stderr;
- public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId) {
+ public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) {
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
public String getContainerId() {
return containerId;
@@ -115,17 +129,17 @@ public AttachContainerCmd withLogs(boolean logs) {
this.logs = logs;
return this;
}
-
+
@Override
public AttachContainerCmd withLogs() {
return withLogs(true);
}
-
+
/**
- * @throws NotFoundException No such container
+ * @throws NotFoundException No such container
*/
@Override
- public InputStream exec() throws NotFoundException {
+ public Void exec() throws NotFoundException {
return super.exec();
}
}
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 07180bdf9..d1de2e60f 100644
--- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java
@@ -1,6 +1,8 @@
package com.github.dockerjava.core.command;
+import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.model.Event;
/**
* Stream docker events
@@ -8,12 +10,14 @@
public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd {
private String since;
+
private String until;
- private EventStreamCallback eventCallback;
- public EventsCmdImpl(EventsCmd.Exec exec, EventStreamCallback eventCallback) {
+ private ResultCallback resultCallback;
+
+ public EventsCmdImpl(EventsCmd.Exec exec, ResultCallback resultCallback) {
super(exec);
- withEventCallback(eventCallback);
+ withResultCallback(resultCallback);
}
@Override
@@ -27,10 +31,10 @@ public EventsCmd withUntil(String until) {
this.until = until;
return this;
}
-
+
@Override
- public EventsCmd withEventCallback(EventStreamCallback eventCallback) {
- this.eventCallback = eventCallback;
+ public EventsCmd withResultCallback(ResultCallback resultCallback) {
+ this.resultCallback = resultCallback;
return this;
}
@@ -45,20 +49,13 @@ public String getUntil() {
}
@Override
- public EventStreamCallback getEventCallback() {
- return eventCallback;
+ public ResultCallback getResultCallback() {
+ return resultCallback;
}
-// @Override
-// public InputStream exec() {
-// return super.exec();
-// }
-
@Override
public String toString() {
- return new StringBuilder("events")
- .append(since != null ? " --since=" + since : "")
- .append(until != null ? " --until=" + until : "")
- .toString();
+ return new StringBuilder("events").append(since != null ? " --since=" + since : "")
+ .append(until != null ? " --until=" + until : "").toString();
}
}
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 d405a8026..bd518ddb7 100644
--- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java
@@ -3,9 +3,12 @@
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.InputStream;
+import java.util.concurrent.Future;
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.model.Frame;
/**
* Get container logs
@@ -22,7 +25,9 @@
* @param tail
* - `all` or ``, Output specified number of lines at the end of logs
*/
-public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd {
+public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd {
+
+ private ResultCallback resultCallback;
private String containerId;
@@ -30,9 +35,10 @@ public class LogContainerCmdImpl extends AbstrDockerCmd resultCallback) {
super(exec);
withContainerId(containerId);
+ withResultCallback(resultCallback);
}
@Override
@@ -40,6 +46,18 @@ 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;
@@ -82,7 +100,7 @@ public LogContainerCmd withFollowStream(boolean followStream) {
this.followStream = followStream;
return this;
}
-
+
@Override
public LogContainerCmd withTimestamps() {
return withTimestamps(true);
@@ -137,12 +155,14 @@ public String toString() {
.append(containerId)
.toString();
}
-
+
/**
* @throws NotFoundException No such container
*/
@Override
- public InputStream exec() throws NotFoundException {
+ public Void 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 c10f00e57..678a9ef49 100644
--- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java
@@ -2,20 +2,22 @@
import static com.google.common.base.Preconditions.checkNotNull;
+import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.model.Statistics;
/**
- * Stream docker stats
+ * Container stats
*/
public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd {
private String containerId;
- private StatisticsCallback statisticsCallback;
+ private ResultCallback resultCallback;
- public StatsCmdImpl(StatsCmd.Exec exec, StatisticsCallback statisticsCallback) {
+ public StatsCmdImpl(StatsCmd.Exec exec, ResultCallback resultCallback) {
super(exec);
- withStatisticsCallback(statisticsCallback);
+ withResultCallback(resultCallback);
}
@Override
@@ -31,14 +33,14 @@ public String getContainerId() {
}
@Override
- public StatsCmd withStatisticsCallback(StatisticsCallback statisticsCallback) {
- this.statisticsCallback = statisticsCallback;
+ public StatsCmd withResultCallback(ResultCallback resultCallback) {
+ this.resultCallback = resultCallback;
return this;
}
@Override
- public StatisticsCallback getStatisticsCallback() {
- return statisticsCallback;
+ public ResultCallback getResultCallback() {
+ return resultCallback;
}
@Override
diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java
index de4bb3f0c..29f331a2f 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java
@@ -1,19 +1,19 @@
package com.github.dockerjava.jaxrs;
-import java.io.InputStream;
-
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.command.AttachContainerCmd;
-import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.core.async.FrameStreamProcessor;
+import com.github.dockerjava.core.async.JsonStreamProcessor;
+import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier;
+import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier;
public class AttachContainerCmdExec extends
- AbstrDockerCmdExec implements
+ AbstrDockerCmdExec implements
AttachContainerCmd.Exec {
private static final Logger LOGGER = LoggerFactory
@@ -24,8 +24,8 @@ public AttachContainerCmdExec(WebTarget baseResource) {
}
@Override
- protected InputStream execute(AttachContainerCmd command) {
- WebTarget webResource = getBaseResource()
+ protected Void execute(AttachContainerCmd command) {
+ WebTarget webTarget = getBaseResource()
.path("/containers/{id}/attach")
.resolveTemplate("id", command.getContainerId())
.queryParam("logs", command.hasLogsEnabled() ? "1" : "0")
@@ -35,13 +35,15 @@ protected InputStream execute(AttachContainerCmd command) {
.queryParam("stream",
command.hasFollowStreamEnabled() ? "1" : "0");
- LOGGER.trace("POST: {}", webResource);
+ LOGGER.trace("POST: {}", webTarget);
+
+ POSTCallbackNotifier callbackNotifier = new POSTCallbackNotifier(
+ new FrameStreamProcessor(), command.getResultCallback(), webTarget);
+
+ AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier);
+
+ return null;
- Response response = webResource.request()
- .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE)
- .post(null, Response.class);
-
- return new WrappedResponseInputStream(response);
}
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index aa60ef60a..98b93fd48 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -1,76 +1,37 @@
package com.github.dockerjava.jaxrs;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.dockerjava.api.command.EventsCmd;
import com.github.dockerjava.api.model.Event;
-import com.github.dockerjava.jaxrs.util.Streaming;
-
-public class EventsCmdExec extends AbstrDockerCmdExec
- implements EventsCmd.Exec {
- private static final Logger LOGGER = LoggerFactory
- .getLogger(EventsCmdExec.class);
-
- public EventsCmdExec(WebTarget baseResource) {
- super(baseResource);
- }
-
- @Override
- protected Void execute(EventsCmd command) {
-
-
- WebTarget webTarget = getBaseResource().path("/events")
- .queryParam("since", command.getSince())
- .queryParam("until", command.getUntil());
-
- LOGGER.trace("GET: {}", webTarget);
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- EventNotifier eventNotifier = EventNotifier.create(
- command.getEventCallback(), webTarget);
- executorService.submit(eventNotifier);
- executorService.shutdown();
-
- return null;
- }
-
- private static class EventNotifier implements Callable {
-
- private final EventsCmd.EventStreamCallback eventCallback;
- private final WebTarget webTarget;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.core.async.JsonStreamProcessor;
+import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier;
+import com.github.dockerjava.jaxrs.async.GETCallbackNotifier;
- private EventNotifier(EventsCmd.EventStreamCallback eventCallback,
- WebTarget webTarget) {
- this.eventCallback = eventCallback;
- this.webTarget = webTarget;
- }
+public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec {
+ private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class);
- public static EventNotifier create(EventsCmd.EventStreamCallback eventCallback,
- WebTarget webTarget) {
- checkNotNull(eventCallback, "An EventCallback must be provided");
- checkNotNull(webTarget, "An WebTarget must be provided");
- return new EventNotifier(eventCallback, webTarget);
- }
+ public EventsCmdExec(WebTarget baseResource) {
+ super(baseResource);
+ }
- @Override
- public Void call() throws Exception {
+ @Override
+ protected Void execute(EventsCmd command) {
- Response response = webTarget.request().get(Response.class);
+ WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince())
+ .queryParam("until", command.getUntil());
- Streaming.processJsonStream(response, eventCallback, Event.class);
+ LOGGER.trace("GET: {}", webTarget);
- return null;
- }
- }
+ GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(
+ new JsonStreamProcessor(Event.class), command.getResultCallback(), webTarget);
+ AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier);
+ return null;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java
index 7d031bddd..a738ef976 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java
@@ -1,16 +1,18 @@
package com.github.dockerjava.jaxrs;
-import java.io.InputStream;
-
import javax.ws.rs.client.WebTarget;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.dockerjava.api.command.LogContainerCmd;
-import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.core.async.FrameStreamProcessor;
+import com.github.dockerjava.core.async.JsonStreamProcessor;
+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 AbstrDockerCmdExec implements LogContainerCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class);
@@ -19,8 +21,8 @@ public LogContainerCmdExec(WebTarget baseResource) {
}
@Override
- protected InputStream execute(LogContainerCmd command) {
- WebTarget webResource = getBaseResource().path("/containers/{id}/logs")
+ protected Void execute(LogContainerCmd command) {
+ WebTarget webTarget = getBaseResource().path("/containers/{id}/logs")
.resolveTemplate("id", command.getContainerId())
.queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0")
.queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0")
@@ -28,9 +30,15 @@ protected InputStream execute(LogContainerCmd command) {
.queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0")
.queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail());
- LOGGER.trace("GET: {}", webResource);
-
- return new WrappedResponseInputStream(webResource.request().get());
+ LOGGER.trace("GET: {}", webTarget);
+
+ GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(
+ new FrameStreamProcessor(), command.getResultCallback(), webTarget);
+
+ AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier);
+
+ return null;
}
+
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
index 9749a21da..908b2522d 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
@@ -1,21 +1,15 @@
package com.github.dockerjava.jaxrs;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.dockerjava.api.command.StatsCmd;
-import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback;
import com.github.dockerjava.api.model.Statistics;
-import com.github.dockerjava.jaxrs.util.Streaming;
+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 {
private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class);
@@ -26,41 +20,17 @@ public StatsCmdExec(WebTarget baseResource) {
@Override
protected Void execute(StatsCmd command) {
- ExecutorService executorService = Executors.newSingleThreadExecutor();
-
- WebTarget webResource = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id",
+ WebTarget webTarget = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id",
command.getContainerId());
- LOGGER.trace("GET: {}", webResource);
- StatsNotifier eventNotifier = StatsNotifier.create(command.getStatisticsCallback(), webResource);
- executorService.submit(eventNotifier);
- executorService.shutdown();
-
- return null;
- }
+ LOGGER.trace("GET: {}", webTarget);
- private static class StatsNotifier implements Callable {
- private final StatisticsCallback statisticsCallback;
- private final WebTarget webTarget;
+ GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(
+ new JsonStreamProcessor(Statistics.class), command.getResultCallback(), webTarget);
- private StatsNotifier(StatisticsCallback statisticsCallback, WebTarget webTarget) {
- this.statisticsCallback = statisticsCallback;
- this.webTarget = webTarget;
- }
+ AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier);
- public static StatsNotifier create(StatisticsCallback statisticsCallback, WebTarget webTarget) {
- checkNotNull(statisticsCallback, "An StatsCallback must be provided");
- checkNotNull(webTarget, "An WebTarget must be provided");
- return new StatsNotifier(statisticsCallback, webTarget);
- }
-
- @Override
- public Void call() throws Exception {
- Response response = webTarget.request().get(Response.class);
-
- Streaming.processJsonStream(response, statisticsCallback, Statistics.class);
-
- return null;
- }
+ return null;
}
+
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java
new file mode 100644
index 000000000..f8baeef98
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java
@@ -0,0 +1,78 @@
+/*
+ * Created on 17.06.2015
+ */
+package com.github.dockerjava.jaxrs.async;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.InputStream;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.core.async.ResponseStreamProcessor;
+import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
+
+public abstract class AbstractCallbackNotifier implements Callable {
+
+ private final ResponseStreamProcessor responseStreamProcessor;
+
+ private final ResultCallback resultCallback;
+
+ protected final WebTarget webTarget;
+
+ protected AbstractCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback,
+ WebTarget webTarget) {
+ checkNotNull(webTarget, "An WebTarget must be provided");
+ checkNotNull(responseStreamProcessor, "A ResponseStreamProcessor must be provided");
+ this.responseStreamProcessor = responseStreamProcessor;
+ this.resultCallback = resultCallback;
+ this.webTarget = webTarget;
+ }
+
+ @Override
+ public Void call() throws Exception {
+
+ Response response = null;
+
+ try {
+ response = response();
+ } catch (ProcessingException e) {
+ if (resultCallback != null) {
+ resultCallback.onError(e.getCause());
+ }
+ return null;
+ }
+
+ try {
+ InputStream inputStream = new WrappedResponseInputStream(response);
+
+ if (resultCallback != null)
+ responseStreamProcessor.processResponseStream(inputStream, resultCallback);
+
+ return null;
+ } catch (Exception e) {
+ if (resultCallback != null) {
+ resultCallback.onError(e);
+ }
+
+ return null;
+ }
+ }
+
+ protected abstract Response response();
+
+ public static Future startAsyncProcessing(AbstractCallbackNotifier callbackNotifier) {
+
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ Future response = executorService.submit(callbackNotifier);
+ executorService.shutdown();
+ return response;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java
new file mode 100644
index 000000000..cddfe49ed
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java
@@ -0,0 +1,29 @@
+/*
+ * Created on 23.06.2015
+ */
+package com.github.dockerjava.jaxrs.async;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.core.async.ResponseStreamProcessor;
+
+/**
+ *
+ *
+ * @author marcus
+ *
+ */
+public class GETCallbackNotifier extends AbstractCallbackNotifier {
+
+ public GETCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback,
+ WebTarget webTarget) {
+ super(responseStreamProcessor, resultCallback, webTarget);
+ }
+
+ protected Response response() {
+ return webTarget.request().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
new file mode 100644
index 000000000..0d380b5db
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java
@@ -0,0 +1,29 @@
+/*
+ * Created on 23.06.2015
+ */
+package com.github.dockerjava.jaxrs.async;
+
+import javax.ws.rs.client.WebTarget;
+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 {
+
+ public POSTCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback,
+ WebTarget webTarget) {
+ super(responseStreamProcessor, resultCallback, webTarget);
+ }
+
+ protected Response response() {
+ return webTarget.request().post(null, Response.class);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
deleted file mode 100644
index 73990bf51..000000000
--- a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.github.dockerjava.jaxrs.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.ws.rs.core.Response;
-
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonToken;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.async.StreamCallback;
-
-public class Streaming {
-
- private static final JsonFactory JSON_FACTORY = new JsonFactory();
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
- public static void processJsonStream(Response response,
- StreamCallback objectStreamCallback, Class clazz) {
-
- InputStream inputStream = new WrappedResponseInputStream(
- response);
-
- objectStreamCallback.onStart(inputStream);
-
- try {
- JsonParser jp = JSON_FACTORY.createParser(inputStream);
- while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) {
- try {
- objectStreamCallback.onStream(OBJECT_MAPPER.readValue(jp,
- clazz));
- } catch (Exception e) {
- objectStreamCallback.onError(e);
- }
- }
- } catch (Throwable t) {
- objectStreamCallback.onError(t);
- } finally {
- try {
- inputStream.close();
- } catch (IOException e) {
- objectStreamCallback.onError(e);
- } finally {
- objectStreamCallback.onFinish();
- }
- }
- }
-
-
-
-}
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 373680471..9eda0cbc5 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -6,11 +6,13 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumeBind;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.TestDockerCmdExecFactory;
+import com.github.dockerjava.core.async.ResultCallbackTemplate;
import com.google.common.base.Joiner;
import org.apache.commons.io.IOUtils;
@@ -187,4 +189,37 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon
assertThat(volumes, contains(expectedVolumes));
}
+ public static class CollectFramesCallback extends ResultCallbackTemplate {
+ public final List frames = new ArrayList();
+ private final StringBuffer log = new StringBuffer();
+
+ @Override
+ public void onError(Throwable throwable) {
+ throwable.printStackTrace();
+ super.onError(throwable);
+ }
+
+ @Override
+ public void onResult(Frame frame) {
+ frames.add(frame);
+ log.append(new String(frame.getPayload()).trim());
+ }
+
+ @Override
+ public String toString() {
+ return log.toString();
+ }
+ }
+
+ protected String containerLog(String containerId) throws Exception {
+
+ CollectFramesCallback collectFramesCallback = new CollectFramesCallback();
+
+ dockerClient.logContainerCmd(containerId, collectFramesCallback).withStdOut().exec();
+
+ collectFramesCallback.awaitFinish();
+
+ return collectFramesCallback.toString();
+ }
+
}
diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
new file mode 100644
index 000000000..dec4a3b3b
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
@@ -0,0 +1,70 @@
+package com.github.dockerjava.core.command;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+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.DockerException;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+
+@Test(groups = "integration")
+public class AttachContainerCmdImplTest extends AbstractDockerClientTest {
+
+ @BeforeTest
+ public void beforeTest() throws DockerException {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void attachContainer() throws Exception {
+
+ String snippet = "hello world";
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top").exec();
+
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CollectFramesCallback collectFramesCallback = new CollectFramesCallback();
+
+ dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut()
+ .withFollowStream().withLogs().exec();
+
+ collectFramesCallback.awaitFinish(10, TimeUnit.SECONDS);
+
+ collectFramesCallback.close();
+
+ // LOG.info("resonse: " + log);
+
+ assertThat(collectFramesCallback.toString(), endsWith(snippet));
+ }
+}
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 c9bd51b90..a94209fea 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -19,7 +19,6 @@
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang.StringUtils;
-
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
@@ -59,7 +58,7 @@ public void beforeMethod(Method method) {
public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
-
+
@Test
public void testNginxDockerfileBuilder() {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
@@ -77,7 +76,7 @@ public void testNginxDockerfileBuilder() {
.inspectImageCmd(imageId).exec();
assertThat(inspectImageResponse, not(nullValue()));
LOG.info("Image Inspect: {}", inspectImageResponse.toString());
-
+
assertThat(inspectImageResponse.getAuthor(),
equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\""));
}
@@ -112,7 +111,7 @@ public void testNonstandard2() {
}
@Test
- public void testDockerBuilderFromTar() throws IOException {
+ public void testDockerBuilderFromTar() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile());
Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString());
@@ -121,7 +120,7 @@ public void testDockerBuilderFromTar() throws IOException {
}
@Test
- public void testDockerBuilderAddUrl() {
+ public void testDockerBuilderAddUrl() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testAddUrl").getFile());
String response = dockerfileBuild(baseDir);
@@ -129,17 +128,15 @@ public void testDockerBuilderAddUrl() {
}
@Test
- public void testDockerBuilderAddFileInSubfolder() throws DockerException,
- IOException {
+ public void testDockerBuilderAddFileInSubfolder() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testAddFileInSubfolder").getFile());
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testrun.sh"));
}
-
+
@Test
- public void testDockerBuilderAddFilesViaWildcard() throws DockerException,
- IOException {
+ public void testDockerBuilderAddFilesViaWildcard() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testAddFilesViaWildcard").getFile());
String response = dockerfileBuild(baseDir);
@@ -148,32 +145,30 @@ public void testDockerBuilderAddFilesViaWildcard() throws DockerException,
}
@Test
- public void testDockerBuilderAddFolder() throws DockerException,
- IOException {
+ public void testDockerBuilderAddFolder() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testAddFolder").getFile());
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testAddFolder.sh"));
}
-
+
@Test
- public void testDockerBuilderEnv() throws DockerException,
- IOException {
+ public void testDockerBuilderEnv() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testEnv").getFile());
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testrun.sh"));
}
- private String dockerfileBuild(InputStream tarInputStream) {
+ private String dockerfileBuild(InputStream tarInputStream) throws Exception {
return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream));
}
- private String dockerfileBuild(File baseDir) {
+ private String dockerfileBuild(File baseDir) throws Exception {
return execBuild(dockerClient.buildImageCmd(baseDir));
}
- private String execBuild(BuildImageCmd buildImageCmd) {
+ private String execBuild(BuildImageCmd buildImageCmd) throws Exception {
// Build image
InputStream response = buildImageCmd.withNoCache().exec();
@@ -191,17 +186,11 @@ private String execBuild(BuildImageCmd buildImageCmd) {
dockerClient.startContainerCmd(container.getId()).exec();
dockerClient.waitContainerCmd(container.getId()).exec();
- // Log container
- InputStream logResponse = logContainer(container.getId());
-
- //assertThat(asString(logResponse), containsString(expectedText));
+ return containerLog(container.getId());
- return asString(logResponse);
}
- private InputStream logContainer(String containerId) {
- return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec();
- }
+
@Test(expectedExceptions={DockerClientException.class})
public void testDockerfileIgnored() {
@@ -218,8 +207,7 @@ public void testInvalidDockerIgnorePattern() {
}
@Test(groups = "ignoreInCircleCi")
- public void testDockerIgnore() throws DockerException,
- IOException {
+ public void testDockerIgnore() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testDockerignore").getFile());
String response = dockerfileBuild(baseDir);
@@ -242,7 +230,7 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti
"Successfully built ", "\n").trim();
}
}
-
+
assertNotNull(imageId, "Not successful in build");
@@ -251,12 +239,12 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti
assertThat(inspectImageResponse, not(nullValue()));
assertThat(inspectImageResponse.getId(), not(nullValue()));
LOG.info("Image Inspect: {}", inspectImageResponse.toString());
-
+
CreateContainerResponse container = dockerClient.createContainerCmd(
inspectImageResponse.getId()).exec();
assertThat(container.getId(), not(isEmptyString()));
dockerClient.startContainerCmd(container.getId()).exec();
-
+
InspectContainerResponse inspectContainerResponse = dockerClient
.inspectContainerCmd(container.getId()).exec();
@@ -275,7 +263,7 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti
}
@Test
- public void testAddAndCopySubstitution () throws DockerException, IOException {
+ public void testAddAndCopySubstitution () throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testENVSubstitution").getFile());
String response = dockerfileBuild(baseDir);
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 c652f51d7..94d4cff62 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -23,153 +23,138 @@
@Test(groups = "integration")
public class CreateContainerCmdImplTest extends AbstractDockerClientTest {
- @BeforeTest
- public void beforeTest() throws DockerException {
- super.beforeTest();
- }
+ @BeforeTest
+ public void beforeTest() throws DockerException {
+ super.beforeTest();
+ }
- @AfterTest
- public void afterTest() {
- super.afterTest();
- }
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
- @BeforeMethod
- public void beforeMethod(Method method) {
- super.beforeMethod(method);
- }
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
- @AfterMethod
- public void afterMethod(ITestResult result) {
- super.afterMethod(result);
- }
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
- @Test
- public void createContainerWithExistingName() throws DockerException {
+ @Test
+ public void createContainerWithExistingName() throws DockerException {
- String containerName = "generated_" + new SecureRandom().nextInt();
+ String containerName = "generated_" + new SecureRandom().nextInt();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("env")
- .withName(containerName).exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("env")
+ .withName(containerName).exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- try {
- dockerClient.createContainerCmd("busybox").withCmd("env")
- .withName(containerName).exec();
- fail("expected ConflictException");
- } catch (ConflictException e) {
- }
- }
+ try {
+ dockerClient.createContainerCmd("busybox").withCmd("env").withName(containerName).exec();
+ fail("expected ConflictException");
+ } catch (ConflictException e) {
+ }
+ }
- @Test
- public void createContainerWithVolume() throws DockerException {
+ @Test
+ public void createContainerWithVolume() throws DockerException {
- Volume volume = new Volume("/var/log");
-
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withVolumes(volume).withCmd("true").exec();
+ Volume volume = new Volume("/var/log");
- LOG.info("Created container {}", container.toString());
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume)
+ .withCmd("true").exec();
- assertThat(container.getId(), not(isEmptyString()));
+ LOG.info("Created container {}", container.toString());
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(container.getId(), not(isEmptyString()));
- LOG.info("Inspect container {}", inspectContainerResponse.getConfig()
- .getVolumes());
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(),
- contains("/var/log"));
-
- assertThat(inspectContainerResponse.getVolumesRW(),
- hasItemInArray(new VolumeRW(volume, AccessMode.rw)));
- }
-
- @Test
- public void createContainerWithReadOnlyVolume() throws DockerException {
+ LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes());
- Volume volume = new Volume("/srv/test");
-
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withVolumes(volume)
- .withCmd("true")
- .exec();
+ assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log"));
- LOG.info("Created container {}", container.toString());
+ assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw)));
+ }
- assertThat(container.getId(), not(isEmptyString()));
+ @Test
+ public void createContainerWithReadOnlyVolume() throws DockerException {
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ Volume volume = new Volume("/srv/test");
- LOG.info("Inspect container {}", inspectContainerResponse.getConfig()
- .getVolumes());
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume)
+ .withCmd("true").exec();
- assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(),
- contains("/srv/test"));
-
- assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
- contains(new VolumeRW(volume)));
- }
-
- @Test
- public void createContainerWithVolumesFrom() throws DockerException {
-
- Volume volume1 = new Volume("/opt/webapp1");
- Volume volume2 = new Volume("/opt/webapp2");
-
- String container1Name = UUID.randomUUID().toString();
-
- // create a running container with bind mounts
- CreateContainerResponse container1 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName(container1Name)
- .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2))
- .exec();
- LOG.info("Created container1 {}", container1.toString());
-
- dockerClient.startContainerCmd(container1.getId()).exec();
- LOG.info("Started container1 {}", container1.toString());
-
- InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(
- container1.getId()).exec();
-
- assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2);
-
- // create a second container with volumes from first container
- CreateContainerResponse container2 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withVolumesFrom(new VolumesFrom(container1Name)).exec();
- LOG.info("Created container2 {}", container2.toString());
-
- InspectContainerResponse inspectContainerResponse2 = dockerClient
- .inspectContainerCmd(container2.getId()).exec();
-
- // No volumes are created, the information is just stored in .HostConfig.VolumesFrom
- assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name)));
-
- // To ensure that the information stored in VolumesFrom really is considered
- // when starting the container, we start it and verify that it has the same
- // bind mounts as the first container.
- // This is somehow out of scope here, but it helped me to understand how the
- // VolumesFrom feature really works.
- dockerClient.startContainerCmd(container2.getId()).exec();
- LOG.info("Started container2 {}", container2.toString());
-
- inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec();
-
- assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name)));
- assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2);
- }
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes());
+
+ assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test"));
+
+ assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume)));
+ }
+
+ @Test
+ public void createContainerWithVolumesFrom() throws DockerException {
+
+ Volume volume1 = new Volume("/opt/webapp1");
+ Volume volume2 = new Volume("/opt/webapp2");
+
+ String container1Name = UUID.randomUUID().toString();
+
+ // create a running container with bind mounts
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName(container1Name)
+ .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec();
+ LOG.info("Created container1 {}", container1.toString());
+
+ dockerClient.startContainerCmd(container1.getId()).exec();
+ LOG.info("Started container1 {}", container1.toString());
+
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
+
+ assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2);
+
+ // create a second container with volumes from first container
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withVolumesFrom(new VolumesFrom(container1Name)).exec();
+ LOG.info("Created container2 {}", container2.toString());
+
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+
+ // No volumes are created, the information is just stored in .HostConfig.VolumesFrom
+ assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(
+ container1Name)));
- @Test
- public void createContainerWithEnv() throws DockerException {
+ // To ensure that the information stored in VolumesFrom really is considered
+ // when starting the container, we start it and verify that it has the same
+ // bind mounts as the first container.
+ // This is somehow out of scope here, but it helped me to understand how the
+ // VolumesFrom feature really works.
+ dockerClient.startContainerCmd(container2.getId()).exec();
+ LOG.info("Started container2 {}", container2.toString());
+
+ inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec();
+
+ assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(
+ container1Name)));
+ assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2);
+ }
+
+ @Test
+ public void createContainerWithEnv() throws Exception {
CreateContainerResponse container = dockerClient
.createContainerCmd("busybox").withEnv("VARIABLE=success")
@@ -188,381 +173,324 @@ public void createContainerWithEnv() throws DockerException {
dockerClient.startContainerCmd(container.getId()).exec();
- assertThat(asString(dockerClient.logContainerCmd(container.getId())
- .withStdOut().exec()), containsString("VARIABLE=success"));
+ assertThat(containerLog(container.getId()), containsString("VARIABLE=success"));
}
- @Test
- public void createContainerWithHostname() throws DockerException {
+ @Test
+ public void createContainerWithHostname() throws Exception {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withHostName("docker-java")
- .withCmd("env").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withHostName("docker-java")
+ .withCmd("env").exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getConfig().getHostName(),
- equalTo("docker-java"));
+ assertThat(inspectContainerResponse.getConfig().getHostName(), equalTo("docker-java"));
- dockerClient.startContainerCmd(container.getId()).exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
- assertThat(asString(dockerClient.logContainerCmd(container.getId())
- .withStdOut().exec()), containsString("HOSTNAME=docker-java"));
- }
+ assertThat(containerLog(container.getId()),
+ containsString("HOSTNAME=docker-java"));
+ }
- @Test
- public void createContainerWithName() throws DockerException {
+ @Test
+ public void createContainerWithName() throws DockerException {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withName("container")
- .withCmd("env").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container")
+ .withCmd("env").exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getName(), equalTo("/container"));
+ assertThat(inspectContainerResponse.getName(), equalTo("/container"));
- try {
- dockerClient.createContainerCmd("busybox").withName("container")
- .withCmd("env").exec();
- fail("Expected ConflictException");
- } catch (ConflictException e) {
- }
+ try {
+ dockerClient.createContainerCmd("busybox").withName("container").withCmd("env").exec();
+ fail("Expected ConflictException");
+ } catch (ConflictException e) {
+ }
- }
-
- @Test
- public void createContainerWithLink() throws DockerException {
-
- CreateContainerResponse container1 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").withName("container1").exec();
- LOG.info("Created container1 {}", container1.toString());
- assertThat(container1.getId(), not(isEmptyString()));
-
- dockerClient.startContainerCmd(container1.getId()).exec();
-
- InspectContainerResponse inspectContainerResponse1 = dockerClient
- .inspectContainerCmd(container1.getId()).exec();
- LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString());
- assertThat(inspectContainerResponse1.getState().isRunning(), is(true));
-
- HostConfig hostConfig = new HostConfig();
- hostConfig.setLinks(new Link("container1", "container1Link"));
- CreateContainerResponse container2 = dockerClient
- .createContainerCmd("busybox").withName("container2").withHostConfig(hostConfig)
- .withCmd("env").exec();
- LOG.info("Created container {}", container2.toString());
- assertThat(container2.getId(), not(isEmptyString()));
+ }
- InspectContainerResponse inspectContainerResponse2 = dockerClient
- .inspectContainerCmd(container2.getId()).exec();
- assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")}));
- }
+ @Test
+ public void createContainerWithLink() throws DockerException {
- @Test
- public void createContainerWithCapAddAndCapDrop() throws DockerException {
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container1").exec();
+ LOG.info("Created container1 {}", container1.toString());
+ assertThat(container1.getId(), not(isEmptyString()));
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withCapAdd(NET_ADMIN)
- .withCapDrop(MKNOD).exec();
+ dockerClient.startContainerCmd(container1.getId()).exec();
- LOG.info("Created container {}", container.toString());
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
+ LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString());
+ assertThat(inspectContainerResponse1.getState().isRunning(), is(true));
- assertThat(container.getId(), not(isEmptyString()));
+ HostConfig hostConfig = new HostConfig();
+ hostConfig.setLinks(new Link("container1", "container1Link"));
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withName("container2")
+ .withHostConfig(hostConfig).withCmd("env").exec();
+ LOG.info("Created container {}", container2.toString());
+ assertThat(container2.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+ assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1",
+ "container1Link") }));
+ }
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getCapAdd()), contains(NET_ADMIN));
+ @Test
+ public void createContainerWithCapAddAndCapDrop() throws DockerException {
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getCapDrop()), contains(MKNOD));
- }
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCapAdd(NET_ADMIN)
+ .withCapDrop(MKNOD).exec();
- @Test
- public void createContainerWithDns() throws DockerException {
+ LOG.info("Created container {}", container.toString());
- String aDnsServer = "8.8.8.8";
- String anotherDnsServer = "8.8.4.4";
+ assertThat(container.getId(), not(isEmptyString()));
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withCmd("true").withDns(aDnsServer, anotherDnsServer).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- LOG.info("Created container {}", container.toString());
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN));
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD));
+ }
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ @Test
+ public void createContainerWithDns() throws DockerException {
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()),
- contains(aDnsServer, anotherDnsServer));
- }
-
- @Test
- public void createContainerWithEntrypoint() throws DockerException {
+ String aDnsServer = "8.8.8.8";
+ String anotherDnsServer = "8.8.4.4";
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withName("container")
- .withEntrypoint("sleep", "9999").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withDns(aDnsServer, anotherDnsServer).exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999"));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()),
+ contains(aDnsServer, anotherDnsServer));
+ }
- }
+ @Test
+ public void createContainerWithEntrypoint() throws DockerException {
- @Test
- public void createContainerWithExtraHosts() throws DockerException {
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container")
+ .withEntrypoint("sleep", "9999").exec();
- String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"};
+ LOG.info("Created container {}", container.toString());
- HostConfig hostConfig = new HostConfig();
- hostConfig.setExtraHosts(extraHosts);
+ assertThat(container.getId(), not(isEmptyString()));
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withName("container")
- .withHostConfig(hostConfig).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- LOG.info("Created container {}", container.toString());
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999"));
- assertThat(container.getId(), not(isEmptyString()));
+ }
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ @Test
+ public void createContainerWithExtraHosts() throws DockerException {
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()),
- containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1"));
- }
-
- @Test
- public void createContainerWithDevices() throws DockerException {
+ String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" };
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))
- .exec();
+ HostConfig hostConfig = new HostConfig();
+ hostConfig.setExtraHosts(extraHosts);
- LOG.info("Created container {}", container.toString());
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container")
+ .withHostConfig(hostConfig).exec();
- assertThat(container.getId(), not(isEmptyString()));
+ LOG.info("Created container {}", container.toString());
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(container.getId(), not(isEmptyString()));
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getDevices()), contains(new Device("rwm", "/dev/nulo",
- "/dev/zero")));
- }
-
- @Test
- public void createContainerWithPortBindings() throws DockerException {
-
- ExposedPort tcp22 = ExposedPort.tcp(22);
- ExposedPort tcp23 = ExposedPort.tcp(23);
-
- Ports portBindings = new Ports();
- portBindings.bind(tcp22, Ports.Binding(11022));
- portBindings.bind(tcp23, Ports.Binding(11023));
- portBindings.bind(tcp23, Ports.Binding(11024));
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true")
- .withExposedPorts(tcp22, tcp23)
- .withPortBindings(portBindings)
- .exec();
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()),
+ containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1"));
+ }
- LOG.info("Created container {}", container.toString());
+ @Test
+ public void createContainerWithDevices() throws DockerException {
- assertThat(container.getId(), not(isEmptyString()));
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ LOG.info("Created container {}", container.toString());
- assertThat(Arrays.asList(inspectContainerResponse.getConfig()
- .getExposedPorts()), contains(tcp22, tcp23));
+ assertThat(container.getId(), not(isEmptyString()));
- assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
- .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022))));
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
- .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023))));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm",
+ "/dev/nulo", "/dev/zero")));
+ }
- assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
- .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024))));
+ @Test
+ public void createContainerWithPortBindings() throws DockerException {
- }
-
- @Test
- public void createContainerWithLinking() throws DockerException {
-
- CreateContainerResponse container1 = dockerClient
- .createContainerCmd("busybox")
- .withCmd("sleep", "9999")
- .withName("container1").exec();
-
- LOG.info("Created container1 {}", container1.toString());
- assertThat(container1.getId(), not(isEmptyString()));
-
- dockerClient.startContainerCmd(container1.getId()).exec();
-
- InspectContainerResponse inspectContainerResponse1 = dockerClient
- .inspectContainerCmd(container1.getId()).exec();
- LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString());
-
- assertThat(inspectContainerResponse1.getConfig(), is(notNullValue()));
- assertThat(inspectContainerResponse1.getId(), not(isEmptyString()));
- assertThat(inspectContainerResponse1.getId(),
- startsWith(container1.getId()));
- assertThat(inspectContainerResponse1.getName(), equalTo("/container1"));
- assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString()));
- assertThat(inspectContainerResponse1.getState(), is(notNullValue()));
- assertThat(inspectContainerResponse1.getState().isRunning(), is(true));
-
- if (!inspectContainerResponse1.getState().isRunning()) {
- assertThat(inspectContainerResponse1.getState().getExitCode(),
- is(equalTo(0)));
- }
-
- CreateContainerResponse container2 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName("container2")
- .withLinks(new Link("container1", "container1Link"))
- .exec();
-
- LOG.info("Created container2 {}", container2.toString());
- assertThat(container2.getId(), not(isEmptyString()));
-
- InspectContainerResponse inspectContainerResponse2 = dockerClient
- .inspectContainerCmd(container2.getId()).exec();
- LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString());
-
- assertThat(inspectContainerResponse2.getConfig(), is(notNullValue()));
- assertThat(inspectContainerResponse2.getId(), not(isEmptyString()));
- assertThat(inspectContainerResponse2.getHostConfig(),
- is(notNullValue()));
- assertThat(inspectContainerResponse2.getHostConfig().getLinks(),
- is(notNullValue()));
- assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1",
- "container1Link") }));
- assertThat(inspectContainerResponse2.getId(),
- startsWith(container2.getId()));
- assertThat(inspectContainerResponse2.getName(), equalTo("/container2"));
- assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString()));
-
+ ExposedPort tcp22 = ExposedPort.tcp(22);
+ ExposedPort tcp23 = ExposedPort.tcp(23);
- }
-
- @Test
- public void createContainerWithRestartPolicy() throws DockerException {
+ Ports portBindings = new Ports();
+ portBindings.bind(tcp22, Ports.Binding(11022));
+ portBindings.bind(tcp23, Ports.Binding(11023));
+ portBindings.bind(tcp23, Ports.Binding(11024));
- RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5);
-
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withCmd("sleep", "9999")
- .withRestartPolicy(restartPolicy)
- .exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(),
- is(equalTo(restartPolicy)));
- }
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23));
- /**
- * This tests support for --net option for the docker run command:
- * --net="bridge" Set the Network mode for the container 'bridge': creates a
- * new network stack for the container on the docker bridge 'none': no
- * networking for this container 'container:': reuses another container
- * network stack 'host': use the host network stack inside the container.
- * Note: the host mode gives the container full access to local system
- * services such as D-bus and is therefore considered insecure.
- */
- @Test
- public void createContainerWithNetworkMode() throws DockerException {
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0],
+ is(equalTo(Ports.Binding(11022))));
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withCmd("true")
- .withNetworkMode("host")
- .exec();
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0],
+ is(equalTo(Ports.Binding(11023))));
- LOG.info("Created container {}", container.toString());
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1],
+ is(equalTo(Ports.Binding(11024))));
- assertThat(container.getId(), not(isEmptyString()));
+ }
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ @Test
+ public void createContainerWithLinking() throws DockerException {
- assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(),
- is(equalTo("host")));
- }
-
- @Test
- public void createContainerWithMacAddress() throws DockerException {
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container1").exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withMacAddress("00:80:41:ae:fd:7e")
- .withCmd("true")
- .exec();
+ LOG.info("Created container1 {}", container1.toString());
+ assertThat(container1.getId(), not(isEmptyString()));
- LOG.info("Created container {}", container.toString());
+ dockerClient.startContainerCmd(container1.getId()).exec();
- assertThat(container.getId(), not(isEmptyString()));
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
+ LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString());
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse1.getConfig(), is(notNullValue()));
+ assertThat(inspectContainerResponse1.getId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId()));
+ assertThat(inspectContainerResponse1.getName(), equalTo("/container1"));
+ assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse1.getState(), is(notNullValue()));
+ assertThat(inspectContainerResponse1.getState().isRunning(), is(true));
- assertEquals(inspectContainerResponse.getConfig().getMacAddress(),
- "00:80:41:ae:fd:7e");
- }
+ if (!inspectContainerResponse1.getState().isRunning()) {
+ assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0)));
+ }
- @Test(groups = "ignoreInCircleCi")
- public void createContainerWithULimits() throws DockerException {
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container2").withLinks(new Link("container1", "container1Link")).exec();
- Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)};
+ LOG.info("Created container2 {}", container2.toString());
+ assertThat(container2.getId(), not(isEmptyString()));
- HostConfig hostConfig = new HostConfig();
- hostConfig.setUlimits(ulimits);
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+ LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString());
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withName("container")
- .withHostConfig(hostConfig).exec();
+ assertThat(inspectContainerResponse2.getConfig(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1",
+ "container1Link") }));
+ assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId()));
+ assertThat(inspectContainerResponse2.getName(), equalTo("/container2"));
+ assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString()));
- LOG.info("Created container {}", container.toString());
+ }
- assertThat(container.getId(), not(isEmptyString()));
+ @Test
+ public void createContainerWithRestartPolicy() throws DockerException {
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5);
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()),
- containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)));
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withRestartPolicy(restartPolicy).exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy)));
+ }
+
+ /**
+ * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the
+ * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for
+ * this container 'container:': reuses another container network stack 'host': use the host network stack inside the
+ * container. Note: the host mode gives the container full access to local system services such as D-bus and is
+ * therefore considered insecure.
+ */
+ @Test
+ public void createContainerWithNetworkMode() throws DockerException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withNetworkMode("host").exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host")));
+ }
+
+ @Test
+ public void createContainerWithMacAddress() throws DockerException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withMacAddress("00:80:41:ae:fd:7e").withCmd("true").exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertEquals(inspectContainerResponse.getConfig().getMacAddress(), "00:80:41:ae:fd:7e");
+ }
+
+ @Test(groups = "ignoreInCircleCi")
+ public void createContainerWithULimits() throws DockerException {
+
+ Ulimit[] ulimits = { new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096) };
+
+ HostConfig hostConfig = new HostConfig();
+ hostConfig.setUlimits(ulimits);
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container")
+ .withHostConfig(hostConfig).exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()),
+ containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)));
+
+ }
- }
-
}
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 34a74ad80..ecb7ab66c 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -1,14 +1,11 @@
package com.github.dockerjava.core.command;
-import java.io.Closeable;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -20,10 +17,9 @@
import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.EventsCmd;
-import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback;
import com.github.dockerjava.api.model.Event;
import com.github.dockerjava.client.AbstractDockerClientTest;
-import com.github.dockerjava.core.async.DefaultCallback;
+import com.github.dockerjava.core.async.ResultCallbackTemplate;
@Test(groups = "integration")
public class EventsCmdImplTest extends AbstractDockerClientTest {
@@ -54,6 +50,9 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
+ /*
+ * This specific test may fail with boot2docker as time may not in sync with host system
+ */
@Test
public void testEventStreamTimeBound() throws InterruptedException,
IOException {
@@ -132,7 +131,7 @@ private int generateEvents() {
return KNOWN_NUM_EVENTS;
}
- private class EventCallbackTest extends DefaultCallback implements EventStreamCallback {
+ private class EventCallbackTest extends ResultCallbackTemplate {
private final CountDownLatch countDownLatch;
@@ -142,16 +141,12 @@ public EventCallbackTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
- public void onStream(Event event) {
+ public void onResult(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
countDownLatch.countDown();
events.add(event);
}
- public void onError(Throwable throwable) {
- LOG.error("Error occurred: {}", throwable.getMessage());
- }
-
public List getEvents() {
return new ArrayList(events);
}
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 80619efeb..a62a5bd9a 100644
--- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java
@@ -38,7 +38,7 @@ public void afterMethod(ITestResult result) {
}
@Test(groups = "ignoreInCircleCi")
- public void execStartTest() throws Exception {
+ public void execStart() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
CreateContainerResponse container = dockerClient
@@ -64,4 +64,32 @@ public void execStartTest() throws Exception {
assertNotNull(responseAsString);
assertTrue(responseAsString.length() > 0);
}
+
+ @Test(groups = "ignoreInCircleCi")
+ public void execStartAttached() throws Exception {
+ String containerName = "generated_" + new SecureRandom().nextInt();
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox")
+ .withCmd("sleep", "9999")
+ .withName(containerName).exec();
+ LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
+ .withAttachStdout(true)
+ .withCmd("touch", "/execStartTest.log").exec();
+ dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).exec();
+
+ InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec();
+ boolean bytesAvailable = response.available() > 0;
+ assertTrue(bytesAvailable, "The file was not copied from the container.");
+
+ // read the stream fully. Otherwise, the underlying stream will not be closed.
+ String responseAsString = asString(response);
+ assertNotNull(responseAsString);
+ assertTrue(responseAsString.length() > 0);
+ }
}
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 24c833559..6f847ebed 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -1,10 +1,10 @@
package com.github.dockerjava.core.command;
import static org.testng.Assert.assertEquals;
-import static org.testng.AssertJUnit.assertNull;
+import static org.testng.Assert.assertFalse;
-import java.io.IOException;
-import java.io.InputStream;
+import java.util.Iterator;
+import java.util.List;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
@@ -13,85 +13,86 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.StreamType;
+import com.github.dockerjava.client.AbstractDockerClientTest;
import com.github.dockerjava.core.DockerClientBuilder;
@Test(groups = "integration")
public class FrameReaderITest {
- private DockerClient dockerClient;
- private DockerfileFixture dockerfileFixture;
-
- @BeforeTest
- public void beforeTest() throws Exception {
- dockerClient = DockerClientBuilder.getInstance().build();
- dockerfileFixture = new DockerfileFixture(dockerClient,
- "frameReaderDockerfile");
- dockerfileFixture.open();
- }
-
- @AfterTest
- public void deleteDockerContainerImage() throws Exception {
- dockerfileFixture.close();
- dockerClient.close();
- }
-
- @Test
- public void canCloseFrameReaderAndReadExpectedLines() throws Exception {
-
- // wait for the container to be successfully executed
- int exitCode = dockerClient.waitContainerCmd(
- dockerfileFixture.getContainerId()).exec();
- assertEquals(0, exitCode);
-
- InputStream response = getLoggerStream();
-
- try (FrameReader reader = new FrameReader(response)) {
- assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT,
- "to stdout\n".getBytes()));
- assertEquals(reader.readFrame(), new Frame(StreamType.STDERR,
- "to stderr\n".getBytes()));
- assertNull(reader.readFrame());
- }
- }
-
- private InputStream getLoggerStream() {
-
- return dockerClient.logContainerCmd(dockerfileFixture.getContainerId())
- .withStdOut()
- .withStdErr()
- .withTailAll()
- // we can't follow stream here as it blocks reading from resulting InputStream infinitely
- //.withFollowStream()
- .exec();
- }
-
- @Test
- public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception {
-
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- try (FrameReader reader = new FrameReader(getLoggerStream())) {
- // noinspection StatementWithEmptyBody
- while (reader.readFrame() != null) {
- // nop
- }
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
-
- thread.start();
-
- try (DockerfileFixture busyboxDockerfile = new DockerfileFixture(
- dockerClient, "busyboxDockerfile")) {
- busyboxDockerfile.open();
- }
-
- thread.join();
-
- }
+ private DockerClient dockerClient;
+
+ private DockerfileFixture dockerfileFixture;
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ dockerClient = DockerClientBuilder.getInstance().build();
+ dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
+ dockerfileFixture.open();
+ }
+
+ @AfterTest
+ public void deleteDockerContainerImage() throws Exception {
+ dockerfileFixture.close();
+ dockerClient.close();
+ }
+
+ @Test
+ public void canCloseFrameReaderAndReadExpectedLines() throws Exception {
+
+ // wait for the container to be successfully executed
+ int exitCode = dockerClient.waitContainerCmd(dockerfileFixture.getContainerId()).exec();
+ assertEquals(0, exitCode);
+
+ Iterator response = getLoggingFrames().iterator();
+
+ assertEquals(response.next(), new Frame(StreamType.STDOUT, "to stdout\n".getBytes()));
+ assertEquals(response.next(), new Frame(StreamType.STDERR, "to stderr\n".getBytes()));
+ assertFalse(response.hasNext());
+
+ }
+
+ private List getLoggingFrames() throws Exception {
+
+ AbstractDockerClientTest.CollectFramesCallback collectFramesCallback = new AbstractDockerClientTest.CollectFramesCallback();
+
+ dockerClient.logContainerCmd(dockerfileFixture.getContainerId(), collectFramesCallback).withStdOut()
+ .withStdErr().withTailAll()
+ // we can't follow stream here as it blocks reading from resulting InputStream infinitely
+ // .withFollowStream()
+ .exec();
+
+ collectFramesCallback.awaitFinish();
+
+ return collectFramesCallback.frames;
+ }
+
+ @Test
+ public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception {
+
+ Thread thread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+
+ Iterator frames = getLoggingFrames().iterator();
+
+ while (frames.hasNext()) {
+ frames.next();
+ }
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+
+ thread.start();
+
+ try (DockerfileFixture busyboxDockerfile = new DockerfileFixture(dockerClient, "busyboxDockerfile")) {
+ busyboxDockerfile.open();
+ }
+
+ thread.join();
+
+ }
}
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 94a27b1d3..7b43e1312 100644
--- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
@@ -1,13 +1,14 @@
package com.github.dockerjava.core.command;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
-import java.io.InputStream;
+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;
@@ -19,101 +20,127 @@
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 {
- super.beforeTest();
- }
+ @BeforeTest
+ public void beforeTest() throws DockerException {
+ super.beforeTest();
+ }
- @AfterTest
- public void afterTest() {
- super.afterTest();
- }
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
- @BeforeMethod
- public void beforeMethod(Method method) {
- super.beforeMethod(method);
- }
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
- @AfterMethod
- public void afterMethod(ITestResult result) {
- super.afterMethod(result);
- }
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
- @Test
- public void logContainer() throws Exception {
+ @Test
+ public void asyncLogContainer() throws Exception {
- String snippet = "hello world";
+ String snippet = "hello world";
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("/bin/echo", snippet).exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ .exec();
- LOG.info("Created container: {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).exec();
-
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
- assertThat(exitCode, equalTo(0));
+ int exitCode = dockerClient.waitContainerCmd(container.getId()).exec();
- InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec();
+ assertThat(exitCode, equalTo(0));
- String log = asString(response);
-
- //LOG.info("resonse: " + log);
-
- assertThat(log, endsWith(snippet));
- }
-
- @Test
- public void logNonExistingContainer() throws Exception {
+ CollectFramesCallback loggingCallback = new CollectFramesCallback();
- try {
- dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
- }
-
- @Test
- public void multipleLogContainer() throws Exception {
+ dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec();
- String snippet = "hello world";
+ loggingCallback.awaitFinish();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("/bin/echo", snippet).exec();
+ assertTrue(loggingCallback.toString().contains(snippet));
+ }
- LOG.info("Created container: {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ @Test
+ public void asyncLogNonExistingContainer() throws Exception {
- dockerClient.startContainerCmd(container.getId()).exec();
-
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec();
+ CollectFramesCallback loggingCallback = new CollectFramesCallback() {
+ @Override
+ public void onError(Throwable throwable) {
- assertThat(exitCode, equalTo(0));
+ assertEquals(throwable.getClass().getName(), NotFoundException.class.getName());
- InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec();
+ try {
+ // close the callback to prevent the call to onFinish
+ close();
+ } catch (IOException e) {
+ throw new RuntimeException();
+ }
- response.close();
-
- //String log = asString(response);
-
- response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec();
+ super.onError(throwable);
+ }
- //log = asString(response);
- response.close();
-
- response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec();
+ public void onFinish() {
+ super.onFinish();
+ fail("expected NotFoundException");
+ };
+ };
+
+ dockerClient.logContainerCmd("non-existing", loggingCallback).withStdErr().withStdOut().exec();
+
+ loggingCallback.awaitFinish();
+ }
+
+ @Test
+ public void asyncMultipleLogContainer() throws Exception {
+
+ String snippet = "hello world";
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ .exec();
+
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ int exitCode = dockerClient.waitContainerCmd(container.getId()).exec();
+
+ assertThat(exitCode, equalTo(0));
+
+ CollectFramesCallback loggingCallback = new CollectFramesCallback();
+
+ dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec();
+
+ loggingCallback.close();
+
+ loggingCallback = new CollectFramesCallback();
+
+ dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec();
+
+ loggingCallback.close();
+
+ loggingCallback = new CollectFramesCallback();
+
+ dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec();
+
+ loggingCallback.awaitFinish();
+
+ assertTrue(loggingCallback.toString().contains(snippet));
+ }
- String log = asString(response);
-
- assertThat(log, endsWith(snippet));
- }
}
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 e809e25e3..845f8f9c1 100644
--- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
@@ -20,10 +20,9 @@
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.command.StatsCmd.StatisticsCallback;
import com.github.dockerjava.api.model.Statistics;
import com.github.dockerjava.client.AbstractDockerClientTest;
-import com.github.dockerjava.core.async.DefaultCallback;
+import com.github.dockerjava.core.async.ResultCallbackTemplate;
@Test(groups = "integration")
public class StatsCmdImplTest extends AbstractDockerClientTest {
@@ -85,7 +84,7 @@ public void testStatsStreaming() throws InterruptedException, IOException {
}
- private class StatsCallbackTest extends DefaultCallback implements StatisticsCallback {
+ private class StatsCallbackTest extends ResultCallbackTemplate {
private final CountDownLatch countDownLatch;
private boolean gotStats = false;
@@ -95,7 +94,7 @@ public StatsCallbackTest(CountDownLatch countDownLatch) {
}
@Override
- public void onStream(Statistics stats) {
+ public void onResult(Statistics stats) {
LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats);
if (stats != null) {
gotStats = true;
From be236cc0935369bd33c36c1954e457cb0b71f26e Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 26 Jun 2015 20:41:26 +0200
Subject: [PATCH 0037/1200] Refact streaming
---
.../dockerjava/api/async/ResultCallback.java | 6 +-
.../dockerjava/api/model/StreamType.java | 3 +-
.../core/async/FrameStreamProcessor.java | 4 +-
.../core/async/JsonStreamProcessor.java | 4 +-
.../core/async/ResultCallbackTemplate.java | 6 +-
.../dockerjava/core/command/FrameReader.java | 79 +++++++++++--------
.../client/AbstractDockerClientTest.java | 4 +-
.../command/AttachContainerCmdImplTest.java | 69 ++++++++++++++--
.../core/command/EventsCmdImplTest.java | 2 +-
.../core/command/LogContainerCmdImplTest.java | 4 +-
.../core/command/StatsCmdImplTest.java | 2 +-
.../attachContainerTestDockerfile/Dockerfile | 8 ++
.../attachContainerTestDockerfile/echo.sh | 2 +
13 files changed, 137 insertions(+), 56 deletions(-)
create mode 100644 src/test/resources/attachContainerTestDockerfile/Dockerfile
create mode 100644 src/test/resources/attachContainerTestDockerfile/echo.sh
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 f4f519d3e..2954b9242 100644
--- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
+++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
@@ -5,14 +5,14 @@
/**
* Result callback
*/
-public interface ResultCallback {
+public interface ResultCallback extends Closeable {
/** Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the processing */
void onStart(Closeable closeable);
/** Called when an async result event occurs */
- void onResult(RES_T object);
+ void onNext(RES_T object);
/** Called when an exception occurs while processing */
void onError(Throwable throwable);
/** Called when processing was finished either by reaching the end or by aborting it */
- void onFinish();
+ void onComplete();
}
diff --git a/src/main/java/com/github/dockerjava/api/model/StreamType.java b/src/main/java/com/github/dockerjava/api/model/StreamType.java
index eb11c5536..0040c1bc8 100644
--- a/src/main/java/com/github/dockerjava/api/model/StreamType.java
+++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java
@@ -3,5 +3,6 @@
public enum StreamType {
STDIN,
STDOUT,
- STDERR
+ STDERR,
+ RAW
}
diff --git a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
index cc6474d09..220cd80ef 100644
--- a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
+++ b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java
@@ -28,7 +28,7 @@ public void processResponseStream(InputStream response, ResultCallback re
Frame frame = frameReader.readFrame();
while (frame != null) {
try {
- resultCallback.onResult(frame);
+ resultCallback.onNext(frame);
} catch (Exception e) {
resultCallback.onError(e);
} finally {
@@ -44,7 +44,7 @@ public void processResponseStream(InputStream response, ResultCallback re
} catch (IOException e) {
resultCallback.onError(e);
} finally {
- resultCallback.onFinish();
+ resultCallback.onComplete();
}
}
}
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 24d83b129..5339b3ed0 100644
--- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java
+++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java
@@ -38,7 +38,7 @@ public void processResponseStream(InputStream response, ResultCallback result
JsonParser jp = JSON_FACTORY.createParser(response);
while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) {
try {
- resultCallback.onResult(OBJECT_MAPPER.readValue(jp, clazz));
+ resultCallback.onNext(OBJECT_MAPPER.readValue(jp, clazz));
} catch (Exception e) {
resultCallback.onError(e);
}
@@ -51,7 +51,7 @@ public void processResponseStream(InputStream response, ResultCallback result
} catch (IOException e) {
resultCallback.onError(e);
} finally {
- resultCallback.onFinish();
+ resultCallback.onComplete();
}
}
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 c98cddf4c..f56db8db4 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 class ResultCallbackTemplate implements ResultCallback, Closeable {
+public class ResultCallbackTemplate implements ResultCallback {
private final CountDownLatch finished = new CountDownLatch(1);
@@ -28,7 +28,7 @@ public void onStart(Closeable stream) {
}
@Override
- public void onResult(T object) {
+ public void onNext(T object) {
}
@Override
@@ -45,7 +45,7 @@ public void onError(Throwable throwable) {
}
@Override
- public void onFinish() {
+ public void onComplete() {
try {
close();
} catch (IOException e) {
diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
index bb36c1764..69114dae8 100644
--- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -1,35 +1,43 @@
package com.github.dockerjava.core.command;
-import com.github.dockerjava.api.model.Frame;
-import com.github.dockerjava.api.model.StreamType;
-
import java.io.IOException;
import java.io.InputStream;
+import java.util.Arrays;
+
+import org.apache.commons.io.HexDump;
+
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.StreamType;
/**
* Breaks the input into frame. Similar to how a buffered reader would readLies.
*
- * See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container}
+ * See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container}
*/
public class FrameReader implements AutoCloseable {
+ private static final int BUFFER_SIZE = 100;
+
private static final int HEADER_SIZE = 8;
+
private final InputStream inputStream;
+ private boolean rawDetected = false;
+
public FrameReader(InputStream inputStream) {
this.inputStream = inputStream;
}
private static StreamType streamType(byte streamType) {
switch (streamType) {
- case 0:
- return StreamType.STDIN;
- case 1:
- return StreamType.STDOUT;
- case 2:
- return StreamType.STDERR;
- default:
- throw new IllegalArgumentException("invalid streamType");
+ case 0:
+ return StreamType.STDIN;
+ case 1:
+ return StreamType.STDOUT;
+ case 2:
+ return StreamType.STDERR;
+ default:
+ throw new IllegalArgumentException("invalid streamType");
}
}
@@ -37,41 +45,44 @@ private static StreamType streamType(byte streamType) {
* @return A frame, or null if no more frames.
*/
public Frame readFrame() throws IOException {
- byte[] header = new byte[HEADER_SIZE];
- int actualHeaderSize = 0;
+ byte[] buffer = new byte[BUFFER_SIZE];
- do {
- int headerCount = inputStream.read(header, actualHeaderSize, HEADER_SIZE - actualHeaderSize);
+ int readBytes = inputStream.read(buffer);
- if (headerCount == -1) {
- return null;
- }
- actualHeaderSize += headerCount;
- } while (actualHeaderSize < HEADER_SIZE);
+ if (readBytes == -1) {
+ return null;
+ }
+
+ if (rawDetected || readBytes != HEADER_SIZE) {
+ rawDetected = true;
- int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff);
+ byte[] read = Arrays.copyOfRange(buffer, 0, readBytes);
- byte[] payload = new byte[payloadSize];
- int actualPayloadSize = 0;
+ return new Frame(StreamType.RAW, read);
+ } else {
- do {
- int count = inputStream.read(payload, actualPayloadSize, payloadSize - actualPayloadSize);
+ int payloadSize = ((buffer[4] & 0xff) << 24) + ((buffer[5] & 0xff) << 16) + ((buffer[6] & 0xff) << 8)
+ + (buffer[7] & 0xff);
- if (count == -1) {
- if (actualPayloadSize != payloadSize) {
- throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize));
- }
- break;
+ byte[] payload = new byte[payloadSize];
+ int actualPayloadSize = inputStream.read(payload);
+ if (actualPayloadSize != payloadSize) {
+ throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize,
+ actualPayloadSize));
}
- actualPayloadSize += count;
- } while (actualPayloadSize < payloadSize);
- return new Frame(streamType(header[0]), payload);
+ return new Frame(streamType(buffer[0]), payload);
+
+ }
+
}
@Override
public void close() throws IOException {
inputStream.close();
}
+
+
+
}
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 9eda0cbc5..ec70de4c7 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -200,9 +200,9 @@ public void onError(Throwable throwable) {
}
@Override
- public void onResult(Frame frame) {
+ public void onNext(Frame frame) {
frames.add(frame);
- log.append(new String(frame.getPayload()).trim());
+ log.append(new String(frame.getPayload()));
}
@Override
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 dec4a3b3b..c4147f1a5 100644
--- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
@@ -1,13 +1,19 @@
package com.github.dockerjava.core.command;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.containsString;
+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;
@@ -17,6 +23,8 @@
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;
import com.github.dockerjava.client.AbstractDockerClientTest;
@Test(groups = "integration")
@@ -43,28 +51,79 @@ public void afterMethod(ITestResult result) {
}
@Test
- public void attachContainer() throws Exception {
+ public void attachContainerWithoutTTY() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("echo", snippet)
+ .withTty(false).exec();
LOG.info("Created container: {}", container.toString());
assertThat(container.getId(), not(isEmptyString()));
dockerClient.startContainerCmd(container.getId()).exec();
- CollectFramesCallback collectFramesCallback = new CollectFramesCallback();
+ CollectFramesCallback collectFramesCallback = new CollectFramesCallback() {
+ @Override
+ public void onNext(Frame frame) {
+ assertEquals(frame.getStreamType(), StreamType.RAW);
+ super.onNext(frame);
+ };
+ };
dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut()
.withFollowStream().withLogs().exec();
+ collectFramesCallback.awaitFinish(30, TimeUnit.SECONDS);
+
+ collectFramesCallback.close();
+
+ assertThat(collectFramesCallback.toString(), endsWith(snippet));
+ }
+
+
+ @Test
+ 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();
+
+ CreateContainerResponse container = dockerClient.createContainerCmd(imageId)
+ .withTty(true).exec();
+
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CollectFramesCallback collectFramesCallback = new CollectFramesCallback() {
+ @Override
+ public void onNext(Frame frame) {
+ assertEquals(frame.getStreamType(), StreamType.RAW);
+ super.onNext(frame);
+ };
+ };
+
+ dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut()
+ .withFollowStream().exec();
+
collectFramesCallback.awaitFinish(10, TimeUnit.SECONDS);
collectFramesCallback.close();
- // LOG.info("resonse: " + log);
+ System.out.println("log: " + collectFramesCallback.toString());
- assertThat(collectFramesCallback.toString(), endsWith(snippet));
+
+ 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/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
index ecb7ab66c..baaeb8ca3 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -141,7 +141,7 @@ public EventCallbackTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
- public void onResult(Event event) {
+ public void onNext(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
countDownLatch.countDown();
events.add(event);
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 7b43e1312..18c001c5f 100644
--- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
@@ -92,8 +92,8 @@ public void onError(Throwable throwable) {
super.onError(throwable);
}
- public void onFinish() {
- super.onFinish();
+ public void onComplete() {
+ super.onComplete();
fail("expected NotFoundException");
};
};
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 845f8f9c1..5ccb01038 100644
--- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
@@ -94,7 +94,7 @@ public StatsCallbackTest(CountDownLatch countDownLatch) {
}
@Override
- public void onResult(Statistics stats) {
+ public void onNext(Statistics stats) {
LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats);
if (stats != null) {
gotStats = true;
diff --git a/src/test/resources/attachContainerTestDockerfile/Dockerfile b/src/test/resources/attachContainerTestDockerfile/Dockerfile
new file mode 100644
index 000000000..90cca5e64
--- /dev/null
+++ b/src/test/resources/attachContainerTestDockerfile/Dockerfile
@@ -0,0 +1,8 @@
+FROM ubuntu:latest
+
+ADD ./echo.sh /tmp/
+
+RUN cp /tmp/echo.sh /usr/local/bin/ && chmod +x /usr/local/bin/echo.sh
+
+CMD ["echo.sh"]
+
diff --git a/src/test/resources/attachContainerTestDockerfile/echo.sh b/src/test/resources/attachContainerTestDockerfile/echo.sh
new file mode 100644
index 000000000..88b444bf0
--- /dev/null
+++ b/src/test/resources/attachContainerTestDockerfile/echo.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+while sleep 2; do echo stdout && echo stderr >&2; done
\ No newline at end of file
From e60e7de743492c1b1181f99ec702f0e8616b01a7 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 26 Jun 2015 20:44:26 +0200
Subject: [PATCH 0038/1200] Formatting sources
---
.../dockerjava/api/BadRequestException.java | 13 +-
.../dockerjava/api/ConflictException.java | 13 +-
.../github/dockerjava/api/DockerClient.java | 130 ++-
.../dockerjava/api/DockerClientException.java | 4 +-
.../dockerjava/api/DockerException.java | 15 +-
.../api/InternalServerErrorException.java | 12 +-
.../api/NotAcceptableException.java | 12 +-
.../dockerjava/api/NotFoundException.java | 12 +-
.../dockerjava/api/NotModifiedException.java | 12 +-
.../dockerjava/api/UnauthorizedException.java | 12 +-
.../api/command/AttachContainerCmd.java | 74 +-
.../dockerjava/api/command/AuthCmd.java | 21 +-
.../dockerjava/api/command/BuildImageCmd.java | 82 +-
.../dockerjava/api/command/CommitCmd.java | 121 +--
.../api/command/ContainerDiffCmd.java | 37 +-
.../api/command/CopyFileFromContainerCmd.java | 34 +-
.../api/command/CreateImageCmd.java | 54 +-
.../dockerjava/api/command/DockerCmd.java | 2 +-
.../dockerjava/api/command/DockerCmdExec.java | 4 +-
.../api/command/DockerCmdExecFactory.java | 73 +-
.../dockerjava/api/command/EventCallback.java | 3 +
.../dockerjava/api/command/EventsCmd.java | 9 +-
.../dockerjava/api/command/ExecCreateCmd.java | 18 +-
.../dockerjava/api/command/ExecStartCmd.java | 42 +-
.../dockerjava/api/command/InfoCmd.java | 4 +-
.../api/command/InspectContainerCmd.java | 21 +-
.../api/command/InspectContainerResponse.java | 189 ++--
.../api/command/InspectExecCmd.java | 7 +-
.../api/command/InspectImageCmd.java | 23 +-
.../api/command/InspectImageResponse.java | 18 +-
.../api/command/KillContainerCmd.java | 25 +-
.../api/command/ListContainersCmd.java | 43 +-
.../dockerjava/api/command/ListImagesCmd.java | 18 +-
.../api/command/LogContainerCmd.java | 82 +-
.../api/command/PauseContainerCmd.java | 26 +-
.../dockerjava/api/command/PingCmd.java | 7 +-
.../dockerjava/api/command/PullImageCmd.java | 27 +-
.../dockerjava/api/command/PushImageCmd.java | 58 +-
.../api/command/RemoveContainerCmd.java | 37 +-
.../api/command/RemoveImageCmd.java | 87 +-
.../api/command/RestartContainerCmd.java | 28 +-
.../dockerjava/api/command/SaveImageCmd.java | 17 +-
.../api/command/SearchImagesCmd.java | 13 +-
.../dockerjava/api/command/StatsCallback.java | 3 +
.../dockerjava/api/command/StatsCmd.java | 7 +-
.../api/command/StopContainerCmd.java | 34 +-
.../dockerjava/api/command/TagImageCmd.java | 34 +-
.../api/command/TopContainerCmd.java | 25 +-
.../api/command/TopContainerResponse.java | 42 +-
.../api/command/UnpauseContainerCmd.java | 24 +-
.../dockerjava/api/command/VersionCmd.java | 6 +-
.../api/command/WaitContainerCmd.java | 23 +-
.../dockerjava/api/model/AccessMode.java | 40 +-
.../dockerjava/api/model/AuthConfig.java | 222 +++--
.../api/model/AuthConfigurations.java | 22 +-
.../com/github/dockerjava/api/model/Bind.java | 176 ++--
.../github/dockerjava/api/model/Binds.java | 55 +-
.../dockerjava/api/model/Capability.java | 612 ++++++-------
.../dockerjava/api/model/Container.java | 29 +-
.../dockerjava/api/model/ContainerConfig.java | 260 +++---
.../github/dockerjava/api/model/Device.java | 100 +-
.../dockerjava/api/model/ErrorResponse.java | 1 +
.../github/dockerjava/api/model/Event.java | 31 +-
.../dockerjava/api/model/EventStreamItem.java | 21 +-
.../dockerjava/api/model/ExposedPort.java | 316 +++----
.../dockerjava/api/model/ExposedPorts.java | 63 +-
.../github/dockerjava/api/model/Frame.java | 7 +-
.../dockerjava/api/model/HostConfig.java | 420 +++++----
.../dockerjava/api/model/Identifier.java | 34 +-
.../github/dockerjava/api/model/Image.java | 12 +-
.../com/github/dockerjava/api/model/Info.java | 334 +++----
.../api/model/InternetProtocol.java | 70 +-
.../com/github/dockerjava/api/model/Link.java | 168 ++--
.../github/dockerjava/api/model/Links.java | 82 +-
.../github/dockerjava/api/model/LxcConf.java | 48 +-
.../dockerjava/api/model/PortBinding.java | 115 ++-
.../github/dockerjava/api/model/Ports.java | 160 ++--
.../api/model/PullEventStreamItem.java | 17 +-
.../api/model/PushEventStreamItem.java | 17 +-
.../dockerjava/api/model/Repository.java | 17 +-
.../dockerjava/api/model/RestartPolicy.java | 228 ++---
.../dockerjava/api/model/Statistics.java | 32 +-
.../dockerjava/api/model/StreamType.java | 4 +-
.../github/dockerjava/api/model/Ulimit.java | 6 +-
.../github/dockerjava/api/model/Version.java | 32 +-
.../github/dockerjava/api/model/Volume.java | 56 +-
.../dockerjava/api/model/VolumeBind.java | 3 +-
.../dockerjava/api/model/VolumeBinds.java | 17 +-
.../github/dockerjava/api/model/VolumeRW.java | 160 ++--
.../github/dockerjava/api/model/Volumes.java | 69 +-
.../dockerjava/api/model/VolumesFrom.java | 203 ++---
.../dockerjava/api/model/VolumesRW.java | 22 +-
.../dockerjava/core/AuthConfigFile.java | 8 +-
.../dockerjava/core/CertificateUtils.java | 103 +--
.../dockerjava/core/CompressArchiveUtil.java | 3 +-
.../dockerjava/core/DockerClientBuilder.java | 119 ++-
.../dockerjava/core/DockerClientConfig.java | 259 +++---
.../dockerjava/core/DockerClientImpl.java | 542 ++++++-----
.../github/dockerjava/core/FilePathUtil.java | 9 +-
.../dockerjava/core/GoLangFileMatch.java | 9 +-
.../core/GoLangMatchFileFilter.java | 8 +-
.../dockerjava/core/KeystoreSSLConfig.java | 195 ++--
.../core/LocalDirectorySSLConfig.java | 111 ++-
.../github/dockerjava/core/NameParser.java | 20 +-
.../com/github/dockerjava/core/SSLConfig.java | 14 +-
.../core/command/AbstrAuthCfgDockerCmd.java | 71 +-
.../core/command/AbstrDockerCmd.java | 25 +-
.../core/command/AttachContainerCmdImpl.java | 215 ++---
.../dockerjava/core/command/AuthCmdImpl.java | 24 +-
.../core/command/BuildImageCmdImpl.java | 272 +++---
.../core/command/CommitCmdImpl.java | 285 +++---
.../core/command/ContainerDiffCmdImpl.java | 42 +-
.../command/CopyFileFromContainerCmdImpl.java | 91 +-
.../core/command/CreateImageCmdImpl.java | 99 +-
.../core/command/EventStreamReader.java | 2 +
.../core/command/EventsCmdImpl.java | 10 +-
.../core/command/ExecCreateCmdImpl.java | 50 +-
.../core/command/ExecStartCmdImpl.java | 59 +-
.../dockerjava/core/command/FrameReader.java | 25 +-
.../dockerjava/core/command/InfoCmdImpl.java | 12 +-
.../core/command/InspectContainerCmdImpl.java | 34 +-
.../core/command/InspectExecCmdImpl.java | 3 +-
.../core/command/InspectImageCmdImpl.java | 35 +-
.../core/command/KillContainerCmdImpl.java | 48 +-
.../core/command/ListContainersCmdImpl.java | 122 +--
.../core/command/ListImagesCmdImpl.java | 50 +-
.../core/command/LogContainerCmdImpl.java | 170 ++--
.../core/command/PauseContainerCmdImpl.java | 48 +-
.../dockerjava/core/command/PingCmdImpl.java | 6 +-
.../core/command/PullImageCmdImpl.java | 53 +-
.../core/command/PushImageCmdImpl.java | 44 +-
.../core/command/RemoveContainerCmdImpl.java | 111 +--
.../core/command/RemoveImageCmdImpl.java | 88 +-
.../core/command/RestartContainerCmdImpl.java | 55 +-
.../core/command/SaveImageCmdImpl.java | 14 +-
.../core/command/SearchImagesCmdImpl.java | 31 +-
.../dockerjava/core/command/StatsCmdImpl.java | 10 +-
.../core/command/StopContainerCmdImpl.java | 67 +-
.../core/command/TagImageCmdImpl.java | 105 ++-
.../core/command/TopContainerCmdImpl.java | 54 +-
.../core/command/UnpauseContainerCmdImpl.java | 48 +-
.../core/command/VersionCmdImpl.java | 12 +-
.../core/command/WaitContainerCmdImpl.java | 22 +-
.../core/dockerfile/Dockerfile.java | 320 ++++---
.../core/dockerfile/DockerfileStatement.java | 267 +++---
.../core/util/FollowRedirectsFilter.java | 17 +-
.../core/util/JsonClientFilter.java | 5 +-
.../dockerjava/core/util/LoggingFilter.java | 91 +-
.../util/ResponseStatusExceptionFilter.java | 114 ++-
.../core/util/SelectiveLoggingFilter.java | 17 +-
.../dockerjava/jaxrs/AbstrDockerCmdExec.java | 100 +-
.../dockerjava/jaxrs/ApacheUnixSocket.java | 567 ++++++------
.../jaxrs/AttachContainerCmdExec.java | 57 +-
.../github/dockerjava/jaxrs/AuthCmdExec.java | 40 +-
.../dockerjava/jaxrs/BuildImageCmdExec.java | 181 ++--
.../dockerjava/jaxrs/CommitCmdExec.java | 39 +-
.../jaxrs/ContainerDiffCmdExec.java | 34 +-
.../jaxrs/CopyFileFromContainerCmdExec.java | 42 +-
.../jaxrs/CreateContainerCmdExec.java | 31 +-
.../dockerjava/jaxrs/CreateImageCmdExec.java | 39 +-
.../jaxrs/DockerCmdExecFactoryImpl.java | 573 ++++++------
.../dockerjava/jaxrs/EventsCmdExec.java | 157 ++--
.../dockerjava/jaxrs/ExecCreateCmdExec.java | 15 +-
.../dockerjava/jaxrs/ExecStartCmdExec.java | 11 +-
.../github/dockerjava/jaxrs/InfoCmdExec.java | 29 +-
.../jaxrs/InspectContainerCmdExec.java | 34 +-
.../dockerjava/jaxrs/InspectExecCmdExec.java | 3 +-
.../dockerjava/jaxrs/InspectImageCmdExec.java | 32 +-
.../jaxrs/KillContainerCmdExec.java | 35 +-
.../jaxrs/ListContainersCmdExec.java | 39 +-
.../dockerjava/jaxrs/ListImagesCmdExec.java | 41 +-
.../dockerjava/jaxrs/LogContainerCmdExec.java | 45 +-
.../jaxrs/PauseContainerCmdExec.java | 31 +-
.../github/dockerjava/jaxrs/PingCmdExec.java | 20 +-
.../dockerjava/jaxrs/PullImageCmdExec.java | 61 +-
.../dockerjava/jaxrs/PushImageCmdExec.java | 104 +--
.../jaxrs/RemoveContainerCmdExec.java | 31 +-
.../dockerjava/jaxrs/RemoveImageCmdExec.java | 34 +-
.../jaxrs/RestartContainerCmdExec.java | 32 +-
.../dockerjava/jaxrs/SaveImageCmdExec.java | 12 +-
.../dockerjava/jaxrs/SearchImagesCmdExec.java | 31 +-
.../jaxrs/StartContainerCmdExec.java | 29 +-
.../github/dockerjava/jaxrs/StatsCmdExec.java | 19 +-
.../jaxrs/StopContainerCmdExec.java | 30 +-
.../dockerjava/jaxrs/TagImageCmdExec.java | 34 +-
.../dockerjava/jaxrs/TopContainerCmdExec.java | 31 +-
.../jaxrs/UnixConnectionSocketFactory.java | 63 +-
.../jaxrs/UnpauseContainerCmdExec.java | 30 +-
.../dockerjava/jaxrs/VersionCmdExec.java | 22 +-
.../jaxrs/WaitContainerCmdExec.java | 29 +-
.../jaxrs/connector/ApacheConnector.java | 176 ++--
.../ApacheConnectorClientResponse.java | 56 +-
.../connector/ApacheConnectorProvider.java | 59 +-
.../util/WrappedResponseInputStream.java | 115 +--
.../api/command/CommandJSONSamples.java | 12 +-
.../command/InspectContainerResponseTest.java | 12 +-
.../dockerjava/api/model/AccessModeTest.java | 39 +-
.../github/dockerjava/api/model/BindTest.java | 97 +-
.../dockerjava/api/model/BindingTest.java | 90 +-
.../dockerjava/api/model/CapabilityTest.java | 30 +-
.../dockerjava/api/model/ExposedPortTest.java | 54 +-
.../dockerjava/api/model/IdentifierTest.java | 48 +-
.../api/model/InternetProtocolTest.java | 60 +-
.../github/dockerjava/api/model/LinkTest.java | 58 +-
.../dockerjava/api/model/PortBindingTest.java | 93 +-
.../api/model/Ports_SerializingTest.java | 93 +-
.../api/model/Ports_addBindingsTest.java | 97 +-
.../dockerjava/api/model/RepositoryTest.java | 18 +-
.../api/model/RestartPolicy_ParsingTest.java | 60 +-
.../model/RestartPolicy_SerializingTest.java | 61 +-
.../api/model/RestartPolicy_toStringTest.java | 21 +-
.../dockerjava/api/model/VolumeBindsTest.java | 5 +-
.../api/model/VolumeFrom_SerializingTest.java | 29 +-
.../dockerjava/api/model/VolumeTest.java | 8 +-
.../client/AbstractDockerClientTest.java | 262 +++---
.../dockerjava/client/DockerClientTest.java | 68 +-
.../core/CompressArchiveUtilTest.java | 75 +-
.../core/DockerClientConfigTest.java | 12 +-
.../dockerjava/core/DockerClientImplTest.java | 3 +-
.../dockerjava/core/GoLangFileMatchTest.java | 10 +-
.../core/TestDockerCmdExecFactory.java | 484 +++++-----
.../core/command/AuthCmdImplTest.java | 58 +-
.../core/command/BuildImageCmdImplTest.java | 326 ++++---
.../core/command/CommitCmdImplTest.java | 109 ++-
.../command/ContainerDiffCmdImplTest.java | 97 +-
.../CopyFileFromContainerCmdImplTest.java | 6 +-
.../command/CreateContainerCmdImplTest.java | 853 ++++++++----------
.../core/command/DockerfileFixture.java | 41 +-
.../core/command/EventStreamReaderITest.java | 38 +-
.../core/command/EventsCmdImplTest.java | 283 +++---
.../core/command/ExecCreateCmdImplTest.java | 6 +-
.../core/command/ExecStartCmdImplTest.java | 7 +-
.../core/command/FrameReaderITest.java | 145 ++-
.../core/command/FrameReaderTest.java | 3 +
.../core/command/InfoCmdImplTest.java | 74 +-
.../core/command/InspectExecCmdImplTest.java | 23 +-
.../command/KillContainerCmdImplTest.java | 105 +--
.../command/ListContainersCmdImplTest.java | 98 +-
.../core/command/ListImagesCmdImplTest.java | 145 ++-
.../core/command/LogContainerCmdImplTest.java | 137 ++-
.../core/command/PullImageCmdImplTest.java | 136 ++-
.../core/command/PushImageCmdImplTest.java | 74 +-
.../command/RemoveContainerCmdImplTest.java | 98 +-
.../core/command/RemoveImageCmdImplTest.java | 88 +-
.../command/RestartContainerCmdImplTest.java | 116 ++-
.../core/command/SaveImageCmdImplTest.java | 7 +-
.../core/command/SearchImagesCmdImplTest.java | 63 +-
.../core/command/StatsCmdImplTest.java | 158 ++--
.../command/StopContainerCmdImplTest.java | 101 +--
.../core/command/TagImageCmdImplTest.java | 71 +-
.../core/command/VersionCmdImplTest.java | 61 +-
.../command/WaitContainerCmdImplTest.java | 102 +--
.../core/dockerfile/DockerfileTest.java | 49 +-
.../test/serdes/AbstractJSONResourceRef.java | 4 +-
.../test/serdes/JSONResourceRef.java | 7 +-
.../test/serdes/JSONTestHelper.java | 94 +-
256 files changed, 9586 insertions(+), 10050 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/src/main/java/com/github/dockerjava/api/BadRequestException.java
index 1e04bcb3b..2696c5bc1 100644
--- a/src/main/java/com/github/dockerjava/api/BadRequestException.java
+++ b/src/main/java/com/github/dockerjava/api/BadRequestException.java
@@ -1,22 +1,21 @@
package com.github.dockerjava.api;
-
/**
*
*/
public class BadRequestException extends DockerException {
- private static final long serialVersionUID = -2450396075981100160L;
+ private static final long serialVersionUID = -2450396075981100160L;
- public BadRequestException(String message, Throwable cause) {
+ public BadRequestException(String message, Throwable cause) {
super(message, 400, cause);
}
-
- public BadRequestException(String message) {
+
+ public BadRequestException(String message) {
this(message, null);
}
-
- public BadRequestException(Throwable cause) {
+
+ public BadRequestException(Throwable cause) {
this(cause.getMessage(), cause);
}
diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/src/main/java/com/github/dockerjava/api/ConflictException.java
index bed2a375e..6a84fdee3 100644
--- a/src/main/java/com/github/dockerjava/api/ConflictException.java
+++ b/src/main/java/com/github/dockerjava/api/ConflictException.java
@@ -1,22 +1,21 @@
package com.github.dockerjava.api;
-
/**
*
*/
public class ConflictException extends DockerException {
- private static final long serialVersionUID = -290093024775500239L;
+ private static final long serialVersionUID = -290093024775500239L;
- public ConflictException(String message, Throwable cause) {
+ public ConflictException(String message, Throwable cause) {
super(message, 409, cause);
}
-
- public ConflictException(String message) {
+
+ public ConflictException(String message) {
this(message, null);
}
-
- public ConflictException(Throwable cause) {
+
+ public ConflictException(Throwable cause) {
this(cause.getMessage(), cause);
}
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 723c1bad3..2e0543ae9 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -9,114 +9,108 @@
// https://godoc.org/github.com/fsouza/go-dockerclient
public interface DockerClient extends Closeable {
- public AuthConfig authConfig() throws DockerException;
+ public AuthConfig authConfig() throws DockerException;
- /**
- * Authenticate with the server, useful for checking authentication.
- */
- public AuthCmd authCmd();
+ /**
+ * Authenticate with the server, useful for checking authentication.
+ */
+ public AuthCmd authCmd();
- public InfoCmd infoCmd();
+ public InfoCmd infoCmd();
- public PingCmd pingCmd();
+ public PingCmd pingCmd();
- public VersionCmd versionCmd();
+ public VersionCmd versionCmd();
- /**
- * * IMAGE API *
- */
+ /**
+ * * IMAGE API *
+ */
- public PullImageCmd pullImageCmd(String repository);
+ public PullImageCmd pullImageCmd(String repository);
- public PushImageCmd pushImageCmd(String name);
+ public PushImageCmd pushImageCmd(String name);
- public PushImageCmd pushImageCmd(Identifier identifier);
+ public PushImageCmd pushImageCmd(Identifier identifier);
- public CreateImageCmd createImageCmd(String repository,
- InputStream imageStream);
+ public CreateImageCmd createImageCmd(String repository, InputStream imageStream);
- public SearchImagesCmd searchImagesCmd(String term);
+ public SearchImagesCmd searchImagesCmd(String term);
- public RemoveImageCmd removeImageCmd(String imageId);
+ public RemoveImageCmd removeImageCmd(String imageId);
- public ListImagesCmd listImagesCmd();
+ public ListImagesCmd listImagesCmd();
+
+ public InspectImageCmd inspectImageCmd(String imageId);
- public InspectImageCmd inspectImageCmd(String imageId);
-
public SaveImageCmd saveImageCmd(String name);
- /**
- * * CONTAINER API *
- */
-
- public ListContainersCmd listContainersCmd();
-
- public CreateContainerCmd createContainerCmd(String image);
-
- /**
- * Creates a new {@link StartContainerCmd} for the container with the
- * given ID.
- * The command can then be further customized by using builder
- * methods on it like {@link StartContainerCmd#withDns(String...)}.
- *
- * If you customize the command, any existing configuration of the
- * target container will get reset to its default before applying the
- * new configuration. To preserve the existing configuration, use an
- * unconfigured {@link StartContainerCmd}.
- *
- * This command corresponds to the /containers/{id}/start
- * endpoint of the Docker Remote API.
- */
- public StartContainerCmd startContainerCmd(String containerId);
+ /**
+ * * CONTAINER API *
+ */
+
+ public ListContainersCmd listContainersCmd();
+
+ public CreateContainerCmd createContainerCmd(String image);
+
+ /**
+ * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further
+ * customized by using builder methods on it like {@link StartContainerCmd#withDns(String...)}.
+ *
+ * If you customize the command, any existing configuration of the target container will get reset to its default
+ * before applying the new configuration. To preserve the existing configuration, use an unconfigured
+ * {@link StartContainerCmd}.
+ *
+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API.
+ */
+ public StartContainerCmd startContainerCmd(String containerId);
public ExecCreateCmd execCreateCmd(String containerId);
- public InspectContainerCmd inspectContainerCmd(String containerId);
+ public InspectContainerCmd inspectContainerCmd(String containerId);
- public RemoveContainerCmd removeContainerCmd(String containerId);
+ public RemoveContainerCmd removeContainerCmd(String containerId);
- public WaitContainerCmd waitContainerCmd(String containerId);
+ public WaitContainerCmd waitContainerCmd(String containerId);
- public AttachContainerCmd attachContainerCmd(String containerId);
+ public AttachContainerCmd attachContainerCmd(String containerId);
public ExecStartCmd execStartCmd(String containerId);
public InspectExecCmd inspectExecCmd(String execId);
- public LogContainerCmd logContainerCmd(String containerId);
+ public LogContainerCmd logContainerCmd(String containerId);
- public CopyFileFromContainerCmd copyFileFromContainerCmd(
- String containerId, String resource);
+ public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource);
- public ContainerDiffCmd containerDiffCmd(String containerId);
+ public ContainerDiffCmd containerDiffCmd(String containerId);
- public StopContainerCmd stopContainerCmd(String containerId);
+ public StopContainerCmd stopContainerCmd(String containerId);
- public KillContainerCmd killContainerCmd(String containerId);
+ public KillContainerCmd killContainerCmd(String containerId);
- public RestartContainerCmd restartContainerCmd(String containerId);
+ public RestartContainerCmd restartContainerCmd(String containerId);
- public CommitCmd commitCmd(String containerId);
+ public CommitCmd commitCmd(String containerId);
public BuildImageCmd buildImageCmd();
- public BuildImageCmd buildImageCmd(File dockerFileOrFolder);
+ public BuildImageCmd buildImageCmd(File dockerFileOrFolder);
+
+ public BuildImageCmd buildImageCmd(InputStream tarInputStream);
+
+ public TopContainerCmd topContainerCmd(String containerId);
- public BuildImageCmd buildImageCmd(InputStream tarInputStream);
+ public TagImageCmd tagImageCmd(String imageId, String repository, String tag);
- public TopContainerCmd topContainerCmd(String containerId);
+ public PauseContainerCmd pauseContainerCmd(String containerId);
- public TagImageCmd tagImageCmd(String imageId, String repository, String tag);
-
- public PauseContainerCmd pauseContainerCmd(String containerId);
-
- public UnpauseContainerCmd unpauseContainerCmd(String containerId);
+ public UnpauseContainerCmd unpauseContainerCmd(String containerId);
- public EventsCmd eventsCmd(EventCallback eventCallback);
+ public EventsCmd eventsCmd(EventCallback eventCallback);
- public StatsCmd statsCmd(StatsCallback statsCallback);
+ public StatsCmd statsCmd(StatsCallback statsCallback);
- @Override
- public void close() throws IOException;
+ @Override
+ public void close() throws IOException;
}
diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/src/main/java/com/github/dockerjava/api/DockerClientException.java
index 85efc3498..538698bb6 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClientException.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClientException.java
@@ -6,8 +6,8 @@
*/
public class DockerClientException extends RuntimeException {
-private static final long serialVersionUID = 7667768099261650608L;
-
+ private static final long serialVersionUID = 7667768099261650608L;
+
public DockerClientException(String message) {
super(message);
}
diff --git a/src/main/java/com/github/dockerjava/api/DockerException.java b/src/main/java/com/github/dockerjava/api/DockerException.java
index 673bf2ccc..48bb2dd90 100644
--- a/src/main/java/com/github/dockerjava/api/DockerException.java
+++ b/src/main/java/com/github/dockerjava/api/DockerException.java
@@ -1,8 +1,5 @@
package com.github.dockerjava.api;
-
-
-
/**
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
@@ -11,9 +8,9 @@
public class DockerException extends RuntimeException {
-private static final long serialVersionUID = 7667768099261650608L;
-
- private int httpStatus = 0;
+ private static final long serialVersionUID = 7667768099261650608L;
+
+ private int httpStatus = 0;
public DockerException(String message, int httpStatus) {
super(message);
@@ -23,8 +20,8 @@ public DockerException(String message, int httpStatus) {
public DockerException(String message, int httpStatus, Throwable cause) {
super(message, cause);
}
-
+
public int getHttpStatus() {
- return httpStatus;
- }
+ return httpStatus;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java
index 366484e53..cda5602ed 100644
--- a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java
+++ b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java
@@ -5,17 +5,17 @@
*/
public class InternalServerErrorException extends DockerException {
- private static final long serialVersionUID = -2450396075981100160L;
+ private static final long serialVersionUID = -2450396075981100160L;
- public InternalServerErrorException(String message, Throwable cause) {
+ public InternalServerErrorException(String message, Throwable cause) {
super(message, 500, cause);
}
-
- public InternalServerErrorException(String message) {
+
+ public InternalServerErrorException(String message) {
this(message, null);
}
-
- public InternalServerErrorException(Throwable cause) {
+
+ public InternalServerErrorException(Throwable cause) {
this(cause.getMessage(), cause);
}
diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java
index affa4ce9b..78345a68b 100644
--- a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java
+++ b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java
@@ -5,17 +5,17 @@
*/
public class NotAcceptableException extends DockerException {
- private static final long serialVersionUID = -1771212181727204375L;
+ private static final long serialVersionUID = -1771212181727204375L;
- public NotAcceptableException(String message, Throwable cause) {
+ public NotAcceptableException(String message, Throwable cause) {
super(message, 406, cause);
}
-
- public NotAcceptableException(String message) {
+
+ public NotAcceptableException(String message) {
this(message, null);
}
-
- public NotAcceptableException(Throwable cause) {
+
+ public NotAcceptableException(Throwable cause) {
this(cause.getMessage(), cause);
}
diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/src/main/java/com/github/dockerjava/api/NotFoundException.java
index 10f328cdc..67e6f18bf 100644
--- a/src/main/java/com/github/dockerjava/api/NotFoundException.java
+++ b/src/main/java/com/github/dockerjava/api/NotFoundException.java
@@ -7,17 +7,17 @@
*/
public class NotFoundException extends DockerException {
- private static final long serialVersionUID = -2450396075981100160L;
+ private static final long serialVersionUID = -2450396075981100160L;
- public NotFoundException(String message, Throwable cause) {
+ public NotFoundException(String message, Throwable cause) {
super(message, 404, cause);
}
-
- public NotFoundException(String message) {
+
+ public NotFoundException(String message) {
this(message, null);
}
-
- public NotFoundException(Throwable cause) {
+
+ public NotFoundException(Throwable cause) {
this(cause.getMessage(), cause);
}
}
diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/src/main/java/com/github/dockerjava/api/NotModifiedException.java
index d521bae2d..fa0aa459f 100644
--- a/src/main/java/com/github/dockerjava/api/NotModifiedException.java
+++ b/src/main/java/com/github/dockerjava/api/NotModifiedException.java
@@ -5,17 +5,17 @@
*/
public class NotModifiedException extends DockerException {
- private static final long serialVersionUID = -290093024775500239L;
+ private static final long serialVersionUID = -290093024775500239L;
- public NotModifiedException(String message, Throwable cause) {
+ public NotModifiedException(String message, Throwable cause) {
super(message, 304, cause);
}
-
- public NotModifiedException(String message) {
+
+ public NotModifiedException(String message) {
this(message, null);
}
-
- public NotModifiedException(Throwable cause) {
+
+ public NotModifiedException(Throwable cause) {
this(cause.getMessage(), cause);
}
diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java
index 5d48d2163..b097d6523 100644
--- a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java
+++ b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java
@@ -5,17 +5,17 @@
*/
public class UnauthorizedException extends DockerException {
- private static final long serialVersionUID = 8257731964780578278L;
+ private static final long serialVersionUID = 8257731964780578278L;
- public UnauthorizedException(String message, Throwable cause) {
+ public UnauthorizedException(String message, Throwable cause) {
super(message, 401, cause);
}
-
- public UnauthorizedException(String message) {
+
+ public UnauthorizedException(String message) {
this(message, null);
}
-
- public UnauthorizedException(Throwable cause) {
+
+ public UnauthorizedException(Throwable cause) {
this(cause.getMessage(), cause);
}
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 0fb72d452..c45a73247 100644
--- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
@@ -18,64 +18,60 @@
* @param stderr
* - true or false, includes stderr log. Defaults to false.
* @param timestamps
- * - true or false, if true, print timestamps for every log line.
- * Defaults to false.
+ * - true or false, if true, print timestamps for every log line. Defaults to false.
*/
public interface AttachContainerCmd extends DockerCmd {
- public String getContainerId();
+ public String getContainerId();
- public boolean hasLogsEnabled();
+ public boolean hasLogsEnabled();
- public boolean hasFollowStreamEnabled();
+ public boolean hasFollowStreamEnabled();
- public boolean hasTimestampsEnabled();
+ public boolean hasTimestampsEnabled();
- public boolean hasStdoutEnabled();
+ public boolean hasStdoutEnabled();
- public boolean hasStderrEnabled();
+ public boolean hasStderrEnabled();
- public AttachContainerCmd withContainerId(String containerId);
+ public AttachContainerCmd withContainerId(String containerId);
- /**
- * See {@link #withFollowStream(boolean)}
- */
- public AttachContainerCmd withFollowStream();
+ /**
+ * See {@link #withFollowStream(boolean)}
+ */
+ public AttachContainerCmd withFollowStream();
- /**
- * Following the stream means the resulting {@link InputStream} returned by
- * {@link #exec()} reads infinitely. So a {@link InputStream#read()} MAY
- * BLOCK FOREVER as long as no data is streamed from the docker host to
- * {@link DockerClient}!
- */
- public AttachContainerCmd withFollowStream(boolean followStream);
+ /**
+ * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a
+ * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to
+ * {@link DockerClient}!
+ */
+ public AttachContainerCmd withFollowStream(boolean followStream);
- public AttachContainerCmd withTimestamps(boolean timestamps);
+ public AttachContainerCmd withTimestamps(boolean timestamps);
- public AttachContainerCmd withStdOut();
+ public AttachContainerCmd withStdOut();
- public AttachContainerCmd withStdOut(boolean stdout);
+ public AttachContainerCmd withStdOut(boolean stdout);
- public AttachContainerCmd withStdErr();
+ public AttachContainerCmd withStdErr();
- public AttachContainerCmd withStdErr(boolean stderr);
+ public AttachContainerCmd withStdErr(boolean stderr);
- public AttachContainerCmd withLogs(boolean logs);
+ public AttachContainerCmd withLogs(boolean logs);
- public AttachContainerCmd withLogs();
+ public AttachContainerCmd withLogs();
- /**
- * 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;
+ /**
+ * 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 DockerCmdExec {
+ }
}
\ No newline at end of file
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 3c5922583..c84fcb3b9 100644
--- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
@@ -10,20 +10,21 @@
*
*/
public interface AuthCmd extends DockerCmd {
-
- public AuthConfig getAuthConfig();
- public AuthCmd withAuthConfig(AuthConfig authConfig);
+ public AuthConfig getAuthConfig();
+
+ public AuthCmd withAuthConfig(AuthConfig authConfig);
/**
* @return The status. Based on it's value you may mean you need to authorise your account, e.g.:
- * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it."
- * @throws UnauthorizedException If you're not authorised (e.g. bad password).
+ * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it."
+ * @throws UnauthorizedException
+ * If you're not authorised (e.g. bad password).
*/
- @Override
- public AuthResponse exec() throws UnauthorizedException;
-
- public static interface Exec extends DockerCmdExec {
- }
+ @Override
+ public AuthResponse exec() throws UnauthorizedException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
}
\ 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 925946db4..5dd1cc177 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -14,58 +14,58 @@
* TODO: http://docs.docker.com/reference/builder/#dockerignore
*
*/
-public interface BuildImageCmd extends DockerCmd{
+public interface BuildImageCmd extends DockerCmd {
- public BuildImageCmd withTag(String tag);
+ public BuildImageCmd withTag(String tag);
- public InputStream getTarInputStream();
+ public InputStream getTarInputStream();
- public String getTag();
+ public String getTag();
- public boolean hasNoCacheEnabled();
+ public boolean hasNoCacheEnabled();
- public boolean hasRemoveEnabled();
-
- public boolean isQuiet();
-
- public boolean hasPullEnabled();
+ public boolean hasRemoveEnabled();
+
+ public boolean isQuiet();
+
+ public boolean hasPullEnabled();
public String getPathToDockerfile();
- public AuthConfigurations getBuildAuthConfigs();
+ public AuthConfigurations getBuildAuthConfigs();
public BuildImageCmd withBaseDirectory(File baseDirectory);
public BuildImageCmd withDockerfile(File dockerfile);
-
- public BuildImageCmd withTarInputStream(InputStream tarInputStream);
-
- public BuildImageCmd withNoCache();
-
- public BuildImageCmd withNoCache(boolean noCache);
-
- public BuildImageCmd withRemove();
-
- public BuildImageCmd withRemove(boolean rm);
-
- public BuildImageCmd withQuiet();
-
- public BuildImageCmd withQuiet(boolean quiet);
-
- public BuildImageCmd withPull();
-
- public BuildImageCmd withPull(boolean pull);
-
- public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig);
-
- public static interface Exec extends DockerCmdExec {
- }
-
- /**
- * @see {@link com.github.dockerjava.core.command.EventStreamReader}
- */
- public static abstract class Response extends InputStream {
- public abstract Iterable getItems() throws IOException;
- }
+
+ public BuildImageCmd withTarInputStream(InputStream tarInputStream);
+
+ public BuildImageCmd withNoCache();
+
+ public BuildImageCmd withNoCache(boolean noCache);
+
+ public BuildImageCmd withRemove();
+
+ public BuildImageCmd withRemove(boolean rm);
+
+ public BuildImageCmd withQuiet();
+
+ public BuildImageCmd withQuiet(boolean quiet);
+
+ public BuildImageCmd withPull();
+
+ public BuildImageCmd withPull(boolean pull);
+
+ public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+ /**
+ * @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 ac0a7bb5e..2c24a0f42 100644
--- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
@@ -5,111 +5,112 @@
import com.github.dockerjava.api.model.Volumes;
/**
-*
-* Create a new image from a container's changes. Returns the new image ID.
-*
-*/
-public interface CommitCmd extends DockerCmd{
+ *
+ * Create a new image from a container's changes. Returns the new image ID.
+ *
+ */
+public interface CommitCmd extends DockerCmd {
- public String getContainerId();
-
- public CommitCmd withContainerId(String containerId);
+ public String getContainerId();
- public String getRepository();
+ public CommitCmd withContainerId(String containerId);
- public String getTag();
+ public String getRepository();
- public String getMessage();
+ public String getTag();
- public String getAuthor();
+ public String getMessage();
- public boolean hasPauseEnabled();
+ public String getAuthor();
- public CommitCmd withAttachStderr(boolean attachStderr);
+ public boolean hasPauseEnabled();
- public CommitCmd withAttachStderr();
+ public CommitCmd withAttachStderr(boolean attachStderr);
- public CommitCmd withAttachStdin(boolean attachStdin);
+ public CommitCmd withAttachStderr();
- public CommitCmd withAttachStdin();
+ public CommitCmd withAttachStdin(boolean attachStdin);
- public CommitCmd withAttachStdout(boolean attachStdout);
+ public CommitCmd withAttachStdin();
- public CommitCmd withAttachStdout();
+ public CommitCmd withAttachStdout(boolean attachStdout);
- public CommitCmd withCmd(String... cmd);
+ public CommitCmd withAttachStdout();
- public CommitCmd withDisableNetwork(boolean disableNetwork);
+ public CommitCmd withCmd(String... cmd);
- public CommitCmd withAuthor(String author);
+ public CommitCmd withDisableNetwork(boolean disableNetwork);
- public CommitCmd withMessage(String message);
+ public CommitCmd withAuthor(String author);
- public CommitCmd withTag(String tag);
+ public CommitCmd withMessage(String message);
- public CommitCmd withRepository(String repository);
+ public CommitCmd withTag(String tag);
- public CommitCmd withPause(boolean pause);
+ public CommitCmd withRepository(String repository);
- public String[] getEnv();
+ public CommitCmd withPause(boolean pause);
- public CommitCmd withEnv(String... env);
+ public String[] getEnv();
- public ExposedPorts getExposedPorts();
+ public CommitCmd withEnv(String... env);
- public CommitCmd withExposedPorts(ExposedPorts exposedPorts);
+ public ExposedPorts getExposedPorts();
- public String getHostname();
+ public CommitCmd withExposedPorts(ExposedPorts exposedPorts);
- public CommitCmd withHostname(String hostname);
+ public String getHostname();
- public Integer getMemory();
+ public CommitCmd withHostname(String hostname);
- public CommitCmd withMemory(Integer memory);
+ public Integer getMemory();
- public Integer getMemorySwap();
+ public CommitCmd withMemory(Integer memory);
- public CommitCmd withMemorySwap(Integer memorySwap);
+ public Integer getMemorySwap();
- public boolean isOpenStdin();
+ public CommitCmd withMemorySwap(Integer memorySwap);
- public CommitCmd withOpenStdin(boolean openStdin);
+ public boolean isOpenStdin();
- public String[] getPortSpecs();
+ public CommitCmd withOpenStdin(boolean openStdin);
- public CommitCmd withPortSpecs(String... portSpecs);
+ public String[] getPortSpecs();
- public boolean isStdinOnce();
+ public CommitCmd withPortSpecs(String... portSpecs);
- public CommitCmd withStdinOnce(boolean stdinOnce);
+ public boolean isStdinOnce();
- public CommitCmd withStdinOnce();
+ public CommitCmd withStdinOnce(boolean stdinOnce);
- public boolean isTty();
+ public CommitCmd withStdinOnce();
- public CommitCmd withTty(boolean tty);
+ public boolean isTty();
- public CommitCmd withTty();
+ public CommitCmd withTty(boolean tty);
- public String getUser();
+ public CommitCmd withTty();
- public CommitCmd withUser(String user);
+ public String getUser();
- public Volumes getVolumes();
+ public CommitCmd withUser(String user);
- public CommitCmd withVolumes(Volumes volumes);
+ public Volumes getVolumes();
- public String getWorkingDir();
+ public CommitCmd withVolumes(Volumes volumes);
- public CommitCmd withWorkingDir(String workingDir);
+ public String getWorkingDir();
- /**
- * @throws NotFoundException No such container
- */
- @Override
- public String exec() throws NotFoundException;
-
- public static interface Exec extends DockerCmdExec {
- }
+ public CommitCmd withWorkingDir(String workingDir);
+
+ /**
+ * @throws NotFoundException
+ * No such container
+ */
+ @Override
+ public String exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
}
\ 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 21d99045d..ed7028460 100644
--- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
@@ -9,22 +9,25 @@
public interface ContainerDiffCmd extends DockerCmd> {
- public String getContainerId();
-
- public ContainerDiffCmd withContainerId(String containerId);
-
- @Override
- public String toString();
-
- /**
- * @throws NotFoundException No such container
- * @throws InternalServerErrorException server error
- * @throws DockerException unexpected http status code
- */
- @Override
- public List exec() throws NotFoundException;
-
- public static interface Exec extends DockerCmdExec> {
- }
+ public String getContainerId();
+
+ public ContainerDiffCmd withContainerId(String containerId);
+
+ @Override
+ public String toString();
+
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws InternalServerErrorException
+ * server error
+ * @throws DockerException
+ * unexpected http status code
+ */
+ @Override
+ public List exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec> {
+ }
}
\ 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 5e85d9984..eb67dfbd9 100644
--- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
@@ -6,28 +6,28 @@
public interface CopyFileFromContainerCmd extends DockerCmd {
- public String getContainerId();
+ public String getContainerId();
- public String getResource();
+ public String getResource();
- public CopyFileFromContainerCmd withContainerId(String containerId);
+ public CopyFileFromContainerCmd withContainerId(String containerId);
- public CopyFileFromContainerCmd withResource(String resource);
+ public CopyFileFromContainerCmd withResource(String resource);
- public String getHostPath();
+ public String getHostPath();
- public CopyFileFromContainerCmd withHostPath(String hostPath);
+ public CopyFileFromContainerCmd withHostPath(String hostPath);
- /**
- * 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 {
- }
+ /**
+ * 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 {
+ }
}
\ No newline at end of file
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 d26824715..a25535d5b 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
@@ -4,31 +4,33 @@
public interface CreateImageCmd extends DockerCmd {
- public String getRepository();
-
- // TODO remove method
- public String getTag();
-
- public InputStream getImageStream();
-
- /**
- * @param repository the repository to import to
- */
- public CreateImageCmd withRepository(String repository);
-
- /**
- * @param imageStream the InputStream of the tar file
- */
- public CreateImageCmd withImageStream(InputStream imageStream);
-
- /**
- * @param tag any tag for this image
- * @deprecated use repo:tag format for repository
- */
- public CreateImageCmd withTag(String tag);
-
- public static interface Exec extends DockerCmdExec {
- }
-
+ public String getRepository();
+
+ // TODO remove method
+ public String getTag();
+
+ public InputStream getImageStream();
+
+ /**
+ * @param repository
+ * the repository to import to
+ */
+ public CreateImageCmd withRepository(String repository);
+
+ /**
+ * @param imageStream
+ * the InputStream of the tar file
+ */
+ public CreateImageCmd withImageStream(InputStream imageStream);
+
+ /**
+ * @param tag
+ * any tag for this image
+ * @deprecated use repo:tag format for repository
+ */
+ public CreateImageCmd withTag(String tag);
+
+ public static interface Exec extends DockerCmdExec {
+ }
}
\ 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 89c31666f..79236b890 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();
+ public RES_T exec();
}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java
index 8cf13e7bb..635395ed0 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java
@@ -1,7 +1,7 @@
package com.github.dockerjava.api.command;
public interface DockerCmdExec, RES_T> {
-
- public RES_T exec(CMD_T command);
+
+ public RES_T exec(CMD_T command);
}
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
index 294d50994..fc750a743 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -7,82 +7,81 @@
public interface DockerCmdExecFactory extends Closeable {
- public void init(DockerClientConfig dockerClientConfig);
+ public void init(DockerClientConfig dockerClientConfig);
- public AuthCmd.Exec createAuthCmdExec();
+ public AuthCmd.Exec createAuthCmdExec();
- public InfoCmd.Exec createInfoCmdExec();
+ public InfoCmd.Exec createInfoCmdExec();
- public PingCmd.Exec createPingCmdExec();
+ public PingCmd.Exec createPingCmdExec();
public ExecCreateCmd.Exec createExecCmdExec();
- public VersionCmd.Exec createVersionCmdExec();
+ public VersionCmd.Exec createVersionCmdExec();
- public PullImageCmd.Exec createPullImageCmdExec();
+ public PullImageCmd.Exec createPullImageCmdExec();
+
+ public PushImageCmd.Exec createPushImageCmdExec();
- public PushImageCmd.Exec createPushImageCmdExec();
-
public SaveImageCmd.Exec createSaveImageCmdExec();
- public CreateImageCmd.Exec createCreateImageCmdExec();
+ public CreateImageCmd.Exec createCreateImageCmdExec();
- public SearchImagesCmd.Exec createSearchImagesCmdExec();
+ public SearchImagesCmd.Exec createSearchImagesCmdExec();
- public RemoveImageCmd.Exec createRemoveImageCmdExec();
+ public RemoveImageCmd.Exec createRemoveImageCmdExec();
- public ListImagesCmd.Exec createListImagesCmdExec();
+ public ListImagesCmd.Exec createListImagesCmdExec();
- public InspectImageCmd.Exec createInspectImageCmdExec();
+ public InspectImageCmd.Exec createInspectImageCmdExec();
- public ListContainersCmd.Exec createListContainersCmdExec();
+ public ListContainersCmd.Exec createListContainersCmdExec();
- public CreateContainerCmd.Exec createCreateContainerCmdExec();
+ public CreateContainerCmd.Exec createCreateContainerCmdExec();
- public StartContainerCmd.Exec createStartContainerCmdExec();
+ public StartContainerCmd.Exec createStartContainerCmdExec();
- public InspectContainerCmd.Exec createInspectContainerCmdExec();
+ public InspectContainerCmd.Exec createInspectContainerCmdExec();
- public RemoveContainerCmd.Exec createRemoveContainerCmdExec();
+ public RemoveContainerCmd.Exec createRemoveContainerCmdExec();
- public WaitContainerCmd.Exec createWaitContainerCmdExec();
+ public WaitContainerCmd.Exec createWaitContainerCmdExec();
- public AttachContainerCmd.Exec createAttachContainerCmdExec();
+ public AttachContainerCmd.Exec createAttachContainerCmdExec();
public ExecStartCmd.Exec createExecStartCmdExec();
public InspectExecCmd.Exec createInspectExecCmdExec();
- public LogContainerCmd.Exec createLogContainerCmdExec();
+ public LogContainerCmd.Exec createLogContainerCmdExec();
- public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec();
+ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec();
- public StopContainerCmd.Exec createStopContainerCmdExec();
+ public StopContainerCmd.Exec createStopContainerCmdExec();
- public ContainerDiffCmd.Exec createContainerDiffCmdExec();
+ public ContainerDiffCmd.Exec createContainerDiffCmdExec();
- public KillContainerCmd.Exec createKillContainerCmdExec();
+ public KillContainerCmd.Exec createKillContainerCmdExec();
- public RestartContainerCmd.Exec createRestartContainerCmdExec();
+ public RestartContainerCmd.Exec createRestartContainerCmdExec();
- public CommitCmd.Exec createCommitCmdExec();
+ public CommitCmd.Exec createCommitCmdExec();
- public BuildImageCmd.Exec createBuildImageCmdExec();
+ public BuildImageCmd.Exec createBuildImageCmdExec();
- public TopContainerCmd.Exec createTopContainerCmdExec();
+ public TopContainerCmd.Exec createTopContainerCmdExec();
- public TagImageCmd.Exec createTagImageCmdExec();
+ public TagImageCmd.Exec createTagImageCmdExec();
- public PauseContainerCmd.Exec createPauseContainerCmdExec();
+ public PauseContainerCmd.Exec createPauseContainerCmdExec();
- public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
+ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
- public EventsCmd.Exec createEventsCmdExec();
-
- public StatsCmd.Exec createStatsCmdExec();
+ public EventsCmd.Exec createEventsCmdExec();
+ public StatsCmd.Exec createStatsCmdExec();
- @Override
- public void close() throws IOException;
+ @Override
+ public void close() throws IOException;
}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/EventCallback.java b/src/main/java/com/github/dockerjava/api/command/EventCallback.java
index 18b8669ea..867f186cd 100644
--- a/src/main/java/com/github/dockerjava/api/command/EventCallback.java
+++ b/src/main/java/com/github/dockerjava/api/command/EventCallback.java
@@ -7,7 +7,10 @@
*/
public interface EventCallback {
public void onEvent(Event event);
+
public void onException(Throwable throwable);
+
public void onCompletion(int numEvents);
+
public boolean isReceiving();
}
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 cfdb23a64..5a7c2e275 100644
--- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
@@ -2,12 +2,13 @@
import java.util.concurrent.ExecutorService;
-
/**
* Get events
*
- * @param since - Show all events created since timestamp
- * @param until - Stream events until this timestamp
+ * @param since
+ * - Show all events created since timestamp
+ * @param until
+ * - Stream events until this timestamp
*/
public interface EventsCmd extends DockerCmd {
public EventsCmd withSince(String since);
@@ -19,7 +20,7 @@ public interface EventsCmd extends DockerCmd {
public String getUntil();
public EventCallback getEventCallback();
-
+
public EventsCmd withEventCallback(EventCallback eventCallback);
public static interface Exec extends DockerCmdExec {
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 c1f32e293..ffeef0153 100644
--- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
@@ -3,33 +3,33 @@
public interface ExecCreateCmd extends DockerCmd {
public String getContainerId();
-
+
public ExecCreateCmd withContainerId(String containerId);
public ExecCreateCmd withCmd(String... cmd);
public ExecCreateCmd withAttachStdin(boolean attachStdin);
-
+
public ExecCreateCmd withAttachStdin();
-
+
public boolean hasAttachStdinEnabled();
public ExecCreateCmd withAttachStdout(boolean attachStdout);
-
+
public ExecCreateCmd withAttachStdout();
-
+
public boolean hasAttachStdoutEnabled();
public ExecCreateCmd withAttachStderr(boolean attachStderr);
-
+
public ExecCreateCmd withAttachStderr();
-
+
public boolean hasAttachStderrEnabled();
public ExecCreateCmd withTty(boolean tty);
-
+
public ExecCreateCmd withTty();
-
+
public boolean hasTtyEnabled();
public static interface Exec extends DockerCmdExec {
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 7ccb90cff..339e2c9a0 100644
--- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java
@@ -6,33 +6,31 @@
public interface ExecStartCmd extends DockerCmd {
- public String getExecId();
+ public String getExecId();
- public ExecStartCmd withExecId(String execId);
+ public ExecStartCmd withExecId(String execId);
- public boolean hasDetachEnabled();
+ public boolean hasDetachEnabled();
- public ExecStartCmd withDetach(boolean detach);
-
- public ExecStartCmd withDetach();
+ public ExecStartCmd withDetach(boolean detach);
- public boolean hasTtyEnabled();
+ public ExecStartCmd withDetach();
- public ExecStartCmd withTty(boolean tty);
-
- public ExecStartCmd withTty();
+ public boolean hasTtyEnabled();
- /**
- * 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 ExecStartCmd withTty(boolean tty);
- public static interface Exec extends
- DockerCmdExec {
- }
+ public ExecStartCmd withTty();
+
+ /**
+ * 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 {
+ }
}
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 d340fe268..10e3597e6 100644
--- a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
@@ -4,7 +4,7 @@
public interface InfoCmd extends DockerCmd {
- public static interface Exec extends DockerCmdExec {
- }
+ public static interface Exec extends DockerCmdExec {
+ }
}
\ 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 f67fe4aea..e0d087847 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
@@ -4,17 +4,18 @@
public interface InspectContainerCmd extends DockerCmd {
- public String getContainerId();
+ public String getContainerId();
- public InspectContainerCmd withContainerId(String containerId);
+ public InspectContainerCmd withContainerId(String containerId);
- /**
- * @throws NotFoundException No such container
- */
- @Override
- public InspectContainerResponse exec() throws NotFoundException;
-
- public static interface Exec extends DockerCmdExec {
- }
+ /**
+ * @throws NotFoundException
+ * No such container
+ */
+ @Override
+ public InspectContainerResponse exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
index f95656899..dc0507e50 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
@@ -1,6 +1,5 @@
package com.github.dockerjava.api.command;
-
import java.util.List;
import java.util.Map;
@@ -19,58 +18,58 @@
@JsonIgnoreProperties(ignoreUnknown = true)
public class InspectContainerResponse {
- @JsonProperty("Args")
- private String[] args;
+ @JsonProperty("Args")
+ private String[] args;
- @JsonProperty("Config")
- private ContainerConfig config;
+ @JsonProperty("Config")
+ private ContainerConfig config;
- @JsonProperty("Created")
- private String created;
+ @JsonProperty("Created")
+ private String created;
- @JsonProperty("Driver")
- private String driver;
+ @JsonProperty("Driver")
+ private String driver;
- @JsonProperty("ExecDriver")
- private String execDriver;
+ @JsonProperty("ExecDriver")
+ private String execDriver;
- @JsonProperty("HostConfig")
- private HostConfig hostConfig;
+ @JsonProperty("HostConfig")
+ private HostConfig hostConfig;
- @JsonProperty("HostnamePath")
- private String hostnamePath;
+ @JsonProperty("HostnamePath")
+ private String hostnamePath;
- @JsonProperty("HostsPath")
- private String hostsPath;
+ @JsonProperty("HostsPath")
+ private String hostsPath;
- @JsonProperty("Id")
+ @JsonProperty("Id")
private String id;
- @JsonProperty("Image")
- private String imageId;
+ @JsonProperty("Image")
+ private String imageId;
- @JsonProperty("MountLabel")
- private String mountLabel;
+ @JsonProperty("MountLabel")
+ private String mountLabel;
- @JsonProperty("Name")
- private String name;
+ @JsonProperty("Name")
+ private String name;
- @JsonProperty("NetworkSettings")
- private NetworkSettings networkSettings;
+ @JsonProperty("NetworkSettings")
+ private NetworkSettings networkSettings;
- @JsonProperty("Path")
+ @JsonProperty("Path")
private String path;
- @JsonProperty("ProcessLabel")
+ @JsonProperty("ProcessLabel")
private String processLabel;
- @JsonProperty("ResolvConfPath")
- private String resolvConfPath;
+ @JsonProperty("ResolvConfPath")
+ private String resolvConfPath;
@JsonProperty("ExecIDs")
private List