From 912b2f7013b96158ca1695b9a82e68aff9a6e97b Mon Sep 17 00:00:00 2001
From: Ritesh Patel
Date: Wed, 1 Apr 2015 17:32:56 -0700
Subject: [PATCH 0001/1272] Add docker stats support
Add docker stats support for 1.5+
---
.../github/dockerjava/api/DockerClient.java | 2 +
.../api/command/DockerCmdExecFactory.java | 3 +
.../dockerjava/api/command/StatsCallback.java | 13 ++
.../dockerjava/api/command/StatsCmd.java | 22 +++
.../dockerjava/api/model/Statistics.java | 51 +++++++
.../dockerjava/core/DockerClientImpl.java | 6 +
.../dockerjava/core/command/StatsCmdImpl.java | 61 ++++++++
.../jaxrs/DockerCmdExecFactoryImpl.java | 5 +
.../github/dockerjava/jaxrs/StatsCmdExec.java | 90 ++++++++++++
.../client/AbstractDockerClientTest.java | 2 +-
.../core/TestDockerCmdExecFactory.java | 5 +
.../core/command/StatsCmdImplTest.java | 133 ++++++++++++++++++
12 files changed, 392 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/com/github/dockerjava/api/command/StatsCallback.java
create mode 100644 src/main/java/com/github/dockerjava/api/command/StatsCmd.java
create mode 100644 src/main/java/com/github/dockerjava/api/model/Statistics.java
create mode 100644 src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 9e275eb35..723c1bad3 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -114,6 +114,8 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(
public EventsCmd eventsCmd(EventCallback eventCallback);
+ public StatsCmd statsCmd(StatsCallback statsCallback);
+
@Override
public void close() throws IOException;
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 8b9880747..294d50994 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -78,6 +78,9 @@ public interface DockerCmdExecFactory extends Closeable {
public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
public EventsCmd.Exec createEventsCmdExec();
+
+ public StatsCmd.Exec createStatsCmdExec();
+
@Override
public void close() throws IOException;
diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCallback.java b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java
new file mode 100644
index 000000000..610c0f831
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java
@@ -0,0 +1,13 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Statistics;
+
+/**
+ * Stats callback
+ */
+public interface StatsCallback {
+ public void onStats(Statistics stats);
+ public void onException(Throwable throwable);
+ public void onCompletion(int numStats);
+ public boolean isReceiving();
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
new file mode 100644
index 000000000..a605d4267
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api.command;
+
+import java.util.concurrent.ExecutorService;
+
+
+/**
+ * Get stats
+ *
+ */
+public interface StatsCmd extends DockerCmd {
+ public StatsCmd withContainerId(String containerId);
+
+ public String getContainerId();
+
+ public StatsCmd withStatsCallback(StatsCallback statsCallback);
+
+ public StatsCallback getStatsCallback();
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java
new file mode 100644
index 000000000..ff1d6dc95
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java
@@ -0,0 +1,51 @@
+package com.github.dockerjava.api.model;
+
+import java.util.Map;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Representation of a Docker statistics.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Statistics {
+
+ @JsonProperty("read")
+ private String read;
+
+ @JsonProperty("network")
+ private Map networkStats;
+
+ @JsonProperty("memory_stats")
+ private Map memoryStats;
+
+ @JsonProperty("blkio_stats")
+ private Map blkioStats;
+
+ @JsonProperty("cpu_stats")
+ private Map cpuStats;
+
+ public Map getNetworkStats() {
+ return networkStats;
+ }
+
+ public Map getCpuStats() {
+ return cpuStats;
+ }
+
+ public Map getMemoryStats() {
+ return memoryStats;
+ }
+
+ public Map getBlkioStats() {
+ return blkioStats;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
index 534c58ebf..db64d2843 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -336,6 +336,12 @@ public EventsCmd eventsCmd(EventCallback eventCallback) {
return new EventsCmdImpl(getDockerCmdExecFactory()
.createEventsCmdExec(), eventCallback);
}
+
+ @Override
+ public StatsCmd statsCmd(StatsCallback statsCallback) {
+ return new StatsCmdImpl(getDockerCmdExecFactory()
+ .createStatsCmdExec(), statsCallback);
+ }
@Override
public void close() throws IOException {
diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java
new file mode 100644
index 000000000..33fcf6371
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java
@@ -0,0 +1,61 @@
+package com.github.dockerjava.core.command;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.concurrent.ExecutorService;
+
+import com.github.dockerjava.api.command.EventCallback;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.StatsCallback;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.command.TopContainerCmd;
+
+/**
+ * Stream docker stats
+ */
+public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd {
+
+ private String containerId;
+ private StatsCallback statsCallback;
+
+ public StatsCmdImpl(StatsCmd.Exec exec, StatsCallback statsCallback) {
+ super(exec);
+ withStatsCallback(statsCallback);
+ }
+
+ @Override
+ public StatsCmd withContainerId(String containerId) {
+ checkNotNull(containerId, "containerId was not specified");
+ this.containerId = containerId;
+ return this;
+ }
+
+ @Override
+ public String getContainerId() {
+ return containerId;
+ }
+
+ @Override
+ public StatsCmd withStatsCallback(StatsCallback statsCallback) {
+ this.statsCallback = statsCallback;
+ return this;
+ }
+
+
+ @Override
+ public StatsCallback getStatsCallback() {
+ return statsCallback;
+ }
+
+ @Override
+ public ExecutorService exec() {
+ return super.exec();
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder("stats")
+ .append(containerId != null ? " --id=" + containerId : "")
+ .toString();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index bc3afecad..10c039188 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -312,6 +312,11 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
public EventsCmd.Exec createEventsCmdExec() {
return new EventsCmdExec(getBaseResource());
}
+
+ @Override
+ public StatsCmd.Exec createStatsCmdExec() {
+ return new StatsCmdExec(getBaseResource());
+ }
@Override
public void close() throws IOException {
diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
new file mode 100644
index 000000000..97b9a2754
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
@@ -0,0 +1,90 @@
+package com.github.dockerjava.jaxrs;
+
+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 javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+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.command.StatsCallback;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.model.Statistics;
+import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
+
+public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec {
+ private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class);
+
+ public StatsCmdExec(WebTarget baseResource) {
+ super(baseResource);
+ }
+
+ @Override
+ protected ExecutorService execute(StatsCmd command) {
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+
+ WebTarget webResource = getBaseResource().path("/containers/{id}/stats")
+ .resolveTemplate("id", command.getContainerId());
+
+ LOGGER.trace("GET: {}", webResource);
+ StatsNotifier eventNotifier = StatsNotifier.create(command.getStatsCallback(), webResource);
+ executorService.submit(eventNotifier);
+ return executorService;
+ }
+
+ private static class StatsNotifier implements Callable {
+ private static final JsonFactory JSON_FACTORY = new JsonFactory();
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private final StatsCallback statsCallback;
+ private final WebTarget webTarget;
+
+ private StatsNotifier(StatsCallback statsCallback, WebTarget webTarget) {
+ this.statsCallback = statsCallback;
+ this.webTarget = webTarget;
+ }
+
+ public static StatsNotifier create(StatsCallback statsCallback, WebTarget webTarget) {
+ checkNotNull(statsCallback, "An StatsCallback must be provided");
+ checkNotNull(webTarget, "An WebTarget must be provided");
+ return new StatsNotifier(statsCallback, webTarget);
+ }
+
+ @Override
+ public Void call() throws Exception {
+ int numStats=0;
+ Response response = null;
+ try {
+ response = webTarget.request().get(Response.class);
+ InputStream inputStream = new WrappedResponseInputStream(response);
+ JsonParser jp = JSON_FACTORY.createParser(inputStream);
+ while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && statsCallback.isReceiving()) {
+ statsCallback.onStats(OBJECT_MAPPER.readValue(jp, Statistics.class));
+ numStats++;
+ }
+ statsCallback.onCompletion(numStats);
+ LOGGER.info("Finished collecting stats");
+ return null ;
+ }
+ catch(Throwable t) {
+ statsCallback.onException(t);
+ }
+ finally {
+ if (response != null) {
+ response.close();
+ }
+ }
+ return null ;
+ }
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 1e61b9a7d..b04ff63ba 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -60,7 +60,7 @@ private DockerClientConfig config() {
protected DockerClientConfig config(String password) {
DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder()
- .withServerAddress("https://index.docker.io/v1/");
+ .withServerAddress("https://index.docker.io/v1/").withMaxTotalConnections(5).withMaxPerRouteConnections(5);
if (password!=null) {
builder = builder.withPassword(password);
}
diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
index 869a12fcf..fb764474f 100644
--- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
+++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
@@ -258,6 +258,11 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
public EventsCmd.Exec createEventsCmdExec() {
return delegate.createEventsCmdExec();
}
+
+ @Override
+ public StatsCmd.Exec createStatsCmdExec() {
+ return delegate.createStatsCmdExec();
+ }
public List getContainerNames() {
return new ArrayList(containerNames);
diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
new file mode 100644
index 000000000..c5e575373
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
@@ -0,0 +1,133 @@
+package com.github.dockerjava.core.command;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+import com.github.dockerjava.api.DockerException;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.StatsCallback;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.model.Statistics;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+
+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 java.io.IOException;
+import java.lang.reflect.Method;
+import java.security.SecureRandom;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@Test(groups = "integration")
+public class StatsCmdImplTest extends AbstractDockerClientTest {
+
+ private static int NUM_STATS = 5;
+
+ @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 testStatsStreaming() throws InterruptedException, IOException {
+ TimeUnit.SECONDS.sleep(1);
+
+ CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS);
+ StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch);
+
+ String containerName = "generated_" + new SecureRandom().nextInt();
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox")
+ .withCmd("top")
+ .withName(containerName).exec();
+ LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ StatsCmd statsCmd = dockerClient.statsCmd(statsCallback).withContainerId(container.getId());
+ ExecutorService executorService = statsCmd.exec();
+
+ countDownLatch.await(3, TimeUnit.SECONDS);
+ boolean gotStats = statsCallback.gotStats();
+
+ LOG.info("Stop stats collection");
+ executorService.shutdown();
+ statsCallback.close();
+
+ LOG.info("Stopping container");
+ dockerClient.stopContainerCmd(container.getId()).exec();
+ dockerClient.removeContainerCmd(container.getId()).exec();
+
+ LOG.info("Completed test");
+ assertTrue(gotStats, "Expected true");
+
+ }
+
+ private class StatsCallbackTest implements StatsCallback {
+ private final CountDownLatch countDownLatch;
+ private final AtomicBoolean isReceiving = new AtomicBoolean(true);
+ private boolean gotStats = false;
+
+ public StatsCallbackTest(CountDownLatch countDownLatch) {
+ this.countDownLatch = countDownLatch;
+ }
+
+ public void close() {
+ LOG.info("Closing StatsCallback");
+ isReceiving.set(false);
+ }
+
+ @Override
+ public void onStats(Statistics stats) {
+ LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats);
+ if(stats != null) {
+ gotStats = true;
+ }
+ countDownLatch.countDown();
+ }
+
+ @Override
+ public void onException(Throwable throwable) {
+ LOG.error("Error occurred: {}", throwable.getMessage());
+ }
+
+ @Override
+ public void onCompletion(int numStats) {
+ LOG.info("Number of stats received: {}", numStats);
+ }
+
+ @Override
+ public boolean isReceiving() {
+ return isReceiving.get();
+ }
+
+ public boolean gotStats() {
+ return gotStats;
+ }
+ }
+}
From ccd56e90022f01a34b480d84be08d1a291e808f8 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 5 Apr 2015 15:27:36 +0200
Subject: [PATCH 0002/1272] Switch to 1.1.0-SNAPSHOT according to semantic
versioning
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index ba60602ad..c0905b776 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.0.1-SNAPSHOT
+ 1.1.0-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
From ed1fba471788a46acf462e1193c727730ee7ebfc Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 5 Apr 2015 15:31:01 +0200
Subject: [PATCH 0003/1272] [maven-release-plugin] prepare release
docker-java-1.1.0
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index c0905b776..e8f612e87 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.1.0-SNAPSHOT
+ 1.1.0
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ docker-java-1.1.0
From a3bbeae15d3f5dab5ab8a6c0f09b208a02f10642 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 5 Apr 2015 15:31:06 +0200
Subject: [PATCH 0004/1272] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index e8f612e87..957c157c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.1.0
+ 1.1.1-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- docker-java-1.1.0
+ HEAD
From 52cb771b0c81852da1fc30973312318f05268cd9 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 5 Apr 2015 15:36:04 +0200
Subject: [PATCH 0005/1272] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a033ccb4f..0892535a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
Change Log
===
Latest SNAPSHOT
+---
+
+v1.1.0
---
* [#186](https://github.com/docker-java/docker-java/pull/186) Added withPull method to BuilImageCmd
From bdedec016ef62783970dda2ff9d336273a3ccf65 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 5 Apr 2015 16:38:01 +0200
Subject: [PATCH 0006/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0892535a4..62f76dd10 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,8 @@ Change Log
Latest SNAPSHOT
---
+* [#192](https://github.com/docker-java/docker-java/pull/192) Added withPull method to BuilImageCmd Added a Links constructor accepting a List object
+
v1.1.0
---
From 3b4c34631cc5a7d0dadbe8cc29cbe7055427d24c Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 5 Apr 2015 16:38:22 +0200
Subject: [PATCH 0007/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 62f76dd10..c1b319a7d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@ Change Log
Latest SNAPSHOT
---
-* [#192](https://github.com/docker-java/docker-java/pull/192) Added withPull method to BuilImageCmd Added a Links constructor accepting a List object
+* [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object
v1.1.0
---
From b42a3e1f9b74f75126bf3b2dff981b05f92abcb3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 7 Apr 2015 21:06:16 +0200
Subject: [PATCH 0008/1272] Fix issue #164
---
.../api/command/CreateContainerCmd.java | 233 ++++--
.../api/command/StartContainerCmd.java | 134 +--
.../dockerjava/api/model/HostConfig.java | 34 +-
.../github/dockerjava/api/model/Ports.java | 16 +
.../core/command/CreateContainerCmdImpl.java | 766 +++++++++++-------
.../command/CreateContainerCmdImplTest.java | 192 ++++-
.../command/StartContainerCmdImplTest.java | 69 +-
7 files changed, 989 insertions(+), 455 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index c6a1234cb..a2a6dc85f 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -2,111 +2,115 @@
import com.github.dockerjava.api.ConflictException;
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.Capability;
+import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
+import com.github.dockerjava.api.model.Link;
+import com.github.dockerjava.api.model.LxcConf;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
public interface CreateContainerCmd extends DockerCmd{
- public CreateContainerCmd withName(String name);
-
- public String getName();
-
- public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
-
- public ExposedPort[] getExposedPorts();
+ public static interface Exec extends DockerCmdExec {
+ }
- public boolean isDisableNetwork();
+ /**
+ * @throws NotFoundException No such container
+ * @throws ConflictException Named container already exists
+ */
+ @Override
+ public CreateContainerResponse exec() throws NotFoundException,
+ ConflictException;
- public String getWorkingDir();
+ public Bind[] getBinds();
- public CreateContainerCmd withWorkingDir(String workingDir);
+ public Capability[] getCapAdd();
- public String getHostName();
+ public Capability[] getCapDrop();
- public CreateContainerCmd withDisableNetwork(boolean disableNetwork);
+ public String[] getCmd();
- public CreateContainerCmd withHostName(String hostName);
+ public String getCpuset();
- public String[] getPortSpecs();
+ public int getCpuShares();
- public CreateContainerCmd withPortSpecs(String... portSpecs);
+ public Device[] getDevices();
- public String getUser();
+ public String[] getDns();
+
+ public String[] getDnsSearch();
- public CreateContainerCmd withUser(String user);
+ public String[] getEntrypoint();
- public boolean isTty();
+ public String[] getEnv();
- public CreateContainerCmd withTty(boolean tty);
+ public ExposedPort[] getExposedPorts();
+
+ public String[] getExtraHosts();
- public boolean isStdinOpen();
+ public HostConfig getHostConfig();
- public CreateContainerCmd withStdinOpen(boolean stdinOpen);
+ public String getHostName();
- public boolean isStdInOnce();
+ public String getImage();
- public CreateContainerCmd withStdInOnce(boolean stdInOnce);
+ public Link[] getLinks();
+
+ public LxcConf[] getLxcConf();
public long getMemoryLimit();
- public CreateContainerCmd withMemoryLimit(long memoryLimit);
-
public long getMemorySwap();
- public CreateContainerCmd withMemorySwap(long memorySwap);
-
- public int getCpuShares();
-
- public CreateContainerCmd withCpuShares(int cpuShares);
-
- public String getCpuset();
+ public String getName();
+
+ public String getNetworkMode();
+
+ public Ports getPortBindings();
- public CreateContainerCmd withCpuset(String cpuset);
+ public String[] getPortSpecs();
+
+ public RestartPolicy getRestartPolicy();
- public boolean isAttachStdin();
+ public String getUser();
- public CreateContainerCmd withAttachStdin(boolean attachStdin);
+ public Volume[] getVolumes();
- public boolean isAttachStdout();
+ public VolumesFrom[] getVolumesFrom();
- public CreateContainerCmd withAttachStdout(boolean attachStdout);
+ public String getWorkingDir();
public boolean isAttachStderr();
- public CreateContainerCmd withAttachStderr(boolean attachStderr);
-
- public String[] getEnv();
-
- public CreateContainerCmd withEnv(String... env);
-
- public String[] getCmd();
-
- public CreateContainerCmd withCmd(String... cmd);
-
- public String[] getDns();
+ public boolean isAttachStdin();
- public CreateContainerCmd withDns(String... dns);
+ public boolean isAttachStdout();
- public String getImage();
+ public boolean isDisableNetwork();
+
+ public Boolean isPrivileged();
+
+ public Boolean isPublishAllPorts();
- public CreateContainerCmd withImage(String image);
+ public boolean isStdInOnce();
- public Volume[] getVolumes();
+ public boolean isStdinOpen();
- public CreateContainerCmd withVolumes(Volume... volumes);
+ public boolean isTty();
- public VolumesFrom[] getVolumesFrom();
+ public CreateContainerCmd withAttachStderr(boolean attachStderr);
- public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
+ public CreateContainerCmd withAttachStdin(boolean attachStdin);
- public HostConfig getHostConfig();
+ public CreateContainerCmd withAttachStdout(boolean attachStdout);
- public CreateContainerCmd withHostConfig(HostConfig hostConfig);
-
- public Capability[] getCapAdd();
+ public CreateContainerCmd withBinds(Bind... binds);
/**
* Add linux {
*/
public CreateContainerCmd withCapAdd(Capability... capAdd);
- public Capability[] getCapDrop();
-
/**
* Drop linux kernel
@@ -125,21 +127,114 @@ public interface CreateContainerCmd extends DockerCmd{
* prevents the container from changing the owner of any files.
*/
public CreateContainerCmd withCapDrop(Capability... capDrop);
+
+ public CreateContainerCmd withCmd(String... cmd);
+
+ public CreateContainerCmd withCpuset(String cpuset);
+ public CreateContainerCmd withCpuShares(int cpuShares);
- public String[] getEntrypoint();
+ /**
+ * Add host devices to the container
+ */
+ public CreateContainerCmd withDevices(Device... devices);
+
+ public CreateContainerCmd withDisableNetwork(boolean disableNetwork);
+
+ /**
+ * Set custom DNS servers
+ */
+ public CreateContainerCmd withDns(String... dns);
+ /**
+ * Set custom DNS search domains
+ */
+ public CreateContainerCmd withDnsSearch(String... dnsSearch);
+
public CreateContainerCmd withEntrypoint(String... entrypoint);
+
+ public CreateContainerCmd withEnv(String... env);
+
+ public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
/**
- * @throws NotFoundException No such container
- * @throws ConflictException Named container already exists
+ * Add hostnames to /etc/hosts in the container
*/
- @Override
- public CreateContainerResponse exec() throws NotFoundException,
- ConflictException;
+ public CreateContainerCmd withExtraHosts(String... extraHosts);
- public static interface Exec extends DockerCmdExec {
- }
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig);
+
+ public CreateContainerCmd withHostName(String hostName);
+
+ public CreateContainerCmd withImage(String image);
+
+ /**
+ * Add link to another container.
+ */
+ public CreateContainerCmd withLinks(Link... links);
+
+ public CreateContainerCmd withLxcConf(LxcConf... lxcConf);
+
+ public CreateContainerCmd withMemoryLimit(long memoryLimit);
+
+ public CreateContainerCmd withMemorySwap(long memorySwap);
+
+ public CreateContainerCmd withName(String name);
+
+
+ /**
+ * 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.
+ *
+ */
+ public CreateContainerCmd withNetworkMode(String networkMode);
+
+ /**
+ * Add one or more {@link PortBinding}s.
+ * This corresponds to the --publish (-p)
+ * option of the docker run CLI command.
+ */
+ public CreateContainerCmd withPortBindings(PortBinding... portBindings);
+
+ /**
+ * Add the port bindings that are contained in the given {@link Ports}
+ * object.
+ *
+ * @see #withPortBindings(PortBinding...)
+ */
+ public CreateContainerCmd withPortBindings(Ports portBindings);
+
+ public CreateContainerCmd withPortSpecs(String... portSpecs);
+
+ public CreateContainerCmd withPrivileged(boolean privileged);
+
+ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts);
+
+ /**
+ * Set custom {@link RestartPolicy} for the container. Defaults to
+ * {@link RestartPolicy#noRestart()}
+ */
+ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
+
+ public CreateContainerCmd withStdInOnce(boolean stdInOnce);
+
+ public CreateContainerCmd withStdinOpen(boolean stdinOpen);
+
+ public CreateContainerCmd withTty(boolean tty);
+
+ public CreateContainerCmd withUser(String user);
+
+ public CreateContainerCmd withVolumes(Volume... volumes);
+
+ public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
+
+ public CreateContainerCmd withWorkingDir(String workingDir);
}
diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
index de70b97cb..e76598e3e 100644
--- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
@@ -18,72 +18,79 @@
*/
public interface StartContainerCmd extends DockerCmd {
- public Bind[] getBinds();
+ public static interface Exec extends DockerCmdExec {
+ }
- public Link[] getLinks();
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws NotModifiedException
+ * Container already started
+ */
+ @Override
+ public Void exec() throws NotFoundException, NotModifiedException;
- public LxcConf[] getLxcConf();
+ public Bind[] getBinds();
- public Ports getPortBindings();
+ public Capability[] getCapAdd();
- public Boolean isPublishAllPorts();
+ public Capability[] getCapDrop();
- public Boolean isPrivileged();
+ public String getContainerId();
+
+ public Device[] getDevices();
public String[] getDns();
public String[] getDnsSearch();
- public String getVolumesFrom();
+ public String[] getExtraHosts();
- public String getContainerId();
+ public Link[] getLinks();
- public String getNetworkMode();
+ public LxcConf[] getLxcConf();
- public Device[] getDevices();
+ public String getNetworkMode();
- public String[] getExtraHosts();
+ public Ports getPortBindings();
public RestartPolicy getRestartPolicy();
- public Capability[] getCapAdd();
-
- public Capability[] getCapDrop();
+ public String getVolumesFrom();
- @Deprecated
- public StartContainerCmd withBinds(Bind... binds);
+ public Boolean isPrivileged();
- /**
- * Add link to another container.
- */
- @Deprecated
- public StartContainerCmd withLinks(Link... links);
+ public Boolean isPublishAllPorts();
@Deprecated
- public StartContainerCmd withLxcConf(LxcConf... lxcConf);
+ public StartContainerCmd withBinds(Bind... binds);
/**
- * Add the port bindings that are contained in the given {@link Ports}
- * object.
- *
- * @see #withPortBindings(PortBinding...)
+ * Add linux kernel
+ * capability to the container. For example: adding {@link Capability#MKNOD}
+ * allows the container to create special files using the 'mknod' command.
*/
@Deprecated
- public StartContainerCmd withPortBindings(Ports portBindings);
+ public StartContainerCmd withCapAdd(Capability... capAdd);
/**
- * Add one or more {@link PortBinding}s.
- * This corresponds to the --publish (-p)
- * option of the docker run CLI command.
+ * Drop linux kernel
+ * capability from the container. For example: dropping {@link Capability#CHOWN}
+ * prevents the container from changing the owner of any files.
*/
@Deprecated
- public StartContainerCmd withPortBindings(PortBinding... portBindings);
+ public StartContainerCmd withCapDrop(Capability... capDrop);
@Deprecated
- public StartContainerCmd withPrivileged(Boolean privileged);
+ public StartContainerCmd withContainerId(String containerId);
+ /**
+ * Add host devices to the container
+ */
@Deprecated
- public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts);
+ public StartContainerCmd withDevices(Device... devices);
/**
* Set custom DNS servers
@@ -97,11 +104,20 @@ public interface StartContainerCmd extends DockerCmd {
@Deprecated
public StartContainerCmd withDnsSearch(String... dnsSearch);
+ /**
+ * Add hostnames to /etc/hosts in the container
+ */
@Deprecated
- public StartContainerCmd withVolumesFrom(String volumesFrom);
+ public StartContainerCmd withExtraHosts(String... extraHosts);
+ /**
+ * Add link to another container.
+ */
@Deprecated
- public StartContainerCmd withContainerId(String containerId);
+ public StartContainerCmd withLinks(Link... links);
+
+ @Deprecated
+ public StartContainerCmd withLxcConf(LxcConf... lxcConf);
/**
* Set the Network mode for the container
@@ -119,52 +135,36 @@ public interface StartContainerCmd extends DockerCmd {
public StartContainerCmd withNetworkMode(String networkMode);
/**
- * Add host devices to the container
+ * Add one or more {@link PortBinding}s.
+ * This corresponds to the --publish (-p)
+ * option of the docker run CLI command.
*/
@Deprecated
- public StartContainerCmd withDevices(Device... devices);
+ public StartContainerCmd withPortBindings(PortBinding... portBindings);
/**
- * Add hostnames to /etc/hosts in the container
+ * Add the port bindings that are contained in the given {@link Ports}
+ * object.
+ *
+ * @see #withPortBindings(PortBinding...)
*/
@Deprecated
- public StartContainerCmd withExtraHosts(String... extraHosts);
+ public StartContainerCmd withPortBindings(Ports portBindings);
- /**
- * Set custom {@link RestartPolicy} for the container. Defaults to
- * {@link RestartPolicy#noRestart()}
- */
@Deprecated
- public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
+ public StartContainerCmd withPrivileged(Boolean privileged);
- /**
- * Add linux kernel
- * capability to the container. For example: adding {@link Capability#MKNOD}
- * allows the container to create special files using the 'mknod' command.
- */
@Deprecated
- public StartContainerCmd withCapAdd(Capability... capAdd);
+ public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts);
/**
- * Drop linux kernel
- * capability from the container. For example: dropping {@link Capability#CHOWN}
- * prevents the container from changing the owner of any files.
+ * Set custom {@link RestartPolicy} for the container. Defaults to
+ * {@link RestartPolicy#noRestart()}
*/
@Deprecated
- public StartContainerCmd withCapDrop(Capability... capDrop);
-
- /**
- * @throws NotFoundException
- * No such container
- * @throws NotModifiedException
- * Container already started
- */
- @Override
- public Void exec() throws NotFoundException, NotModifiedException;
+ public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
- public static interface Exec extends DockerCmdExec {
- }
+ @Deprecated
+ public StartContainerCmd withVolumesFrom(String volumesFrom);
}
diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
index c72d078b1..18fd34073 100644
--- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
@@ -1,7 +1,10 @@
package com.github.dockerjava.api.model;
+import java.util.Map;
+
import org.apache.commons.lang.builder.ToStringBuilder;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -9,7 +12,7 @@
public class HostConfig {
@JsonProperty("Binds")
- private String[] binds;
+ private Binds binds;
@JsonProperty("Links")
private Links links;
@@ -59,12 +62,12 @@ public class HostConfig {
public HostConfig() {
}
- public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts,
+ public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts,
boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile,
Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices,
String[] extraHosts) {
- this.binds = binds;
- this.links = links;
+ this.binds = new Binds(binds);
+ this.links = new Links(links);
this.lxcConf = lxcConf;
this.portBindings = portBindings;
this.publishAllPorts = publishAllPorts;
@@ -81,14 +84,16 @@ public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBind
this.extraHosts = extraHosts;
}
- public String[] getBinds() {
- return binds;
+
+ @JsonIgnore
+ public Bind[] getBinds() {
+ return (binds == null) ? new Bind[0] : binds.getBinds();
}
public LxcConf[] getLxcConf() {
return lxcConf;
}
-
+
public Ports getPortBindings() {
return portBindings;
}
@@ -117,8 +122,9 @@ public String[] getDnsSearch() {
return dnsSearch;
}
- public Links getLinks() {
- return links;
+ @JsonIgnore
+ public Link[] getLinks() {
+ return (links == null) ? new Link[0] : links.getLinks();
}
public String getNetworkMode() {
@@ -145,12 +151,14 @@ public Capability[] getCapDrop() {
return capDrop;
}
- public void setBinds(String[] binds) {
- this.binds = binds;
+ @JsonIgnore
+ public void setBinds(Bind... binds) {
+ this.binds = new Binds(binds);
}
- public void setLinks(Links links) {
- this.links = links;
+ @JsonIgnore
+ public void setLinks(Link... links) {
+ this.links = new Links(links);
}
public void setLxcConf(LxcConf[] lxcConf) {
diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java
index e0f3c0806..d7c8a3245 100644
--- a/src/main/java/com/github/dockerjava/api/model/Ports.java
+++ b/src/main/java/com/github/dockerjava/api/model/Ports.java
@@ -3,8 +3,10 @@
import static org.apache.commons.lang.StringUtils.isEmpty;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -59,6 +61,10 @@ public Ports() { }
public Ports(ExposedPort exposedPort, Binding host) {
bind(exposedPort, host);
}
+
+ public Ports(PortBinding... portBindings) {
+ add(portBindings);
+ }
/**
* Adds a new {@link PortBinding} for the specified {@link ExposedPort} and
@@ -97,6 +103,16 @@ public String toString(){
public Map getBindings(){
return ports;
}
+
+// public PortBinding[] getBindingsAsArray() {
+// List bindings = new ArrayList<>();
+// for(Map.Entry entry: ports.entrySet()) {
+// for(Ports.Binding binding : entry.getValue()) {
+// bindings.add(new PortBinding(binding, entry.getKey()));
+// }
+// }
+// return bindings.toArray(new PortBinding[bindings.size()]);
+// }
/**
* Creates a {@link Binding} for the given IP address and port number.
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index ac32960a9..5afd0dbb8 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -10,370 +10,546 @@
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.Capability;
+import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.ExposedPorts;
import com.github.dockerjava.api.model.HostConfig;
+import com.github.dockerjava.api.model.Link;
+import com.github.dockerjava.api.model.LxcConf;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.api.model.Volumes;
/**
- *
+ *
* Creates a new container.
- *
+ *
*/
-public class CreateContainerCmdImpl extends AbstrDockerCmd implements CreateContainerCmd {
+public class CreateContainerCmdImpl extends
+ AbstrDockerCmd implements
+ CreateContainerCmd {
private String name;
-
- @JsonProperty("Hostname") private String hostName = "";
- @JsonProperty("User") private String user = "";
- @JsonProperty("Memory") private long memoryLimit = 0;
- @JsonProperty("MemorySwap") private long memorySwap = 0;
- @JsonProperty("CpuShares") private int cpuShares = 0;
- @JsonProperty("Cpuset") private String cpuset;
- @JsonProperty("AttachStdin") private boolean attachStdin = false;
- @JsonProperty("AttachStdout") private boolean attachStdout = false;
- @JsonProperty("AttachStderr") private boolean attachStderr = false;
- @JsonProperty("PortSpecs") private String[] portSpecs;
- @JsonProperty("Tty") private boolean tty = false;
- @JsonProperty("OpenStdin") private boolean stdinOpen = false;
- @JsonProperty("StdinOnce") private boolean stdInOnce = false;
- @JsonProperty("Env") private String[] env;
- @JsonProperty("Cmd") private String[] cmd;
- @JsonProperty("Entrypoint") private String[] entrypoint;
- @JsonProperty("Image") private String image;
- @JsonProperty("Volumes") private Volumes volumes = new Volumes();
- @JsonProperty("WorkingDir") private String workingDir = "";
- @JsonProperty("DisableNetwork") private boolean disableNetwork = false;
- @JsonProperty("ExposedPorts") private ExposedPorts exposedPorts = new ExposedPorts();
- @JsonProperty("HostConfig") private HostConfig hostConfig = new HostConfig();
-
+
+ @JsonProperty("Hostname")
+ private String hostName = "";
+ @JsonProperty("User")
+ private String user = "";
+ @JsonProperty("Memory")
+ private long memoryLimit = 0;
+ @JsonProperty("MemorySwap")
+ private long memorySwap = 0;
+ @JsonProperty("CpuShares")
+ private int cpuShares = 0;
+ @JsonProperty("Cpuset")
+ private String cpuset;
+ @JsonProperty("AttachStdin")
+ private boolean attachStdin = false;
+ @JsonProperty("AttachStdout")
+ private boolean attachStdout = false;
+ @JsonProperty("AttachStderr")
+ private boolean attachStderr = false;
+ @JsonProperty("PortSpecs")
+ private String[] portSpecs;
+ @JsonProperty("Tty")
+ private boolean tty = false;
+ @JsonProperty("OpenStdin")
+ private boolean stdinOpen = false;
+ @JsonProperty("StdinOnce")
+ private boolean stdInOnce = false;
+ @JsonProperty("Env")
+ private String[] env;
+ @JsonProperty("Cmd")
+ private String[] cmd;
+ @JsonProperty("Entrypoint")
+ private String[] entrypoint;
+ @JsonProperty("Image")
+ private String image;
+ @JsonProperty("Volumes")
+ private Volumes volumes = new Volumes();
+ @JsonProperty("WorkingDir")
+ private String workingDir = "";
+ @JsonProperty("DisableNetwork")
+ private boolean disableNetwork = false;
+ @JsonProperty("ExposedPorts")
+ private ExposedPorts exposedPorts = new ExposedPorts();
+ @JsonProperty("HostConfig")
+ private HostConfig hostConfig = new HostConfig();
+
public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
super(exec);
checkNotNull(image, "image was not specified");
withImage(image);
}
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws ConflictException
+ * Named container already exists
+ */
@Override
- public CreateContainerCmdImpl withName(String name) {
- checkNotNull(name, "name was not specified");
- this.name = name;
- return this;
- }
+ public CreateContainerResponse exec() throws NotFoundException,
+ ConflictException {
+ return super.exec();
+ }
- @Override
- public String getName() {
- return name;
- }
+ @Override
+ @JsonIgnore
+ public Bind[] getBinds() {
+ return hostConfig.getBinds();
+ }
- @Override
- public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
- this.exposedPorts = new ExposedPorts(exposedPorts);
- return this;
- }
+ @Override
+ public Capability[] getCapAdd() {
+ return hostConfig.getCapAdd();
+ }
+
+ @Override
+ public Capability[] getCapDrop() {
+ return hostConfig.getCapDrop();
+ }
+
+ @Override
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ @Override
+ public String getCpuset() {
+ return cpuset;
+ }
+
+ @Override
+ public int getCpuShares() {
+ return cpuShares;
+ }
- @Override
+ @Override
@JsonIgnore
- public ExposedPort[] getExposedPorts() {
- return exposedPorts.getExposedPorts();
- }
+ public Device[] getDevices() {
+ return hostConfig.getDevices();
+ }
+ @Override
+ @JsonIgnore
+ public String[] getDns() {
+ return hostConfig.getDns();
+ }
- @Override
- public boolean isDisableNetwork() {
- return disableNetwork;
- }
+ @Override
+ @JsonIgnore
+ public String[] getDnsSearch() {
+ return hostConfig.getDnsSearch();
+ }
- @Override
- public String getWorkingDir() {
- return workingDir;
- }
+ @Override
+ public String[] getEntrypoint() {
+ return entrypoint;
+ }
- @Override
- public CreateContainerCmdImpl withWorkingDir(String workingDir) {
- this.workingDir = workingDir;
- return this;
- }
+ @Override
+ public String[] getEnv() {
+ return env;
+ }
+
+ @Override
+ @JsonIgnore
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts.getExposedPorts();
+ }
+ @Override
+ @JsonIgnore
+ public String[] getExtraHosts() {
+ return hostConfig.getExtraHosts();
+ }
+
+ @Override
+ public HostConfig getHostConfig() {
+ return hostConfig;
+ }
- @Override
+ @Override
public String getHostName() {
- return hostName;
- }
+ return hostName;
+ }
- @Override
- public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) {
- this.disableNetwork = disableNetwork;
- return this;
- }
+ @Override
+ public String getImage() {
+ return image;
+ }
- @Override
- public CreateContainerCmdImpl withHostName(String hostName) {
- this.hostName = hostName;
- return this;
- }
+ @Override
+ @JsonIgnore
+ public Link[] getLinks() {
+ return hostConfig.getLinks();
+ }
+
+ @Override
+ @JsonIgnore
+ public LxcConf[] getLxcConf() {
+ return hostConfig.getLxcConf();
+ }
+
+ @Override
+ public long getMemoryLimit() {
+ return memoryLimit;
+ }
+
+ @Override
+ public long getMemorySwap() {
+ return memorySwap;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
- @Override
+ @Override
+ @JsonIgnore
+ public String getNetworkMode() {
+ return hostConfig.getNetworkMode();
+ }
+
+ @Override
+ @JsonIgnore
+ public Ports getPortBindings() {
+ return hostConfig.getPortBindings();
+ }
+
+ @Override
public String[] getPortSpecs() {
- return portSpecs;
- }
+ return portSpecs;
+ }
- @Override
- public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
- this.portSpecs = portSpecs;
- return this;
- }
+ @Override
+ @JsonIgnore
+ public RestartPolicy getRestartPolicy() {
+ return hostConfig.getRestartPolicy();
+ }
- @Override
+ @Override
public String getUser() {
- return user;
- }
+ return user;
+ }
- @Override
- public CreateContainerCmdImpl withUser(String user) {
- this.user = user;
- return this;
- }
+ @Override
+ @JsonIgnore
+ public Volume[] getVolumes() {
+ return volumes.getVolumes();
+ }
- @Override
- public boolean isTty() {
- return tty;
- }
+ @Override
+ @JsonIgnore
+ public VolumesFrom[] getVolumesFrom() {
+ return hostConfig.getVolumesFrom();
+ }
- @Override
- public CreateContainerCmdImpl withTty(boolean tty) {
- this.tty = tty;
- return this;
- }
+ @Override
+ public String getWorkingDir() {
+ return workingDir;
+ }
- @Override
- public boolean isStdinOpen() {
- return stdinOpen;
- }
+ @Override
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
- @Override
- public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
- this.stdinOpen = stdinOpen;
- return this;
- }
+ @Override
+ public boolean isAttachStdin() {
+ return attachStdin;
+ }
- @Override
+ @Override
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ @Override
+ public boolean isDisableNetwork() {
+ return disableNetwork;
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPrivileged() {
+ return hostConfig.isPrivileged();
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPublishAllPorts() {
+ return hostConfig.isPublishAllPorts();
+ }
+
+ @Override
public boolean isStdInOnce() {
- return stdInOnce;
- }
+ return stdInOnce;
+ }
- @Override
- public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
- this.stdInOnce = stdInOnce;
- return this;
- }
+ @Override
+ public boolean isStdinOpen() {
+ return stdinOpen;
+ }
- @Override
- public long getMemoryLimit() {
- return memoryLimit;
- }
+ @Override
+ public boolean isTty() {
+ return tty;
+ }
- @Override
- public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
- this.memoryLimit = memoryLimit;
- return this;
- }
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("create container ")
+ .append(name != null ? "name=" + name + " " : "").append(this)
+ .toString();
+ }
- @Override
- public long getMemorySwap() {
- return memorySwap;
- }
+ @Override
+ public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
+ this.attachStderr = attachStderr;
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
- this.memorySwap = memorySwap;
- return this;
- }
+ @Override
+ public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
+ this.attachStdin = attachStdin;
+ return this;
+ }
- @Override
- public int getCpuShares() {
- return cpuShares;
- }
+ @Override
+ public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
+ this.attachStdout = attachStdout;
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withCpuShares(int cpuShares) {
- this.cpuShares = cpuShares;
- return this;
- }
+ @Override
+ public CreateContainerCmd withBinds(Bind... binds) {
+ hostConfig.setBinds(binds);
+ return this;
+ }
- @Override
- public String getCpuset() {
- return cpuset;
- }
+ @Override
+ public CreateContainerCmd withCapAdd(Capability... capAdd) {
+ hostConfig.setCapAdd(capAdd);
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withCpuset(String cpuset) {
- this.cpuset = cpuset;
- return this;
- }
+ @Override
+ public CreateContainerCmd withCapDrop(Capability... capDrop) {
+ hostConfig.setCapDrop(capDrop);
+ return this;
+ }
- @Override
- public boolean isAttachStdin() {
- return attachStdin;
- }
+ @Override
+ public CreateContainerCmdImpl withCmd(String... cmd) {
+ this.cmd = cmd;
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
- this.attachStdin = attachStdin;
- return this;
- }
+ @Override
+ public CreateContainerCmdImpl withCpuset(String cpuset) {
+ this.cpuset = cpuset;
+ return this;
+ }
- @Override
- public boolean isAttachStdout() {
- return attachStdout;
- }
+ @Override
+ public CreateContainerCmdImpl withCpuShares(int cpuShares) {
+ this.cpuShares = cpuShares;
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
- this.attachStdout = attachStdout;
- return this;
- }
+ @Override
+ public CreateContainerCmd withDevices(Device... devices) {
+ this.hostConfig.setDevices(devices);
+ return this;
+ }
- @Override
- public boolean isAttachStderr() {
- return attachStderr;
- }
+ @Override
+ public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) {
+ this.disableNetwork = disableNetwork;
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
- this.attachStderr = attachStderr;
- return this;
- }
+ @Override
+ public CreateContainerCmdImpl withDns(String... dns) {
+ this.hostConfig.setDns(dns);
+ return this;
+ }
- @Override
- public String[] getEnv() {
- return env;
- }
+ @Override
+ public CreateContainerCmd withDnsSearch(String... dnsSearch) {
+ this.hostConfig.setDnsSearch(dnsSearch);
+ return this;
+ }
- @Override
+ @Override
+ public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
+ this.entrypoint = entrypoint;
+ return this;
+ }
+
+ @Override
public CreateContainerCmdImpl withEnv(String... env) {
- this.env = env;
- return this;
- }
+ this.env = env;
+ return this;
+ }
- @Override
- public String[] getCmd() {
- return cmd;
- }
+ @Override
+ public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
+ this.exposedPorts = new ExposedPorts(exposedPorts);
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withCmd(String... cmd) {
- this.cmd = cmd;
- return this;
- }
-
- @Override
- public String[] getEntrypoint() {
- return entrypoint;
- }
-
- @Override
- public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
- this.entrypoint = entrypoint;
- return this;
- }
-
- @Override
- public String[] getDns() {
- return hostConfig.getDns();
- }
-
- @Override
- public CreateContainerCmdImpl withDns(String... dns) {
- hostConfig.setDns(dns);
- return this;
- }
-
- @Override
- public String getImage() {
- return image;
- }
+ @Override
+ public CreateContainerCmd withExtraHosts(String... extraHosts) {
+ this.hostConfig.setExtraHosts(extraHosts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
+ checkNotNull(hostConfig, "no host config was specified");
+ this.hostConfig = hostConfig;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withHostName(String hostName) {
+ this.hostName = hostName;
+ return this;
+ }
- @Override
+ @Override
public CreateContainerCmdImpl withImage(String image) {
- this.image = image;
- return this;
- }
+ this.image = image;
+ return this;
+ }
- @Override
- @JsonIgnore
- public Volume[] getVolumes() {
- return volumes.getVolumes();
- }
+ @Override
+ public CreateContainerCmdImpl withLinks(Link... links) {
+ checkNotNull(links, "links was not specified");
+ this.hostConfig.setLinks(links);
+ return this;
+ }
- @Override
- public CreateContainerCmdImpl withVolumes(Volume... volumes) {
- this.volumes = new Volumes(volumes);
- return this;
- }
+ @Override
+ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
+ checkNotNull(lxcConf, "lxcConf was not specified");
+ this.hostConfig.setLxcConf(lxcConf);
+ return this;
+ }
- @Override
- public VolumesFrom[] getVolumesFrom() {
- return hostConfig.getVolumesFrom();
- }
+ @Override
+ public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
+ this.memoryLimit = memoryLimit;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
+ this.memorySwap = memorySwap;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withName(String name) {
+ checkNotNull(name, "name was not specified");
+ this.name = name;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withNetworkMode(String networkMode) {
+ checkNotNull(networkMode, "networkMode was not specified");
+ this.hostConfig.setNetworkMode(networkMode);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(PortBinding... portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(new Ports(portBindings));
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(Ports portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(portBindings);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
+ this.portSpecs = portSpecs;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPrivileged(boolean privileged) {
+ this.hostConfig.setPrivileged(privileged);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
+ this.hostConfig.setPublishAllPorts(publishAllPorts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
+ this.hostConfig.setRestartPolicy(restartPolicy);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
+ this.stdInOnce = stdInOnce;
+ return this;
+ }
- @Override
+ @Override
+ public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
+ this.stdinOpen = stdinOpen;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withTty(boolean tty) {
+ this.tty = tty;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withVolumes(Volume... volumes) {
+ this.volumes = new Volumes(volumes);
+ return this;
+ }
+
+ @Override
public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) {
- this.hostConfig.setVolumesFrom(volumesFrom);
- return this;
- }
-
- @Override
- public HostConfig getHostConfig() {
- return hostConfig;
- }
-
- @Override
- public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
- checkNotNull(hostConfig, "no host config was specified");
- this.hostConfig = hostConfig;
- return this;
- }
-
- @Override
- public Capability[] getCapAdd() {
- return hostConfig.getCapAdd();
- }
-
- @Override
- public CreateContainerCmd withCapAdd(Capability... capAdd) {
- hostConfig.setCapAdd(capAdd);
- return this;
- }
-
- @Override
- public Capability[] getCapDrop() {
- return hostConfig.getCapDrop();
- }
-
- @Override
- public CreateContainerCmd withCapDrop(Capability... capDrop) {
- hostConfig.setCapDrop(capDrop);
- return this;
- }
-
- @Override
- public String toString() {
- return new ToStringBuilder(this).append("create container ")
- .append(name != null ? "name=" + name + " " : "")
- .append(this)
- .toString();
- }
-
- /**
- * @throws NotFoundException No such container
- * @throws ConflictException Named container already exists
- */
- @Override
- public CreateContainerResponse exec() throws NotFoundException, ConflictException {
- return super.exec();
- }
-
-}
+ this.hostConfig.setVolumesFrom(volumesFrom);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withWorkingDir(String workingDir) {
+ this.workingDir = workingDir;
+ return this;
+ }
+
+}
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 ba05b2687..f652c5700 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.core.command;
-import static com.github.dockerjava.api.model.Capability.*;
+import static com.github.dockerjava.api.model.Capability.MKNOD;
+import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -10,6 +11,8 @@
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.startsWith;
import java.lang.reflect.Method;
import java.security.SecureRandom;
@@ -28,9 +31,12 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.Device;
+import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Link;
-import com.github.dockerjava.api.model.Links;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.client.AbstractDockerClientTest;
@@ -99,7 +105,7 @@ public void createContainerWithVolume() throws DockerException {
assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(),
contains("/var/log"));
}
-
+
@Test
public void createContainerWithVolumesFrom() throws DockerException {
@@ -111,11 +117,12 @@ public void createContainerWithVolumesFrom() throws DockerException {
// create a running container with bind mounts
CreateContainerResponse container1 = dockerClient
.createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName(container1Name).exec();
+ .withName(container1Name)
+ .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2))
+ .exec();
LOG.info("Created container1 {}", container1.toString());
- dockerClient.startContainerCmd(container1.getId()).withBinds(
- new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec();
+ dockerClient.startContainerCmd(container1.getId()).exec();
LOG.info("Started container1 {}", container1.toString());
InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(
@@ -238,7 +245,7 @@ public void createContainerWithLink() throws DockerException {
assertThat(inspectContainerResponse1.getState().isRunning(), is(true));
HostConfig hostConfig = new HostConfig();
- hostConfig.setLinks(new Links(new Link("container1", "container1Link")));
+ hostConfig.setLinks(new Link("container1", "container1Link"));
CreateContainerResponse container2 = dockerClient
.createContainerCmd("busybox").withName("container2").withHostConfig(hostConfig)
.withCmd("env").exec();
@@ -247,7 +254,7 @@ public void createContainerWithLink() throws DockerException {
InspectContainerResponse inspectContainerResponse2 = dockerClient
.inspectContainerCmd(container2.getId()).exec();
- assertThat(inspectContainerResponse2.getHostConfig().getLinks().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")}));
+ assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")}));
}
@Test
@@ -333,5 +340,174 @@ 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 {
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))
+ .exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient
+ .inspectContainerCmd(container.getId()).exec();
+
+ 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));
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox").withCmd("true")
+ .withExposedPorts(tcp22, tcp23)
+ .withPortBindings(portBindings)
+ .exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient
+ .inspectContainerCmd(container.getId()).exec();
+
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig()
+ .getExposedPorts()), contains(tcp22, tcp23));
+
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
+ .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022))));
+
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
+ .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023))));
+
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
+ .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024))));
+
+ }
+
+ @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()));
+
+
+ }
+
+ @Test
+ public void createContainerWithRestartPolicy() throws DockerException {
+
+ RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5);
+
+ 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")));
+ }
+
}
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index 37d805aa2..f7cbe20c3 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -253,7 +253,7 @@ public void startContainerWithConflictingPortBindings()
}
@Test
- public void startContainerWithLinking() throws DockerException {
+ public void startContainerWithLinkingDeprecated() throws DockerException {
CreateContainerResponse container1 = dockerClient
.createContainerCmd("busybox").withCmd("sleep", "9999")
@@ -302,8 +302,71 @@ public void startContainerWithLinking() throws DockerException {
is(notNullValue()));
assertThat(inspectContainerResponse2.getHostConfig().getLinks(),
is(notNullValue()));
- assertThat(inspectContainerResponse2.getHostConfig().getLinks()
- .getLinks(), equalTo(new Link[] { new Link("container1",
+ 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()));
+ assertThat(inspectContainerResponse2.getState(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
+
+ }
+
+
+ @Test
+ public void startContainerWithLinking() 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()));
+
+ dockerClient.startContainerCmd(container2.getId())
+ .exec();
+
+ 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()));
From d26024ca1a3a907b56b01425ba4cae9e13086ff7 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 7 Apr 2015 21:25:13 +0200
Subject: [PATCH 0009/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c1b319a7d..9be899ace 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@ Change Log
===
Latest SNAPSHOT
---
-
+* [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command
* [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object
v1.1.0
From 2549f57afad7282691c3abad9df4baf449ba18c6 Mon Sep 17 00:00:00 2001
From: Emir Dizdarevic
Date: Tue, 7 Apr 2015 22:50:50 +0200
Subject: [PATCH 0010/1272] * Fixed remove intermediate containers bug on
build goal - it was always set to true
---
.../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
index f67b1f9d8..b5ea85ed2 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
@@ -46,8 +46,8 @@ protected ResponseImpl execute(BuildImageCmd command) {
if (command.hasNoCacheEnabled()) {
webResource = webResource.queryParam("nocache", "true");
}
- if (command.hasRemoveEnabled()) {
- webResource = webResource.queryParam("rm", "true");
+ if (!command.hasRemoveEnabled()) {
+ webResource = webResource.queryParam("rm", "false");
}
if (command.isQuiet()) {
webResource = webResource.queryParam("q", "true");
From 0f847c929535dfe73349e31c75a8604f39bc3eeb Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Wed, 8 Apr 2015 19:58:37 +0200
Subject: [PATCH 0011/1272] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9be899ace..b38c17d14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@ Change Log
===
Latest SNAPSHOT
---
+* [#194](https://github.com/docker-java/docker-java/pull/194) Fixed remove intermediate containers bug on build goal
* [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command
* [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object
From 6ab93b4337e9e489d92abc9cd25f782d0b17c870 Mon Sep 17 00:00:00 2001
From: Chun Chen
Date: Mon, 13 Apr 2015 12:58:55 +0800
Subject: [PATCH 0012/1272] Allow for null bindings
---
.../github/dockerjava/api/model/Ports.java | 40 ++++++++++++-------
.../api/model/Ports_SerializingTest.java | 17 ++++++++
.../api/model/Ports_addBindingsTest.java | 9 +++++
3 files changed, 52 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java
index d7c8a3245..0c2df94ad 100644
--- a/src/main/java/com/github/dockerjava/api/model/Ports.java
+++ b/src/main/java/com/github/dockerjava/api/model/Ports.java
@@ -75,7 +75,11 @@ public void bind(ExposedPort exposedPort, Binding binding) {
Binding[] bindings = ports.get(exposedPort);
ports.put(exposedPort, (Binding[]) ArrayUtils.add(bindings, binding));
} else {
- ports.put(exposedPort, new Binding[]{binding});
+ if (binding == null) {
+ ports.put(exposedPort, null);
+ } else {
+ ports.put(exposedPort, new Binding[]{binding});
+ }
}
}
@@ -282,12 +286,16 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali
Map.Entry portNode = it.next();
JsonNode bindingsArray = portNode.getValue();
- for (int i = 0; i < bindingsArray.size(); i++) {
- JsonNode bindingNode = bindingsArray.get(i);
- if (!bindingNode.equals(NullNode.getInstance())) {
- String hostIp = bindingNode.get("HostIp").textValue();
- int hostPort = bindingNode.get("HostPort").asInt();
- out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort));
+ if (bindingsArray.equals(NullNode.getInstance())) {
+ out.bind(ExposedPort.parse(portNode.getKey()), null);
+ } else {
+ for (int i = 0; i < bindingsArray.size(); i++) {
+ JsonNode bindingNode = bindingsArray.get(i);
+ if (!bindingNode.equals(NullNode.getInstance())) {
+ String hostIp = bindingNode.get("HostIp").textValue();
+ int hostPort = bindingNode.get("HostPort").asInt();
+ out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort));
+ }
}
}
}
@@ -304,14 +312,18 @@ public void serialize(Ports portBindings, JsonGenerator jsonGen,
jsonGen.writeStartObject();
for(Entry entry : portBindings.getBindings().entrySet()){
jsonGen.writeFieldName(entry.getKey().toString());
- jsonGen.writeStartArray();
- for (Binding binding : entry.getValue()) {
- jsonGen.writeStartObject();
- jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp());
- jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString());
- jsonGen.writeEndObject();
+ if (entry.getValue() != null) {
+ jsonGen.writeStartArray();
+ for (Binding binding : entry.getValue()) {
+ jsonGen.writeStartObject();
+ jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp());
+ jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString());
+ jsonGen.writeEndObject();
+ }
+ jsonGen.writeEndArray();
+ } else {
+ jsonGen.writeNull();
}
- jsonGen.writeEndArray();
}
jsonGen.writeEndObject();
}
diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java
index 259310698..9190eefd2 100644
--- a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java
@@ -13,6 +13,7 @@ public class Ports_SerializingTest {
private final ObjectMapper objectMapper = new ObjectMapper();
private final String jsonWithDoubleBindingForOnePort =
"{\"80/tcp\":[{\"HostIp\":\"10.0.0.1\",\"HostPort\":\"80\"},{\"HostIp\":\"10.0.0.2\",\"HostPort\":\"80\"}]}";
+ private final String jsonWithNullBindingForOnePort = "{\"80/tcp\":null}";
@Test
public void deserializingPortWithMultipleBindings() throws Exception {
@@ -39,4 +40,20 @@ public void serializingEmptyBinding() throws Exception {
Ports ports = new Ports(ExposedPort.tcp(80), new Binding(null, null));
assertEquals(objectMapper.writeValueAsString(ports), "{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}");
}
+
+ @Test
+ public void deserializingPortWithNullBindings() throws Exception {
+ Ports ports = objectMapper.readValue(jsonWithNullBindingForOnePort, Ports.class);
+ Map map = ports.getBindings();
+ assertEquals(map.size(), 1);
+
+ assertEquals(map.get(ExposedPort.tcp(80)), null);
+ }
+
+ @Test
+ public void serializingWithNullBindings() throws Exception {
+ Ports ports = new Ports();
+ ports.bind(ExposedPort.tcp(80), null);
+ assertEquals(objectMapper.writeValueAsString(ports), jsonWithNullBindingForOnePort);
+ }
}
diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java
index 20e47df9a..18c7f0f09 100644
--- a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
import java.util.Map;
@@ -54,4 +55,12 @@ public void addTwoBindingsForSameExposedPort() {
assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080, BINDING_9090 });
}
+ @Test
+ public void addNullBindings() {
+ ports.add(new PortBinding(null, TCP_80));
+ Map bindings = ports.getBindings();
+ // one key with two values
+ assertEquals(bindings.size(), 1);
+ assertEquals(bindings.get(TCP_80), null);
+ }
}
From 80093ca8e74503d5e34c393d138da9c97c47f540 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 14 Apr 2015 21:42:33 +0200
Subject: [PATCH 0013/1272] Set to version 1.2.0-SNAPSHOT
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 957c157c6..1dae4be51 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.1.1-SNAPSHOT
+ 1.2.0-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
From 8e2f6b3842209580a8f38592c80bde32f599821e Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 14 Apr 2015 21:44:14 +0200
Subject: [PATCH 0014/1272] [maven-release-plugin] prepare release
docker-java-1.2.0
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 1dae4be51..95938ea66 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.2.0-SNAPSHOT
+ 1.2.0
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ docker-java-1.2.0
From 33b0ff5a5fec004c3392326383de8e03ed6e69cf Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 14 Apr 2015 21:44:20 +0200
Subject: [PATCH 0015/1272] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 95938ea66..1279f9c11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.2.0
+ 1.2.1-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- docker-java-1.2.0
+ HEAD
From 065cd78ca16173657830ea8b72d6c13d6defdb5b Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 14 Apr 2015 21:52:18 +0200
Subject: [PATCH 0016/1272] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b38c17d14..b7a386469 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
Latest SNAPSHOT
---
+
+v1.2.0
+---
* [#194](https://github.com/docker-java/docker-java/pull/194) Fixed remove intermediate containers bug on build goal
* [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command
* [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object
From bcdfd46c5728b0a51686727725236eb2d1c31720 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 12:51:21 +0100
Subject: [PATCH 0017/1272] Created FrameReader to assist reading frames from
attach commands.
---
.../github/dockerjava/api/model/Frame.java | 47 ++++++++++++++
.../dockerjava/api/model/StreamType.java | 7 +++
.../dockerjava/core/command/FrameReader.java | 62 +++++++++++++++++++
.../core/command/FrameReaderTest.java | 57 +++++++++++++++++
4 files changed, 173 insertions(+)
create mode 100644 src/main/java/com/github/dockerjava/api/model/Frame.java
create mode 100644 src/main/java/com/github/dockerjava/api/model/StreamType.java
create mode 100644 src/main/java/com/github/dockerjava/core/command/FrameReader.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java
new file mode 100644
index 000000000..bf77a1334
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Frame.java
@@ -0,0 +1,47 @@
+package com.github.dockerjava.api.model;
+
+import java.util.Arrays;
+
+/**
+ * Represents a logging frame.
+ */
+public class Frame {
+ private final StreamType streamType;
+ private final byte[] payload;
+
+ public Frame(StreamType streamType, byte[] payload) {
+ this.streamType = streamType;
+ this.payload = payload;
+ }
+
+ public StreamType getStreamType() {
+ return streamType;
+ }
+
+ public byte[] getPayload() {
+ return payload;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s %s", streamType, new String(payload));
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Frame frame = (Frame) o;
+
+ return Arrays.equals(payload, frame.payload) && streamType == frame.streamType;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = streamType.hashCode();
+ result = 31 * result + Arrays.hashCode(payload);
+ return result;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/StreamType.java b/src/main/java/com/github/dockerjava/api/model/StreamType.java
new file mode 100644
index 000000000..eb11c5536
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java
@@ -0,0 +1,7 @@
+package com.github.dockerjava.api.model;
+
+public enum StreamType {
+ STDIN,
+ STDOUT,
+ STDERR
+}
diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
new file mode 100644
index 000000000..22a76de12
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -0,0 +1,62 @@
+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;
+
+/**
+ * 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}
+ */
+public class FrameReader {
+
+ private static final int HEADER_SIZE = 8;
+ private final InputStream inputStream;
+
+ 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");
+ }
+ }
+
+ /**
+ * @return A frame, or null if no more frames.
+ */
+ public Frame readFrame() throws IOException {
+ byte[] header = new byte[HEADER_SIZE];
+ int headerSize = inputStream.read(header);
+
+ if (headerSize == -1) {
+ return null;
+ }
+
+ if (headerSize != HEADER_SIZE) {
+ throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize));
+ }
+
+ int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << HEADER_SIZE) + header[7];
+ int payloadSize = frameSize - header.length;
+
+ 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));
+ }
+
+ return new Frame(streamType(header[0]), payload);
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
new file mode 100644
index 000000000..dc2d4c8fc
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
@@ -0,0 +1,57 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.StreamType;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+public class FrameReaderTest {
+ public static final int HEADER_SIZE = 8;
+ private final List bytes = new ArrayList<>();
+ private final InputStream inputStream = new InputStream() {
+ @Override
+ public int read() throws IOException {
+ return bytes.isEmpty() ? -1 : bytes.remove(0);
+ }
+ };
+ private final FrameReader frameReader = new FrameReader(inputStream);
+
+ @Test
+ public void endOfStreamReturnsNull() throws Exception {
+ assertNull(nextFrame());
+ }
+
+ @Test
+ public void stdInBytesFrameReturnsFrame() throws Exception {
+ assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDIN, new byte[0]));
+ }
+
+ private Frame nextFrame(int... bytes) throws IOException {
+ setBytes(bytes);
+ return frameReader.readFrame();
+ }
+
+ @Test
+ public void stdOutBytesFrameReturnsFrame() throws Exception {
+ assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDOUT, new byte[0]));
+ }
+
+ @Test
+ public void stdErrBytesFrameReturnsFrame() throws Exception {
+ assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDERR, new byte[0]));
+ }
+
+ private void setBytes(int... bytes) {
+ this.bytes.clear();
+ for (int aByte : bytes) {
+ this.bytes.add(aByte);
+ }
+ }
+}
\ No newline at end of file
From 2b4d5ff0026b3e4739f94a9ca57c4a620c21c709 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 13:11:56 +0100
Subject: [PATCH 0018/1272] Created FrameReader to assist reading frames from
attach commands.
---
.../github/dockerjava/api/command/LogContainerCmd.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
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 74512b390..05e108550 100644
--- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
@@ -1,9 +1,9 @@
package com.github.dockerjava.api.command;
-import java.io.InputStream;
-
import com.github.dockerjava.api.NotFoundException;
+import java.io.InputStream;
+
/**
* Get container logs
*
@@ -18,6 +18,10 @@
* Defaults to false.
* @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{
From 83943eb420b51c26802e05f386f7937249be908d Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 13:25:41 +0100
Subject: [PATCH 0019/1272] Make FrameReader Closable.
---
.../com/github/dockerjava/core/command/FrameReader.java | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
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 22a76de12..3dae2dd51 100644
--- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -11,7 +11,7 @@
*
* See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container}
*/
-public class FrameReader {
+public class FrameReader implements AutoCloseable {
private static final int HEADER_SIZE = 8;
private final InputStream inputStream;
@@ -48,7 +48,7 @@ public Frame readFrame() throws IOException {
throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize));
}
- int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << HEADER_SIZE) + header[7];
+ int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << 8) + header[7];
int payloadSize = frameSize - header.length;
byte[] payload = new byte[payloadSize];
@@ -59,4 +59,9 @@ public Frame readFrame() throws IOException {
return new Frame(streamType(header[0]), payload);
}
+
+ @Override
+ public void close() throws Exception {
+ inputStream.close();
+ }
}
From 538d465d4bdf65997907a73c4825f83eded7d005 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 13:37:18 +0100
Subject: [PATCH 0020/1272] Made exception more specifi
---
.../java/com/github/dockerjava/core/command/FrameReader.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 3dae2dd51..ac356da30 100644
--- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -61,7 +61,7 @@ public Frame readFrame() throws IOException {
}
@Override
- public void close() throws Exception {
+ public void close() throws IOException {
inputStream.close();
}
}
From 42514449ba9f343282125368fe3466109bed9601 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 23:56:59 +0100
Subject: [PATCH 0021/1272] Trim toString.
---
src/main/java/com/github/dockerjava/api/model/Frame.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java
index bf77a1334..3860a5dba 100644
--- a/src/main/java/com/github/dockerjava/api/model/Frame.java
+++ b/src/main/java/com/github/dockerjava/api/model/Frame.java
@@ -24,7 +24,7 @@ public byte[] getPayload() {
@Override
public String toString() {
- return String.format("%s %s", streamType, new String(payload));
+ return String.format("%s: %s", streamType, new String(payload).trim());
}
@Override
From 559e6c18d1051e2a4329f1e2b1d43bb965ced43f Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sat, 25 Apr 2015 23:57:53 +0100
Subject: [PATCH 0022/1272] Fixed bug in header.
---
.../java/com/github/dockerjava/core/command/FrameReader.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
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 ac356da30..c39791460 100644
--- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -48,8 +48,7 @@ public Frame readFrame() throws IOException {
throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize));
}
- int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << 8) + header[7];
- int payloadSize = frameSize - header.length;
+ int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff);
byte[] payload = new byte[payloadSize];
int actualPayloadSize = inputStream.read(payload);
From 1e1e7e87b249ee524e9d22cb28d67739089ba1ca Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 26 Apr 2015 00:02:14 +0100
Subject: [PATCH 0023/1272] Updated FrameReaderTest.
---
.../com/github/dockerjava/core/command/FrameReaderTest.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
index dc2d4c8fc..2b5e2b644 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java
@@ -30,7 +30,7 @@ public void endOfStreamReturnsNull() throws Exception {
@Test
public void stdInBytesFrameReturnsFrame() throws Exception {
- assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDIN, new byte[0]));
+ assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDIN, new byte[0]));
}
private Frame nextFrame(int... bytes) throws IOException {
@@ -40,12 +40,12 @@ private Frame nextFrame(int... bytes) throws IOException {
@Test
public void stdOutBytesFrameReturnsFrame() throws Exception {
- assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDOUT, new byte[0]));
+ assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDOUT, new byte[0]));
}
@Test
public void stdErrBytesFrameReturnsFrame() throws Exception {
- assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDERR, new byte[0]));
+ assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDERR, new byte[0]));
}
private void setBytes(int... bytes) {
From 15b388ea15255d9d69baea83093fd8f83acf59d6 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Mon, 27 Apr 2015 21:29:56 +0200
Subject: [PATCH 0024/1272] Added 'MacAddress' option to create command
---
.../api/command/CreateContainerCmd.java | 9 +++++--
.../core/command/CreateContainerCmdImpl.java | 24 ++++++++++++++-----
2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index a2a6dc85f..708e3139a 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -14,6 +14,7 @@
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
+import com.github.dockerjava.core.command.CreateContainerCmdImpl;
public interface CreateContainerCmd extends DockerCmd{
@@ -63,6 +64,8 @@ public CreateContainerResponse exec() throws NotFoundException,
public Link[] getLinks();
public LxcConf[] getLxcConf();
+
+ public String getMacAddress();
public long getMemoryLimit();
@@ -92,7 +95,7 @@ public CreateContainerResponse exec() throws NotFoundException,
public boolean isAttachStdout();
- public boolean isDisableNetwork();
+ public boolean isNetworkDisabled();
public Boolean isPrivileged();
@@ -139,7 +142,7 @@ public CreateContainerResponse exec() throws NotFoundException,
*/
public CreateContainerCmd withDevices(Device... devices);
- public CreateContainerCmd withDisableNetwork(boolean disableNetwork);
+ public CreateContainerCmd withNetworkDisabled(boolean disableNetwork);
/**
* Set custom DNS servers
@@ -237,4 +240,6 @@ public CreateContainerResponse exec() throws NotFoundException,
public CreateContainerCmd withWorkingDir(String workingDir);
+ public CreateContainerCmd withMacAddress(String macAddress);
+
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 5afd0dbb8..18b089d4d 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -74,8 +74,10 @@ public class CreateContainerCmdImpl extends
private Volumes volumes = new Volumes();
@JsonProperty("WorkingDir")
private String workingDir = "";
- @JsonProperty("DisableNetwork")
- private boolean disableNetwork = false;
+ @JsonProperty("MacAddress")
+ private String macAddress;
+ @JsonProperty("NetworkDisabled")
+ private boolean networkDisabled = false;
@JsonProperty("ExposedPorts")
private ExposedPorts exposedPorts = new ExposedPorts();
@JsonProperty("HostConfig")
@@ -196,6 +198,10 @@ public Link[] getLinks() {
public LxcConf[] getLxcConf() {
return hostConfig.getLxcConf();
}
+
+ public String getMacAddress() {
+ return macAddress;
+ }
@Override
public long getMemoryLimit() {
@@ -273,8 +279,8 @@ public boolean isAttachStdout() {
}
@Override
- public boolean isDisableNetwork() {
- return disableNetwork;
+ public boolean isNetworkDisabled() {
+ return networkDisabled;
}
@Override
@@ -372,8 +378,8 @@ public CreateContainerCmd withDevices(Device... devices) {
}
@Override
- public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) {
- this.disableNetwork = disableNetwork;
+ public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) {
+ this.networkDisabled = disableNetwork;
return this;
}
@@ -445,6 +451,12 @@ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
this.hostConfig.setLxcConf(lxcConf);
return this;
}
+
+ @Override
+ public CreateContainerCmdImpl withMacAddress(String macAddress) {
+ this.macAddress = macAddress;
+ return this;
+ }
@Override
public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
From e3e6ce87ff59616347008398a6daa8b8beeae063 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Mon, 27 Apr 2015 21:42:02 +0200
Subject: [PATCH 0025/1272] Added 'MacAddress' to inspect container response.
---
.../dockerjava/api/model/ContainerConfig.java | 7 +++++++
.../command/CreateContainerCmdImplTest.java | 20 +++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
index b15d5ca86..dcb1256b0 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
@@ -51,6 +51,9 @@ public class ContainerConfig {
@JsonProperty("Image")
private String image;
+ @JsonProperty("MacAddress")
+ private String macAddress;
+
@JsonProperty("Memory")
private long memoryLimit = 0;
@@ -124,6 +127,10 @@ public boolean isStdinOpen() {
public boolean isStdInOnce() {
return stdInOnce;
}
+
+ public String getMacAddress() {
+ return macAddress;
+ }
public long getMemoryLimit() {
return memoryLimit;
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 f652c5700..53337129d 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -510,4 +510,24 @@ public void createContainerWithNetworkMode() throws DockerException {
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");
+ }
+
}
From 8534b78f68653196f441c9c756df5bb3c47e8b4e Mon Sep 17 00:00:00 2001
From: Emir Dizdarevic
Date: Tue, 28 Apr 2015 13:55:02 +0200
Subject: [PATCH 0026/1272] * Added support to use Auth for mutiple repos
during build
---
.../dockerjava/core/AuthConfigFile.java | 10 +++++++
.../dockerjava/core/DockerClientConfig.java | 19 +++++++++++++
.../dockerjava/core/DockerClientImpl.java | 28 +++++++++++++------
3 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
index 24c7aa5cf..862259a8e 100644
--- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
+++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
@@ -7,6 +7,7 @@
import java.util.List;
import java.util.Map;
+import com.github.dockerjava.api.model.AuthConfigurations;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
@@ -50,6 +51,15 @@ public AuthConfig resolveAuthConfig(String hostname) {
return null;
}
+ public AuthConfigurations getAuthConfigurations() {
+ final AuthConfigurations authConfigurations = new AuthConfigurations();
+ for(Map.Entry authConfigEntry : authConfigMap.entrySet()) {
+ authConfigurations.addConfig(authConfigEntry.getValue());
+ }
+
+ return authConfigurations;
+ }
+
@Override
public int hashCode() {
final int prime = 31;
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
index 05491ec6f..7e0b57b0e 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
@@ -14,6 +14,7 @@
import com.github.dockerjava.api.DockerClientException;
import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.core.NameParser.HostnameReposName;
import com.github.dockerjava.core.NameParser.ReposTag;
@@ -310,6 +311,24 @@ public AuthConfig effectiveAuthConfig(String imageName) {
return authConfig;
}
+ public AuthConfigurations getAuthConfigurations() {
+ String dockerCfgFile = getDockerCfgPath();
+ if (dockerCfgFile != null) {
+ AuthConfigFile authConfigFile;
+ try {
+ authConfigFile = AuthConfigFile.loadConfig(new File(
+ dockerCfgFile));
+ } catch (IOException e) {
+ throw new DockerClientException(
+ "Failed to parse dockerCfgFile", e);
+ }
+
+ return authConfigFile.getAuthConfigurations();
+ }
+
+ return new AuthConfigurations();
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
index 534c58ebf..7e96225f8 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -10,12 +10,13 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.*;
import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.api.model.Identifier;
import com.github.dockerjava.core.command.*;
/**
* @author Konstantin Pelykh (kpelykh@gmail.com)
- *
+ *
* @see "https://github.com/docker/docker/blob/master/api/client/commands.go"
*/
public class DockerClientImpl implements Closeable, DockerClient {
@@ -291,20 +292,29 @@ public CommitCmd commitCmd(String containerId) {
@Override
public BuildImageCmd buildImageCmd() {
- return new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec());
+ return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory()
+ .createBuildImageCmdExec()));
}
@Override
public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
- return new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec(), dockerFileOrFolder);
+ return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory()
+ .createBuildImageCmdExec(), dockerFileOrFolder));
}
- @Override
- public BuildImageCmd buildImageCmd(InputStream tarInputStream) {
- return new BuildImageCmdImpl(getDockerCmdExecFactory()
- .createBuildImageCmdExec(), tarInputStream);
+ @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
From 2bc290dd962e32c0c3c1222248311f134ec5a1b9 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 28 Apr 2015 17:36:45 +0200
Subject: [PATCH 0027/1272] Fix createContainerWithEnv test
---
.../dockerjava/core/command/CreateContainerCmdImplTest.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
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 53337129d..752f0aefc 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -172,8 +172,7 @@ public void createContainerWithEnv() throws DockerException {
assertThat(
Arrays.asList(inspectContainerResponse.getConfig().getEnv()),
- containsInAnyOrder("VARIABLE=success",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"));
+ containsInAnyOrder("VARIABLE=success"));
dockerClient.startContainerCmd(container.getId()).exec();
From 0d9e8a44a67bf59c4359af81528b2c7262aef4ac Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 28 Apr 2015 17:40:29 +0200
Subject: [PATCH 0028/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b7a386469..6ee13f6af 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,8 @@ Change Log
===
Latest SNAPSHOT
---
+* [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command
+* [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings
v1.2.0
---
From db7040fd0d549771afe550d3a61fafd2714fb8d3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 28 Apr 2015 21:43:11 +0200
Subject: [PATCH 0029/1272] Fix issue #202
---
.../java/com/github/dockerjava/core/DockerClientBuilder.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
index 155b36bed..4aa7d5ac7 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
@@ -36,6 +36,9 @@ public static DockerClientBuilder getInstance(String serverUrl) {
}
public static DockerCmdExecFactory getDefaultDockerCmdExecFactory() {
+ // clearing the cache is needed because otherwise we will get
+ // the same DockerCmdExecFactory instance each time
+ serviceLoader.reload();
if(!serviceLoader.iterator().hasNext()) {
throw new RuntimeException("Fatal: Can't find any implementation of '" + DockerCmdExecFactory.class.getName() + "' in the current classpath.");
}
From fdb9e77ef0c1aee95293f9f17a896a59747b380c Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sat, 2 May 2015 00:33:14 +0200
Subject: [PATCH 0030/1272] Fix issue #205
---
.../api/command/InspectContainerResponse.java | 6 +-
.../dockerjava/api/model/AccessMode.java | 8 ++
.../com/github/dockerjava/api/model/Bind.java | 6 +-
.../github/dockerjava/api/model/Volume.java | 62 +---------
.../github/dockerjava/api/model/VolumeRW.java | 115 ++++++++++++++++++
.../github/dockerjava/api/model/Volumes.java | 7 +-
.../dockerjava/api/model/VolumesRW.java | 57 +++++++++
.../dockerjava/api/model/VolumeTest.java | 4 +-
.../command/CreateContainerCmdImplTest.java | 38 +++++-
.../command/StartContainerCmdImplTest.java | 5 +-
10 files changed, 235 insertions(+), 73 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumeRW.java
create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumesRW.java
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 c86e13c54..f95656899 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
@@ -77,7 +77,7 @@ public class InspectContainerResponse {
private VolumeBinds volumes;
@JsonProperty("VolumesRW")
- private Volumes volumesRW;
+ private VolumesRW volumesRW;
public String getId() {
return id;
@@ -125,8 +125,8 @@ public VolumeBind[] getVolumes() {
}
@JsonIgnore
- public Volume[] getVolumesRW() {
- return volumesRW.getVolumes();
+ public VolumeRW[] getVolumesRW() {
+ return volumesRW.getVolumesRW();
}
public String getHostnamePath() {
diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java
index a1f53f57b..a893e7f38 100644
--- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java
+++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java
@@ -15,6 +15,14 @@ public enum AccessMode {
* The default {@link AccessMode}: {@link #rw}
*/
public static final AccessMode DEFAULT = rw;
+
+ public static final AccessMode fromBoolean(boolean accessMode) {
+ return accessMode ? rw : ro;
+ }
+
+ public final boolean toBoolean() {
+ return this.equals(AccessMode.rw) ? true: false;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/src/main/java/com/github/dockerjava/api/model/Bind.java
index eb0b8fd43..0071bff97 100644
--- a/src/main/java/com/github/dockerjava/api/model/Bind.java
+++ b/src/main/java/com/github/dockerjava/api/model/Bind.java
@@ -53,11 +53,11 @@ public static Bind parse(String serialized) {
String[] parts = serialized.split(":");
switch (parts.length) {
case 2: {
- return new Bind(parts[0], Volume.parse(parts[1]));
+ return new Bind(parts[0], new Volume(parts[1]));
}
case 3: {
AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase());
- return new Bind(parts[0], Volume.parse(parts[1]), accessMode);
+ return new Bind(parts[0], new Volume(parts[1]), accessMode);
}
default: {
throw new IllegalArgumentException();
@@ -96,7 +96,7 @@ public int hashCode() {
*/
@Override
public String toString() {
- return path + ":" + volume.toString() + ":" + accessMode.toString();
+ return path + ":" + volume.getPath() + ":" + accessMode.toString();
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/Volume.java b/src/main/java/com/github/dockerjava/api/model/Volume.java
index 3ec5e24c7..131a9a56f 100644
--- a/src/main/java/com/github/dockerjava/api/model/Volume.java
+++ b/src/main/java/com/github/dockerjava/api/model/Volume.java
@@ -24,42 +24,18 @@
*
* @see Bind
*/
-@JsonDeserialize(using = Volume.Deserializer.class)
-@JsonSerialize(using = Volume.Serializer.class)
public class Volume {
private String path;
- private AccessMode accessMode = AccessMode.rw;
-
public Volume(String path) {
this.path = path;
}
-
- public Volume(String path, AccessMode accessMode) {
- this.path = path;
- this.accessMode = accessMode;
- }
public String getPath() {
return path;
}
-
- public AccessMode getAccessMode() {
- return accessMode;
- }
- public static Volume parse(String serialized) {
- return new Volume(serialized);
- }
-
- /**
- * Returns a string representation of this {@link Volume} suitable
- * for inclusion in a JSON message.
- * The returned String is simply the container path, {@link #getPath()}.
- *
- * @return a string representation of this {@link Volume}
- */
@Override
public String toString() {
return getPath();
@@ -69,48 +45,14 @@ public String toString() {
public boolean equals(Object obj) {
if (obj instanceof Volume) {
Volume other = (Volume) obj;
- return new EqualsBuilder().append(path, other.getPath()).append(accessMode, other.getAccessMode())
- .isEquals();
+ return new EqualsBuilder().append(path, other.getPath()).isEquals();
} else
return super.equals(obj);
}
@Override
public int hashCode() {
- return new HashCodeBuilder().append(path).append(accessMode).toHashCode();
+ return new HashCodeBuilder().append(path).toHashCode();
}
-
- public static class Serializer extends JsonSerializer {
-
- @Override
- public void serialize(Volume volume, JsonGenerator jsonGen,
- SerializerProvider serProvider) throws IOException,
- JsonProcessingException {
-
- jsonGen.writeStartObject();
- jsonGen.writeFieldName(volume.getPath());
- jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
- jsonGen.writeEndObject();
- }
-
- }
-
- public static class Deserializer extends JsonDeserializer {
- @Override
- public Volume deserialize(JsonParser jsonParser,
- DeserializationContext deserializationContext)
- throws IOException, JsonProcessingException {
- ObjectCodec oc = jsonParser.getCodec();
- JsonNode node = oc.readTree(jsonParser);
- if (!node.equals(NullNode.getInstance())) {
- Entry field = node.fields().next();
- return Volume.parse(field.getKey());
- } else {
- return null;
- }
- }
- }
-
-
}
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java
new file mode 100644
index 000000000..717385d9e
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java
@@ -0,0 +1,115 @@
+package com.github.dockerjava.api.model;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.node.NullNode;
+
+/**
+ * Represents a bind mounted volume in a Docker container.
+ *
+ * @see Bind
+ */
+@JsonDeserialize(using = VolumeRW.Deserializer.class)
+@JsonSerialize(using = VolumeRW.Serializer.class)
+public class VolumeRW {
+
+ private Volume volume;
+
+ private AccessMode accessMode = AccessMode.rw;
+
+ public VolumeRW(Volume volume) {
+ this.volume = volume;
+ }
+
+ public VolumeRW(Volume volume, AccessMode accessMode) {
+ this.volume = volume;
+ this.accessMode = accessMode;
+ }
+
+ public Volume getVolume() {
+ return volume;
+ }
+
+ public AccessMode getAccessMode() {
+ return accessMode;
+ }
+
+
+ /**
+ * Returns a string representation of this {@link VolumeRW} suitable
+ * for inclusion in a JSON message.
+ * The returned String is simply the container path, {@link #getPath()}.
+ *
+ * @return a string representation of this {@link VolumeRW}
+ */
+ @Override
+ public String toString() {
+ return getVolume() + ":" + getAccessMode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof VolumeRW) {
+ VolumeRW other = (VolumeRW) obj;
+ return new EqualsBuilder().append(getVolume(), other.getVolume()).append(accessMode, other.getAccessMode())
+ .isEquals();
+ } else
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(getVolume()).append(getAccessMode()).toHashCode();
+ }
+
+ public static class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(VolumeRW volumeRW, JsonGenerator jsonGen,
+ SerializerProvider serProvider) throws IOException,
+ JsonProcessingException {
+
+ jsonGen.writeStartObject();
+ jsonGen.writeFieldName(volumeRW.getVolume().getPath());
+ jsonGen.writeString(Boolean.toString(volumeRW.getAccessMode().toBoolean()));
+ jsonGen.writeEndObject();
+ }
+
+ }
+
+ public static class Deserializer extends JsonDeserializer {
+ @Override
+ public VolumeRW deserialize(JsonParser jsonParser,
+ DeserializationContext deserializationContext)
+ throws IOException, JsonProcessingException {
+ ObjectCodec oc = jsonParser.getCodec();
+ JsonNode node = oc.readTree(jsonParser);
+ if (!node.equals(NullNode.getInstance())) {
+ Entry field = node.fields().next();
+ String volume = field.getKey();
+ AccessMode accessMode = AccessMode.fromBoolean(field.getValue().asBoolean());
+ return new VolumeRW(new Volume(volume), accessMode);
+ } else {
+ return null;
+ }
+ }
+ }
+
+
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Volumes.java b/src/main/java/com/github/dockerjava/api/model/Volumes.java
index 69753d6a8..b85536e10 100644
--- a/src/main/java/com/github/dockerjava/api/model/Volumes.java
+++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java
@@ -48,7 +48,9 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen,
jsonGen.writeStartObject();
for (Volume volume : volumes.getVolumes()) {
jsonGen.writeFieldName(volume.getPath());
- jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
+ jsonGen.writeStartObject();
+ jsonGen.writeEndObject();
+ //jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
}
jsonGen.writeEndObject();
}
@@ -66,7 +68,8 @@ public Volumes deserialize(JsonParser jsonParser, DeserializationContext deseria
Map.Entry field = it.next();
if (!field.getValue().equals(NullNode.getInstance())) {
- Volume volume = Volume.parse(field.getKey());
+ String path = field.getKey();
+ Volume volume = new Volume(path);
volumes.add(volume);
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
new file mode 100644
index 000000000..223f518cf
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
@@ -0,0 +1,57 @@
+package com.github.dockerjava.api.model;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.node.NullNode;
+
+// This is not going to be serialized
+@JsonDeserialize(using = VolumesRW.Deserializer.class)
+public class VolumesRW {
+ private final VolumeRW[] volumesRW;
+
+ public VolumesRW(VolumeRW... binds) {
+ this.volumesRW = binds;
+ }
+
+ public VolumeRW[] getVolumesRW() {
+ return volumesRW;
+ }
+
+ public static final class Deserializer extends JsonDeserializer {
+ @Override
+ public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+
+ List volumesRW = new ArrayList();
+ ObjectCodec oc = jsonParser.getCodec();
+ JsonNode node = oc.readTree(jsonParser);
+
+
+ for (Iterator> it = node.fields(); it.hasNext();) {
+ Map.Entry field = it.next();
+ JsonNode value = field.getValue();
+
+ if (!value.equals(NullNode.getInstance())) {
+ if (!value.isBoolean()){
+ throw deserializationContext.mappingException("Expected access mode for '"+field.getKey()+"' in host but got '"+ value+"'.");
+ }
+
+ VolumeRW bind = new VolumeRW(new Volume(field.getKey()), AccessMode.fromBoolean(value.asBoolean()));
+ volumesRW.add(bind);
+ }
+ }
+ return new VolumesRW(volumesRW.toArray(new VolumeRW[volumesRW.size()]));
+ }
+ }
+
+}
diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java
index 8fdf19975..7419e5dc9 100644
--- a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java
@@ -6,7 +6,7 @@
public class VolumeTest {
@Test
- public void stringify() {
- assertEquals(Volume.parse("/path").toString(), "/path");
+ public void getPath() {
+ assertEquals(new Volume("/path").getPath(), "/path");
}
}
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 752f0aefc..4feadc6b4 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -30,6 +30,7 @@
import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.AccessMode;
import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
@@ -38,6 +39,8 @@
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
+import com.github.dockerjava.api.model.VolumeRW;
+import com.github.dockerjava.api.model.Volumes;
import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.client.AbstractDockerClientTest;
@@ -88,9 +91,11 @@ public void createContainerWithExistingName() throws DockerException {
@Test
public void createContainerWithVolume() throws DockerException {
+ Volume volume = new Volume("/var/log");
+
CreateContainerResponse container = dockerClient
.createContainerCmd("busybox")
- .withVolumes(new Volume("/var/log")).withCmd("true").exec();
+ .withVolumes(volume).withCmd("true").exec();
LOG.info("Created container {}", container.toString());
@@ -104,6 +109,37 @@ public void createContainerWithVolume() throws DockerException {
assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(),
contains("/var/log"));
+
+ assertThat(inspectContainerResponse.getVolumesRW(),
+ hasItemInArray(new VolumeRW(volume, AccessMode.rw)));
+ }
+
+ @Test
+ public void createContainerWithReadOnlyVolume() throws DockerException {
+
+ Volume volume = new Volume("/srv/test");
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox")
+ .withVolumes(volume)
+ .withCmd("true")
+ .exec();
+
+ 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
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index f7cbe20c3..9a3071653 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -65,7 +65,8 @@ public void startContainerWithVolumes() throws DockerException {
Volume volume2 = new Volume("/opt/webapp2");
CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withVolumes(volume1, volume2)
+ .createContainerCmd("busybox")
+ .withVolumes(volume1, volume2)
.withCmd("true").exec();
LOG.info("Created container {}", container.toString());
@@ -91,7 +92,7 @@ public void startContainerWithVolumes() throws DockerException {
assertContainerHasVolumes(inspectContainerResponse, volume1, volume2);
assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
- contains(volume1, volume2));
+ contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2)));
}
From 6cd5f46e266e4351098679877bc477840281062c Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 2 May 2015 00:34:58 +0200
Subject: [PATCH 0031/1272] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ee13f6af..ea8bdf048 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@ Change Log
===
Latest SNAPSHOT
---
+* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized
* [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command
* [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings
From cfc3a9a1df239f401b0554f7f2a15cad514f9c30 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 2 May 2015 00:44:41 +0200
Subject: [PATCH 0032/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea8bdf048..33607c66c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,9 @@ Change Log
===
Latest SNAPSHOT
---
+
* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized
+* [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build
* [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command
* [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings
From 7675400a68af3e77f32179947471279fb36f2324 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 2 May 2015 00:47:12 +0200
Subject: [PATCH 0033/1272] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index b7e9c6217..bbafd8a6a 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
Java API client for [Docker](http://docs.docker.io/ "Docker")
-Supports a subset of the Docker Client API v1.16, Docker Server version 1.4.1
+Supports a subset of the Docker Client API v1.17, Docker Server version 1.5.0
The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries!
@@ -64,7 +64,7 @@ Run build without integration tests:
com.github.docker-java
docker-java
- 1.0.0
+ 1.2.0
### Latest SNAPSHOT version
@@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [
com.github.docker-java
docker-java
- 1.0.1-SNAPSHOT
+ 1.2.1-SNAPSHOT
## Documentation
From 42c1892b07f216dca2882bdfb6f7d86eb405964f Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 08:57:41 +0100
Subject: [PATCH 0034/1272] Updated to jersey 2.17.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 1279f9c11..010165a8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
1.7
1.7
- 2.11
+ 2.17
2.1.2
4.3.1
1.5
From 92b2002224425235707228dd51657f172693b5cb Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 09:01:13 +0100
Subject: [PATCH 0035/1272] Flipped expressions for minor perf issue.
---
src/main/java/com/github/dockerjava/api/model/Frame.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java
index 3860a5dba..175b56830 100644
--- a/src/main/java/com/github/dockerjava/api/model/Frame.java
+++ b/src/main/java/com/github/dockerjava/api/model/Frame.java
@@ -34,7 +34,7 @@ public boolean equals(Object o) {
Frame frame = (Frame) o;
- return Arrays.equals(payload, frame.payload) && streamType == frame.streamType;
+ return streamType == frame.streamType && Arrays.equals(payload, frame.payload);
}
From 9dc9b3c2d26aa25536a60db815934dd7a6c69982 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 09:41:42 +0100
Subject: [PATCH 0036/1272] Reverted jersey 2.11 -> 2.17
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 010165a8b..1279f9c11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,7 +47,7 @@
1.7
1.7
- 2.17
+ 2.11
2.1.2
4.3.1
1.5
From ebaba3588bd6545bb698a529d553d25d5fe9aec8 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 09:43:24 +0100
Subject: [PATCH 0037/1272] Created integration test for FrameReader.
---
.../core/command/DockerfileFixture.java | 63 +++++++++++++++++++
.../core/command/FrameReaderITest.java | 58 +++++++++++++++++
.../frameReaderDockerfile/Dockerfile | 10 +++
3 files changed, 131 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
create mode 100644 src/test/resources/frameReaderDockerfile/Dockerfile
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
new file mode 100644
index 000000000..d6a034f6d
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -0,0 +1,63 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.DockerClient;
+
+import java.io.File;
+
+/**
+ * Start and stop a single container for testing.
+ */
+public class DockerfileFixture implements AutoCloseable {
+
+ private final DockerClient dockerClient;
+ private String directory;
+ private String repository;
+ private String containerId;
+
+ public DockerfileFixture(DockerClient dockerClient, String directory) {
+ this.dockerClient = dockerClient;
+ this.directory = directory;
+ }
+
+ public void open() throws Exception {
+
+ dockerClient
+ .buildImageCmd(new File("src/test/resources", directory))
+ .withNoCache() // remove alternatives, cause problems
+ .exec()
+ .close();
+
+ repository = dockerClient
+ .listImagesCmd()
+ .exec()
+ .get(0)
+ .getRepoTags()[0];
+
+ containerId = dockerClient
+ .createContainerCmd(repository)
+ .exec()
+ .getId();
+
+ dockerClient
+ .startContainerCmd(containerId)
+ .exec();
+ }
+
+ @Override
+ public void close() throws Exception {
+
+ dockerClient
+ .removeContainerCmd(containerId)
+ .withForce() // stop too
+ .exec();
+
+ dockerClient
+ .removeImageCmd(repository)
+ .withForce()
+ .exec();
+ }
+
+ public String getContainerId() {
+ return containerId;
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
new file mode 100644
index 000000000..61a5fb88b
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -0,0 +1,58 @@
+package com.github.dockerjava.core.command;
+
+
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.StreamType;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.InputStream;
+
+@Test(groups = "integration")
+public class FrameReaderITest extends AbstractDockerClientTest {
+
+ private DockerfileFixture dockerfileFixture;
+
+ @BeforeMethod
+ @Override
+ public void beforeTest() {
+ super.beforeTest();
+ dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
+ }
+
+ @BeforeMethod
+ public void createAndStartDockerContainer() throws Exception {
+ dockerfileFixture.open();
+ }
+
+ @AfterMethod
+ public void deleteDockerContainerImage() throws Exception {
+ dockerfileFixture.close();
+ }
+
+ @AfterMethod
+ @Override
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @Test
+ public void canCloseFrameReaderAndReadExpectedLinens() throws Exception {
+
+ InputStream log = dockerClient
+ .logContainerCmd(dockerfileFixture.getContainerId())
+ .withStdOut()
+ .withStdErr()
+ .withFollowStream()
+ .withTailAll()
+ .exec();
+
+ try (FrameReader reader = new FrameReader(log)) {
+ assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes()));
+ assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes()));
+ assertNull(reader.readFrame());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile
new file mode 100644
index 000000000..c4d74fc55
--- /dev/null
+++ b/src/test/resources/frameReaderDockerfile/Dockerfile
@@ -0,0 +1,10 @@
+FROM busybox:latest
+
+# log to stdout and stderr so we can make sure logging with FrameReader works
+
+RUN echo '#! /bin/sh' > cmd.sh
+RUN echo 'echo "to stdout"' >> cmd.sh
+RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh
+RUN chmod +x cmd.sh
+
+CMD ["./cmd.sh"]
\ No newline at end of file
From 6a7f1d268db292a058b9425b117de02031db8cd0 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 09:46:13 +0100
Subject: [PATCH 0038/1272] Created integration test for FrameReader.
---
.../github/dockerjava/core/command/FrameReaderITest.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
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 61a5fb88b..936cd8b4b 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -5,7 +5,9 @@
import com.github.dockerjava.api.model.StreamType;
import com.github.dockerjava.client.AbstractDockerClientTest;
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 java.io.InputStream;
@@ -15,7 +17,7 @@ public class FrameReaderITest extends AbstractDockerClientTest {
private DockerfileFixture dockerfileFixture;
- @BeforeMethod
+ @BeforeTest
@Override
public void beforeTest() {
super.beforeTest();
@@ -32,7 +34,7 @@ public void deleteDockerContainerImage() throws Exception {
dockerfileFixture.close();
}
- @AfterMethod
+ @AfterTest
@Override
public void afterTest() {
super.afterTest();
From 5e8cfc606c25e61dcefd793090effb8a7a6a2855 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 10:28:26 +0100
Subject: [PATCH 0039/1272] Mad Dockerfile more robust.
---
.../core/command/DockerfileFixture.java | 32 ++++++++++++++-----
1 file changed, 24 insertions(+), 8 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index d6a034f6d..599c88480 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -1,6 +1,8 @@
package com.github.dockerjava.core.command;
import com.github.dockerjava.api.DockerClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.File;
@@ -9,6 +11,7 @@
*/
public class DockerfileFixture implements AutoCloseable {
+ private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileFixture.class);
private final DockerClient dockerClient;
private String directory;
private String repository;
@@ -21,6 +24,7 @@ public DockerfileFixture(DockerClient dockerClient, String directory) {
public void open() throws Exception {
+ LOGGER.info("building {}", directory);
dockerClient
.buildImageCmd(new File("src/test/resources", directory))
.withNoCache() // remove alternatives, cause problems
@@ -33,11 +37,15 @@ public void open() throws Exception {
.get(0)
.getRepoTags()[0];
+ LOGGER.info("created {}", repository);
+
containerId = dockerClient
.createContainerCmd(repository)
.exec()
.getId();
+ LOGGER.info("starting {}", containerId);
+
dockerClient
.startContainerCmd(containerId)
.exec();
@@ -46,15 +54,23 @@ public void open() throws Exception {
@Override
public void close() throws Exception {
- dockerClient
- .removeContainerCmd(containerId)
- .withForce() // stop too
- .exec();
+ if (containerId != null) {
+ LOGGER.info("removing container {}", containerId);
+ dockerClient
+ .removeContainerCmd(containerId)
+ .withForce() // stop too
+ .exec();
+ containerId = null;
+ }
- dockerClient
- .removeImageCmd(repository)
- .withForce()
- .exec();
+ if (repository != null) {
+ LOGGER.info("removing repostiory {}", repository);
+ dockerClient
+ .removeImageCmd(repository)
+ .withForce()
+ .exec();
+ repository = null;
+ }
}
public String getContainerId() {
From e29e7da45b8453c22a625f4ef4a09699240ee42f Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 10:35:02 +0100
Subject: [PATCH 0040/1272] Ignore container removal error.
---
.../core/command/DockerfileFixture.java | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index 599c88480..4970a2931 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.core.command;
import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.NotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,15 +57,19 @@ public void close() throws Exception {
if (containerId != null) {
LOGGER.info("removing container {}", containerId);
- dockerClient
- .removeContainerCmd(containerId)
- .withForce() // stop too
- .exec();
+ try {
+ dockerClient
+ .removeContainerCmd(containerId)
+ .withForce() // stop too
+ .exec();
+ } catch (NotFoundException ignored) {
+ LOGGER.info("ignoring {}", ignored.getMessage());
+ }
containerId = null;
}
if (repository != null) {
- LOGGER.info("removing repostiory {}", repository);
+ LOGGER.info("removing repository {}", repository);
dockerClient
.removeImageCmd(repository)
.withForce()
From 09220689a83cf06f90d866acac329463b811d952 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 11:44:18 +0100
Subject: [PATCH 0041/1272] Fixed connection leak.
---
.../dockerjava/jaxrs/BuildImageCmdExec.java | 36 ++++++++++---------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
index b5ea85ed2..3bdfb006c 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
@@ -1,21 +1,5 @@
package com.github.dockerjava.jaxrs;
-import static javax.ws.rs.client.Entity.entity;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.glassfish.jersey.client.ClientProperties;
-import org.glassfish.jersey.client.RequestEntityProcessing;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.github.dockerjava.api.command.BuildImageCmd;
@@ -23,6 +7,20 @@
import com.github.dockerjava.api.model.EventStreamItem;
import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
import com.google.common.collect.ImmutableList;
+import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.RequestEntityProcessing;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import static javax.ws.rs.client.Entity.entity;
public class BuildImageCmdExec extends
AbstrDockerCmdExec implements
@@ -112,5 +110,11 @@ public Iterable getItems() throws IOException {
public int read() throws IOException {
return proxy.read();
}
+
+ @Override
+ public void close() throws IOException {
+ proxy.close();
+ super.close();
+ }
}
}
From 92aa1bbfe6b416c160dc4dc1eef66f9a40d015e1 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 11:50:06 +0100
Subject: [PATCH 0042/1272] Updated test.
---
.../core/command/DockerfileFixture.java | 11 +++--
.../core/command/FrameReaderITest.java | 47 ++++++++++++++++---
.../resources/busyboxDockerfile/Dockerfile | 3 ++
.../frameReaderDockerfile/Dockerfile | 3 ++
4 files changed, 53 insertions(+), 11 deletions(-)
create mode 100644 src/test/resources/busyboxDockerfile/Dockerfile
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index 4970a2931..b3bdf4ea6 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -2,6 +2,7 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.Image;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,16 +33,18 @@ public void open() throws Exception {
.exec()
.close();
- repository = dockerClient
+ Image lastCreatedImage = dockerClient
.listImagesCmd()
.exec()
- .get(0)
+ .get(0);
+
+ repository = lastCreatedImage
.getRepoTags()[0];
- LOGGER.info("created {}", repository);
+ LOGGER.info("created {} {}", lastCreatedImage.getId(), repository);
containerId = dockerClient
- .createContainerCmd(repository)
+ .createContainerCmd(lastCreatedImage.getId())
.exec()
.getId();
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 936cd8b4b..4654d83dd 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -10,6 +10,7 @@
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
+import java.io.IOException;
import java.io.InputStream;
@Test(groups = "integration")
@@ -41,20 +42,52 @@ public void afterTest() {
}
@Test
- public void canCloseFrameReaderAndReadExpectedLinens() throws Exception {
+ public void canCloseFrameReaderAndReadExpectedLines() throws Exception {
- InputStream log = dockerClient
+ try (FrameReader reader = new FrameReader(getLoggerStream())) {
+ assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes()));
+ assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes()));
+ assertNull(reader.readFrame());
+ }
+ }
+
+ private InputStream getLoggerStream() {
+ return dockerClient
.logContainerCmd(dockerfileFixture.getContainerId())
.withStdOut()
.withStdErr()
- .withFollowStream()
.withTailAll()
+ .withTail(10)
+ .withFollowStream()
.exec();
+ }
- try (FrameReader reader = new FrameReader(log)) {
- assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes()));
- assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes()));
- assertNull(reader.readFrame());
+ @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();
+
}
}
\ No newline at end of file
diff --git a/src/test/resources/busyboxDockerfile/Dockerfile b/src/test/resources/busyboxDockerfile/Dockerfile
new file mode 100644
index 000000000..5377ac8a6
--- /dev/null
+++ b/src/test/resources/busyboxDockerfile/Dockerfile
@@ -0,0 +1,3 @@
+FROM busybox:latest
+
+CMD ["cat"]
\ No newline at end of file
diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile
index c4d74fc55..8d9b553e1 100644
--- a/src/test/resources/frameReaderDockerfile/Dockerfile
+++ b/src/test/resources/frameReaderDockerfile/Dockerfile
@@ -3,8 +3,11 @@ FROM busybox:latest
# log to stdout and stderr so we can make sure logging with FrameReader works
RUN echo '#! /bin/sh' > cmd.sh
+RUN echo 'sleep 1' >> cmd.sh
RUN echo 'echo "to stdout"' >> cmd.sh
RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh
+# block for ever
+RUN echo 'cat' >> cmd.sh
RUN chmod +x cmd.sh
CMD ["./cmd.sh"]
\ No newline at end of file
From 6942c4fc9fe085915d4e791758a1ce27ca1179ca Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 12:02:41 +0100
Subject: [PATCH 0043/1272] Ignore error when removing image (e.g. due to brtfs
on CircleCI).
---
.../dockerjava/core/command/DockerfileFixture.java | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index b3bdf4ea6..500a6263b 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.core.command;
import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.InternalServerErrorException;
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.model.Image;
import org.slf4j.Logger;
@@ -73,10 +74,14 @@ public void close() throws Exception {
if (repository != null) {
LOGGER.info("removing repository {}", repository);
- dockerClient
- .removeImageCmd(repository)
- .withForce()
- .exec();
+ try {
+ dockerClient
+ .removeImageCmd(repository)
+ .withForce()
+ .exec();
+ } catch (InternalServerErrorException e) {
+ LOGGER.info("ignoring {}", e.getMessage());
+ }
repository = null;
}
}
From 33d66dab953956e8af2102853d4599256b08b7ce Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 12:33:31 +0100
Subject: [PATCH 0044/1272] Ignore error when removing image (e.g. due to brtfs
on CircleCI).
---
.../com/github/dockerjava/core/command/DockerfileFixture.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index 500a6263b..2d7ca7c8d 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -66,7 +66,7 @@ public void close() throws Exception {
.removeContainerCmd(containerId)
.withForce() // stop too
.exec();
- } catch (NotFoundException ignored) {
+ } catch (NotFoundException | InternalServerErrorException ignored) {
LOGGER.info("ignoring {}", ignored.getMessage());
}
containerId = null;
From f05294d51ec3448552e79712058ed4f5ef6c9db9 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 13:25:37 +0100
Subject: [PATCH 0045/1272] Added PullEventStreamItem and EventStreamReader to
stream the reading of events.
---
.../dockerjava/api/command/BuildImageCmd.java | 9 ++-
.../dockerjava/api/command/PullImageCmd.java | 3 +
.../dockerjava/api/command/PushImageCmd.java | 10 ++-
.../api/model/PullEventStreamItem.java | 59 +++++++++++++++
.../core/command/EventStreamReader.java | 35 +++++++++
.../core/command/EventStreamReaderITest.java | 72 +++++++++++++++++++
.../core/command/FrameReaderITest.java | 28 +++-----
.../eventStreamReaderDockerfile/Dockerfile | 5 ++
8 files changed, 197 insertions(+), 24 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java
create mode 100644 src/main/java/com/github/dockerjava/core/command/EventStreamReader.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
create mode 100644 src/test/resources/eventStreamReaderDockerfile/Dockerfile
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 ec013d424..925946db4 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -1,12 +1,12 @@
package com.github.dockerjava.api.command;
+import com.github.dockerjava.api.model.AuthConfigurations;
+import com.github.dockerjava.api.model.EventStreamItem;
+
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import com.github.dockerjava.api.model.AuthConfigurations;
-import com.github.dockerjava.api.model.EventStreamItem;
-
/**
*
* Build an image from Dockerfile.
@@ -61,6 +61,9 @@ public interface BuildImageCmd extends DockerCmd{
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;
}
diff --git a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
index c39617dde..4b5fc4c32 100644
--- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.core.command.EventStreamReader;
import java.io.InputStream;
@@ -33,6 +34,8 @@ public static interface Exec extends DockerCmdExec {
/**
* Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent
* connection leaks.
+ *
+ * @see {@link EventStreamReader}
*/
@Override
public InputStream exec();
diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
index 80e16c6d9..9ed38beb7 100644
--- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
@@ -1,11 +1,12 @@
package com.github.dockerjava.api.command;
-import java.io.IOException;
-import java.io.InputStream;
-
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.PushEventStreamItem;
+import com.github.dockerjava.core.command.EventStreamReader;
+
+import java.io.IOException;
+import java.io.InputStream;
/**
* Push the latest image to the repository.
@@ -40,6 +41,9 @@ public interface PushImageCmd extends DockerCmd{
public static interface Exec extends DockerCmdExec {
}
+ /**
+ * @see {@link EventStreamReader}
+ */
public static abstract class Response extends InputStream {
public abstract Iterable getItems() throws IOException;
}
diff --git a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java
new file mode 100644
index 000000000..4a3a0b507
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java
@@ -0,0 +1,59 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Objects;
+
+import java.io.Serializable;
+
+/**
+ * Represents an item returned from pull
+ */
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class PullEventStreamItem implements Serializable {
+
+ private static final long serialVersionUID = -5187169652557467828L;
+
+ @JsonProperty("status")
+ private String status;
+
+ @JsonProperty("progress")
+ private String progress;
+
+ @JsonProperty("progressDetail")
+ private ProgressDetail progressDetail;
+
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getProgress() {
+ return progress;
+ }
+
+ public ProgressDetail getProgressDetail() {
+ return progressDetail;
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown=true)
+ public static class ProgressDetail implements Serializable {
+ @JsonProperty("current")
+ int current;
+
+
+ @Override
+ public String toString() {
+ return "current " + current;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this)
+ .add("status", status)
+ .add("progress", progress)
+ .add("progressDetail", progressDetail)
+ .toString();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java
new file mode 100644
index 000000000..b8975224f
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java
@@ -0,0 +1,35 @@
+package com.github.dockerjava.core.command;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class EventStreamReader implements AutoCloseable {
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+ private final Class type;
+ private final InputStream inputStream;
+
+ public EventStreamReader(InputStream inputStream, Class type) {
+ this.inputStream = inputStream;
+ this.type = type;
+ }
+
+ public I readItem() throws IOException {
+ try {
+ return objectMapper.readValue(inputStream, type);
+ } catch (IOException e) {
+ // dirty, but works
+ if (e.getMessage().equals("Stream closed")) {
+ return null;
+ }
+ throw e;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ inputStream.close();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
new file mode 100644
index 000000000..dfc330d9e
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
@@ -0,0 +1,72 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.model.EventStreamItem;
+import com.github.dockerjava.api.model.PullEventStreamItem;
+import com.github.dockerjava.core.DockerClientBuilder;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.io.File;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
+import static org.hamcrest.core.AllOf.allOf;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.testng.AssertJUnit.assertNull;
+
+
+@Test(groups = "integration")
+public class EventStreamReaderITest {
+
+ private DockerClient dockerClient;
+
+ @BeforeTest
+ public void setUp() throws Exception {
+ dockerClient = DockerClientBuilder.getInstance().build();
+ }
+
+ @AfterTest
+ public void tearDown() throws Exception {
+ dockerClient.close();
+ }
+
+ @Test
+ public void pullCanBeStreamed() throws Exception {
+
+ try (EventStreamReader reader = new EventStreamReader<>(
+ dockerClient.pullImageCmd("busybox:latest").exec(),
+ PullEventStreamItem.class)
+ ) {;
+ assertThat(reader.readItem(),
+ allOf(
+ hasProperty("status", equalTo("Pulling repository busybox")),
+ hasProperty("progress", nullValue()),
+ hasProperty("progressDetail", nullValue())
+ )
+ );
+ assertNull(reader.readItem());
+ }
+ }
+
+ @Test
+ public void buildCanBeStreamed() throws Exception {
+
+ try (EventStreamReader reader = new EventStreamReader<>(
+ dockerClient.buildImageCmd(new File("src/test/resources/eventStreamReaderDockerfile")).exec(),
+ EventStreamItem.class)
+ ) {
+ assertThat(reader.readItem(),
+ allOf(
+ hasProperty("stream", equalTo("Step 0 : FROM busybox:latest\n")),
+ hasProperty("error", nullValue()),
+ hasProperty("errorDetail", nullValue())
+ )
+ );
+ assertNull(reader.readItem());
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
index 4654d83dd..3aee3cb45 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -1,44 +1,36 @@
package com.github.dockerjava.core.command;
+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 org.testng.annotations.AfterMethod;
+import com.github.dockerjava.core.DockerClientBuilder;
import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
+import static org.testng.Assert.assertEquals;
+import static org.testng.AssertJUnit.assertNull;
+
@Test(groups = "integration")
-public class FrameReaderITest extends AbstractDockerClientTest {
+public class FrameReaderITest {
+ private DockerClient dockerClient;
private DockerfileFixture dockerfileFixture;
@BeforeTest
- @Override
public void beforeTest() {
- super.beforeTest();
+ dockerClient = DockerClientBuilder.getInstance().build();
dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
}
- @BeforeMethod
- public void createAndStartDockerContainer() throws Exception {
- dockerfileFixture.open();
- }
-
- @AfterMethod
+ @AfterTest
public void deleteDockerContainerImage() throws Exception {
dockerfileFixture.close();
- }
-
- @AfterTest
- @Override
- public void afterTest() {
- super.afterTest();
+ dockerClient.close();
}
@Test
diff --git a/src/test/resources/eventStreamReaderDockerfile/Dockerfile b/src/test/resources/eventStreamReaderDockerfile/Dockerfile
new file mode 100644
index 000000000..cdd3bba79
--- /dev/null
+++ b/src/test/resources/eventStreamReaderDockerfile/Dockerfile
@@ -0,0 +1,5 @@
+FROM busybox:latest
+
+RUN true
+
+CMD ["true"]
\ No newline at end of file
From 8a35bd692ba9fe5090bbb6db789279befa929b5f Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 16:49:55 +0100
Subject: [PATCH 0046/1272] Corrected bug in test.
---
.../com/github/dockerjava/core/command/FrameReaderITest.java | 1 +
1 file changed, 1 insertion(+)
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 3aee3cb45..e8e6bcc65 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -25,6 +25,7 @@ public class FrameReaderITest {
public void beforeTest() {
dockerClient = DockerClientBuilder.getInstance().build();
dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
+ dockerfileFixture.open();
}
@AfterTest
From 86c9f0aa93cb3aa2a64747c303e6756828f5e0e3 Mon Sep 17 00:00:00 2001
From: Alex Collins
Date: Sun, 3 May 2015 16:51:54 +0100
Subject: [PATCH 0047/1272] Added PullEventStreamItem and EventStreamReader to
stream the reading of events.
---
.../github/dockerjava/core/command/DockerfileFixture.java | 5 +++--
.../com/github/dockerjava/core/command/FrameReaderITest.java | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index 2d7ca7c8d..840f63da4 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -8,6 +8,7 @@
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.io.IOException;
/**
* Start and stop a single container for testing.
@@ -25,7 +26,7 @@ public DockerfileFixture(DockerClient dockerClient, String directory) {
this.directory = directory;
}
- public void open() throws Exception {
+ public void open() throws IOException {
LOGGER.info("building {}", directory);
dockerClient
@@ -79,7 +80,7 @@ public void close() throws Exception {
.removeImageCmd(repository)
.withForce()
.exec();
- } catch (InternalServerErrorException e) {
+ } catch (NotFoundException | InternalServerErrorException e) {
LOGGER.info("ignoring {}", e.getMessage());
}
repository = null;
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 e8e6bcc65..0cf08e953 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -22,7 +22,7 @@ public class FrameReaderITest {
private DockerfileFixture dockerfileFixture;
@BeforeTest
- public void beforeTest() {
+ public void beforeTest() throws Exception {
dockerClient = DockerClientBuilder.getInstance().build();
dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile");
dockerfileFixture.open();
From c577bf9cb77b523a2ebbdc14f6edd9d661bda250 Mon Sep 17 00:00:00 2001
From: Oleg Nenashev
Date: Wed, 6 May 2015 00:42:19 +0300
Subject: [PATCH 0048/1272] Add public constructor and Javadoc to
api.model.Event
---
.../github/dockerjava/api/model/Event.java | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java
index 674cb66de..cb961f97d 100644
--- a/src/main/java/com/github/dockerjava/api/model/Event.java
+++ b/src/main/java/com/github/dockerjava/api/model/Event.java
@@ -14,18 +14,59 @@ public class Event {
private long time;
+ /**
+ * Default constructor for the deserialization.
+ */
+ public Event() {
+ }
+
+ /**
+ * Constructor.
+ * @param id Container ID
+ * @param status Status string.
+ * List of statuses is available in Docker API v.1.16
+ * @param from Image, from which the container has been created
+ * @param time Event time
+ * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT
+ * @since TODO
+ */
+ public Event(String status, String id, String from, long time) {
+ this.status = status;
+ this.id = id;
+ this.from = from;
+ this.time = time;
+ }
+
+ /**
+ * Status of docker image or container.
+ * List of statuses is available in Docker API v.1.16
+ * @return Status string
+ */
public String getStatus() {
return status;
}
+ /**
+ * Get ID of docker container.
+ * @return Container ID
+ */
public String getId() {
return id;
}
+ /**
+ * Get source image of the container.
+ * @return Name of the parent container
+ */
public String getFrom() {
return from;
}
+ /**
+ * Get the event time.
+ * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT
+ * @return Event time in the specified format.
+ */
public long getTime() {
return time;
}
From 8042fc9ea04359600519d2877ab176e447da5a57 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Wed, 6 May 2015 23:05:46 +0200
Subject: [PATCH 0049/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 33607c66c..e6fca225d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@ Change Log
===
Latest SNAPSHOT
---
-
+* [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events
* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized
* [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build
* [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command
From 5697c60bc4581eff46cc79f735f26b8c658ab2d5 Mon Sep 17 00:00:00 2001
From: "alex.collins"
Date: Wed, 6 May 2015 22:57:07 +0100
Subject: [PATCH 0050/1272] Quietly catch IndexOutOfBoundsException.
---
.../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
index dfc330d9e..b7d86de07 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
@@ -39,7 +39,7 @@ public void pullCanBeStreamed() throws Exception {
try (EventStreamReader reader = new EventStreamReader<>(
dockerClient.pullImageCmd("busybox:latest").exec(),
PullEventStreamItem.class)
- ) {;
+ ) {
assertThat(reader.readItem(),
allOf(
hasProperty("status", equalTo("Pulling repository busybox")),
From f4d5a4dd2cb51934e61dff5d7df213b0130e8532 Mon Sep 17 00:00:00 2001
From: "alex.collins"
Date: Wed, 6 May 2015 23:04:29 +0100
Subject: [PATCH 0051/1272] Revert "Quietly catch IndexOutOfBoundsException."
This reverts commit 5697c60bc4581eff46cc79f735f26b8c658ab2d5.
---
.../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
index b7d86de07..dfc330d9e 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
@@ -39,7 +39,7 @@ public void pullCanBeStreamed() throws Exception {
try (EventStreamReader reader = new EventStreamReader<>(
dockerClient.pullImageCmd("busybox:latest").exec(),
PullEventStreamItem.class)
- ) {
+ ) {;
assertThat(reader.readItem(),
allOf(
hasProperty("status", equalTo("Pulling repository busybox")),
From 6fa074ba40cf54e9043dc6a80db142c76968bb9b Mon Sep 17 00:00:00 2001
From: Vangie Du
Date: Thu, 7 May 2015 15:51:01 +0800
Subject: [PATCH 0052/1272] Add ulimit support
---
.../dockerjava/api/model/HostConfig.java | 20 +++--
.../github/dockerjava/api/model/Ulimit.java | 64 ++++++++++++++++
.../command/CreateContainerCmdImplTest.java | 73 +++++++++----------
3 files changed, 115 insertions(+), 42 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/model/Ulimit.java
diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
index 18fd34073..9973e6252 100644
--- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
@@ -1,12 +1,10 @@
package com.github.dockerjava.api.model;
-import java.util.Map;
-
-import org.apache.commons.lang.builder.ToStringBuilder;
-
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
@JsonIgnoreProperties(ignoreUnknown = true)
public class HostConfig {
@@ -59,13 +57,16 @@ public class HostConfig {
@JsonProperty("ExtraHosts")
private String[] extraHosts;
+ @JsonProperty("Ulimits")
+ private Ulimit[] ulimits;
+
public HostConfig() {
}
public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts,
boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile,
Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices,
- String[] extraHosts) {
+ String[] extraHosts, Ulimit[] ulimits) {
this.binds = new Binds(binds);
this.links = new Links(links);
this.lxcConf = lxcConf;
@@ -82,6 +83,7 @@ public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindi
this.networkMode = networkMode;
this.devices = devices;
this.extraHosts = extraHosts;
+ this.ulimits = ulimits;
}
@@ -151,6 +153,10 @@ public Capability[] getCapDrop() {
return capDrop;
}
+ public Ulimit[] getUlimits() {
+ return ulimits;
+ }
+
@JsonIgnore
public void setBinds(Bind... binds) {
this.binds = new Binds(binds);
@@ -217,6 +223,10 @@ public void setExtraHosts(String[] extraHosts) {
this.extraHosts = extraHosts;
}
+ public void setUlimits(Ulimit[] ulimits) {
+ this.ulimits = ulimits;
+ }
+
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
diff --git a/src/main/java/com/github/dockerjava/api/model/Ulimit.java b/src/main/java/com/github/dockerjava/api/model/Ulimit.java
new file mode 100644
index 000000000..d5fac09c1
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java
@@ -0,0 +1,64 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * @author Vangie Du (duwan@live.com)
+ */
+public class Ulimit {
+
+ @JsonProperty("Name")
+ private String name ;
+
+ @JsonProperty("Soft")
+ private int soft;
+
+ @JsonProperty("Hard")
+ private int hard;
+
+ public Ulimit() {
+
+ }
+
+ public Ulimit(String name, int soft, int hard) {
+ checkNotNull(name, "Name is null");
+
+ this.name = name;
+ this.soft = soft;
+ this.hard = hard;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getSoft() {
+ return soft;
+ }
+
+ public int getHard() {
+ return hard;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Ulimit) {
+ Ulimit other = (Ulimit) obj;
+ return new EqualsBuilder()
+ .append(name, other.getName())
+ .append(soft, other.getSoft())
+ .append(hard, other.getHard()).isEquals();
+ } else
+ return super.equals(obj);
+
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(name).append(soft).append(hard).toHashCode();
+ }
+}
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 4feadc6b4..c37f48484 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -1,48 +1,23 @@
package com.github.dockerjava.core.command;
-import static com.github.dockerjava.api.model.Capability.MKNOD;
-import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.containsInAnyOrder;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasItemInArray;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.isEmptyString;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.startsWith;
+import com.github.dockerjava.api.ConflictException;
+import com.github.dockerjava.api.DockerException;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.*;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+import org.testng.ITestResult;
+import org.testng.annotations.*;
import java.lang.reflect.Method;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.UUID;
-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.ConflictException;
-import com.github.dockerjava.api.DockerException;
-import com.github.dockerjava.api.command.CreateContainerResponse;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import com.github.dockerjava.api.model.AccessMode;
-import com.github.dockerjava.api.model.Bind;
-import com.github.dockerjava.api.model.Device;
-import com.github.dockerjava.api.model.ExposedPort;
-import com.github.dockerjava.api.model.HostConfig;
-import com.github.dockerjava.api.model.Link;
-import com.github.dockerjava.api.model.Ports;
-import com.github.dockerjava.api.model.RestartPolicy;
-import com.github.dockerjava.api.model.Volume;
-import com.github.dockerjava.api.model.VolumeRW;
-import com.github.dockerjava.api.model.Volumes;
-import com.github.dockerjava.api.model.VolumesFrom;
-import com.github.dockerjava.client.AbstractDockerClientTest;
+import static com.github.dockerjava.api.model.Capability.MKNOD;
+import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
@Test(groups = "integration")
public class CreateContainerCmdImplTest extends AbstractDockerClientTest {
@@ -564,5 +539,29 @@ public void createContainerWithMacAddress() throws DockerException {
assertEquals(inspectContainerResponse.getConfig().getMacAddress(),
"00:80:41:ae:fd:7e");
}
+
+ @Test
+ 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)));
+
+ }
}
From bdbdd7521b39945c64c3c75535f16aa18e0cc4ea Mon Sep 17 00:00:00 2001
From: Oleg Nenashev
Date: Thu, 7 May 2015 11:53:12 +0300
Subject: [PATCH 0053/1272] Added framework classes for JSON
serialization-deserialization tests
---
.../test/serdes/AbstractJSONResourceRef.java | 31 +++++
.../test/serdes/JSONResourceRef.java | 37 ++++++
.../test/serdes/JSONTestHelper.java | 110 ++++++++++++++++++
3 files changed, 178 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java
create mode 100644 src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java
create mode 100644 src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
diff --git a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java
new file mode 100644
index 000000000..882b3b012
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2015 CloudBees Inc., Oleg Nenashev.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.dockerjava.test.serdes;
+
+/**
+ * Default implementation of the Resource reference.
+ * @author Oleg Nenashev
+ */
+public abstract class AbstractJSONResourceRef implements JSONResourceRef {
+ /**
+ * Gets a class which stores resources.
+ * @return Reference class by default.
+ */
+ @Override
+ public Class> getResourceClass() {
+ return this.getClass();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java
new file mode 100644
index 000000000..96e5df726
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2015 Oleg Nenashev.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.dockerjava.test.serdes;
+
+import java.io.IOException;
+
+/**
+ * References JSON resources, which
+ * @author Oleg Nenashev
+ */
+public interface JSONResourceRef {
+
+ /**
+ * Gets the resource file name under the class.
+ * @return File name, which is stored under the resource class
+ */
+ String getFileName();
+
+ /**
+ * Gets a class which stores resources.
+ * @return Class to be used as a resource source
+ */
+ Class> getResourceClass();
+}
diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
new file mode 100644
index 000000000..b465b2aac
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2015 Oleg Nenashev.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.dockerjava.test.serdes;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.api.command.CommandJSONSamples;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.commons.io.IOUtils;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+/**
+ * Provides helper methods for serialization-deserialization tests
+ * @author Oleg Nenashev
+ * @since TODO
+ */
+public class JSONTestHelper {
+
+ /**
+ * Reads JSON String from the specified resource
+ * @param resource JSON File
+ * @return JSON String
+ * @throws IOException JSON Conversion error
+ */
+ public static String readString(JSONResourceRef resource) throws IOException {
+ InputStream istream = CommandJSONSamples.class.getResourceAsStream(resource.getFileName());
+ if (istream == null) {
+ throw new IOException("Cannot retrieve resource " + resource.getFileName());
+ }
+ return IOUtils.toString(istream, "UTF-8");
+ }
+
+ /**
+ * Reads item from the resource.
+ * @param Data class to be read
+ * @param resource Resource reference
+ * @param tclass Class entry
+ * @return Item
+ * @throws IOException JSON conversion error
+ */
+ public static TClass readObject(JSONResourceRef resource, Class tclass) throws IOException {
+ ObjectMapper mapper = new ObjectMapper();
+ String str = readString(resource);
+ return mapper.readValue(str, tclass);
+ }
+
+ /**
+ * Basic serialization-deserialization consistency test for the resource.
+ * @param Data class
+ * @param resource Resource reference
+ * @param tclass Class entry
+ * @throws IOException JSON conversion error
+ * @throws AssertionError Validation error
+ * @return Deserialized object after the roundtrip
+ */
+ public static TClass testRoundTrip(JSONResourceRef resource, Class tclass)
+ throws IOException, AssertionError {
+ TClass item = readObject(resource, tclass);
+ assertNotNull(item);
+ return testRoundTrip(item, tclass);
+ }
+
+ /**
+ * Performs roundtrip test for the specified class.
+ * @param Item class
+ * @param item Item to be checked
+ * @return Deserialized object after the roundtrip
+ * @throws IOException JSON Conversion error
+ * @throws AssertionError Validation error
+ */
+ @SuppressWarnings("unchecked")
+ public static TClass testRoundTrip(TClass item)
+ throws IOException, AssertionError {
+ return testRoundTrip(item, (Class)item.getClass());
+ }
+
+ /**
+ * Performs roundtrip test for the specified class.
+ * @param Item class
+ * @param item Item to be checked
+ * @param asclass Class to be used during conversions
+ * @return Deserialized object after the roundtrip
+ * @throws IOException JSON Conversion error
+ * @throws AssertionError Validation error
+ */
+ public static TClass testRoundTrip(TClass item, Class asclass)
+ throws IOException, AssertionError {
+ ObjectMapper mapper = new ObjectMapper();
+
+ String inputItemString = mapper.writeValueAsString(item);
+ TClass convertedItem = mapper.readValue(inputItemString, asclass);
+ String convertedItemString = mapper.writeValueAsString(convertedItem);
+ assertEquals(convertedItemString, inputItemString, "JSONs must be equal after the second roundtrip");
+ return convertedItem;
+ }
+}
From a221a94edb8018321b5c49160a5c51df23a9541d Mon Sep 17 00:00:00 2001
From: Oleg Nenashev
Date: Thu, 7 May 2015 11:53:50 +0300
Subject: [PATCH 0054/1272] Direct unit tests for
https://github.com/docker-java/docker-java/issues/211
---
.../api/command/CommandJSONSamples.java | 45 ++++++
.../command/InspectContainerResponseTest.java | 51 ++++++
.../inspectContainerResponse_empty.json | 115 +++++++++++++
.../inspectContainerResponse_full.json | 153 ++++++++++++++++++
4 files changed, 364 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java
create mode 100644 src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
create mode 100644 src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json
create mode 100644 src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json
diff --git a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java
new file mode 100644
index 000000000..500919fdc
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 CloudBees Inc., Oleg Nenashev.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.test.serdes.AbstractJSONResourceRef;
+import com.github.dockerjava.test.serdes.JSONResourceRef;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.commons.io.IOUtils;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+/**
+ * References test resources and provides basic tests functionality.
+ * @author Oleg Nenashev
+ */
+public enum CommandJSONSamples implements JSONResourceRef {
+
+ inspectContainerResponse_full,
+ inspectContainerResponse_empty;
+
+ @Override
+ public String getFileName() {
+ return this + ".json";
+ }
+
+ @Override
+ public Class> getResourceClass() {
+ return CommandJSONSamples.class;
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
new file mode 100644
index 000000000..2e294b146
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 CloudBees Inc., Oleg Nenashev.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.github.dockerjava.api.command;
+
+import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip;
+import java.io.IOException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+
+/**
+ * Tests for {@link InspectContainerResponse}.
+ * @author Oleg Nenashev
+ */
+public class InspectContainerResponseTest {
+
+ @Test
+ public void roundTrip_full() throws IOException {
+ InspectContainerResponse[] responses = testRoundTrip(
+ CommandJSONSamples.inspectContainerResponse_full,
+ InspectContainerResponse[].class);
+ assertEquals(1, responses.length);
+ final InspectContainerResponse response = responses[0];
+
+ // Check volumes: https://github.com/docker-java/docker-java/issues/211
+ assertEquals(response.getVolumes().length, 2);
+ assertEquals(response.getVolumesRW().length, 2);
+ assertEquals(response.getVolumes()[1].getContainerPath(), "/bar/foo/myvol2");
+ assertEquals(response.getVolumes()[1].getHostPath(), "/path2");
+ assertEquals(response.getVolumesRW()[1].getVolume().getPath(), "/bar/foo/myvol2");
+ assertFalse(response.getVolumesRW()[1].getAccessMode().toBoolean());
+ assertTrue(response.getVolumesRW()[0].getAccessMode().toBoolean());
+ }
+
+ @Test
+ public void roundTrip_empty() throws IOException {
+ testRoundTrip(CommandJSONSamples.inspectContainerResponse_empty, InspectContainerResponse[].class);
+ }
+}
diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json
new file mode 100644
index 000000000..ea31d6f33
--- /dev/null
+++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json
@@ -0,0 +1,115 @@
+[{
+ "AppArmorProfile": "",
+ "Args": [ ],
+ "Config": {
+ "AttachStderr": true,
+ "AttachStdin": true,
+ "AttachStdout": true,
+ "Cmd": [ ],
+ "CpuShares": 0,
+ "Cpuset": "",
+ "Domainname": "",
+ "Entrypoint": null,
+ "Env": [ ],
+ "ExposedPorts": { },
+ "Hostname": "469e5edd8d5b",
+ "Image": "jenkinsci/workflow-demo",
+ "Labels": {},
+ "MacAddress": "",
+ "Memory": 0,
+ "MemorySwap": 0,
+ "NetworkDisabled": false,
+ "OnBuild": null,
+ "OpenStdin": true,
+ "PortSpecs": null,
+ "StdinOnce": true,
+ "Tty": true,
+ "User": "",
+ "Volumes": null,
+ "WorkingDir": "/var/lib/jenkins/workflow-plugin-pipeline-demo"
+ },
+ "Created": "2015-04-29T11:55:42.968262967Z",
+ "Driver": "aufs",
+ "ExecDriver": "native-0.2",
+ "ExecIDs": null,
+ "HostConfig": {
+ "Binds": null,
+ "CapAdd": null,
+ "CapDrop": null,
+ "CgroupParent": "",
+ "ContainerIDFile": "",
+ "CpuShares": 0,
+ "CpusetCpus": "",
+ "Devices": [],
+ "Dns": null,
+ "DnsSearch": null,
+ "ExtraHosts": null,
+ "IpcMode": "",
+ "Links": null,
+ "LogConfig": {
+ "Config": null,
+ "Type": "json-file"
+ },
+ "LxcConf": [],
+ "Memory": 0,
+ "MemorySwap": 0,
+ "NetworkMode": "bridge",
+ "PidMode": "",
+ "PortBindings": {
+ "8080/tcp": [ ]
+ },
+ "Privileged": false,
+ "PublishAllPorts": false,
+ "ReadonlyRootfs": false,
+ "RestartPolicy": {
+ "MaximumRetryCount": 0,
+ "Name": ""
+ },
+ "SecurityOpt": null,
+ "Ulimits": null,
+ "VolumesFrom": null
+ },
+ "HostnamePath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hostname",
+ "HostsPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hosts",
+ "Id": "469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1",
+ "Image": "4300417211ebb75b48b06ed5640d641778f312072d24b37978682345cbb362b1",
+ "LogPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log",
+ "MountLabel": "",
+ "Name": "/desperate_babbage",
+ "NetworkSettings": {
+ "Bridge": "docker0",
+ "Gateway": "172.17.42.1",
+ "GlobalIPv6Address": "",
+ "GlobalIPv6PrefixLen": 0,
+ "IPAddress": "172.17.0.2",
+ "IPPrefixLen": 16,
+ "IPv6Gateway": "",
+ "LinkLocalIPv6Address": "fe80::42:acff:fe11:2",
+ "LinkLocalIPv6PrefixLen": 64,
+ "MacAddress": "02:42:ac:11:00:02",
+ "PortMapping": null,
+ "Ports": {
+ "22/tcp": null,
+ "8080/tcp": [ ]
+ }
+ },
+ "Path": "/bin/sh",
+ "ProcessLabel": "",
+ "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/resolv.conf",
+ "RestartCount": 0,
+ "State": {
+ "Dead": false,
+ "Error": "",
+ "ExitCode": 0,
+ "FinishedAt": "0001-01-01T00:00:00Z",
+ "OOMKilled": false,
+ "Paused": false,
+ "Pid": 898,
+ "Restarting": false,
+ "Running": true,
+ "StartedAt": "2015-04-29T11:55:43.464717907Z"
+ },
+ "Volumes": {},
+ "VolumesRW": {}
+}
+]
diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json
new file mode 100644
index 000000000..c4383ef14
--- /dev/null
+++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json
@@ -0,0 +1,153 @@
+[{
+ "AppArmorProfile": "",
+ "Args": [
+ "-c",
+ "/var/lib/jenkins/run.sh"
+ ],
+ "Config": {
+ "AttachStderr": true,
+ "AttachStdin": true,
+ "AttachStdout": true,
+ "Cmd": [
+ "/bin/sh",
+ "-c",
+ "/var/lib/jenkins/run.sh"
+ ],
+ "CpuShares": 0,
+ "Cpuset": "",
+ "Domainname": "",
+ "Entrypoint": null,
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "MAVEN_VERSION=3.3.1",
+ "JETTY_VERSION=9.2.9.v20150224",
+ "REV=107ea141f5c7581056c6eb53d2ccd222cdf0d58c"
+ ],
+ "ExposedPorts": {
+ "22/tcp": {},
+ "8080/tcp": {},
+ "8081/tcp": {}
+ },
+ "Hostname": "469e5edd8d5b",
+ "Image": "jenkinsci/workflow-demo",
+ "Labels": {},
+ "MacAddress": "",
+ "Memory": 0,
+ "MemorySwap": 0,
+ "NetworkDisabled": false,
+ "OnBuild": null,
+ "OpenStdin": true,
+ "PortSpecs": null,
+ "StdinOnce": true,
+ "Tty": true,
+ "User": "",
+ "Volumes": null,
+ "WorkingDir": "/var/lib/jenkins/workflow-plugin-pipeline-demo"
+ },
+ "Created": "2015-04-29T11:55:42.968262967Z",
+ "Driver": "aufs",
+ "ExecDriver": "native-0.2",
+ "ExecIDs": null,
+ "HostConfig": {
+ "Binds": null,
+ "CapAdd": null,
+ "CapDrop": null,
+ "CgroupParent": "",
+ "ContainerIDFile": "",
+ "CpuShares": 0,
+ "CpusetCpus": "",
+ "Devices": [],
+ "Dns": null,
+ "DnsSearch": null,
+ "ExtraHosts": null,
+ "IpcMode": "",
+ "Links": null,
+ "LogConfig": {
+ "Config": null,
+ "Type": "json-file"
+ },
+ "LxcConf": [],
+ "Memory": 0,
+ "MemorySwap": 0,
+ "NetworkMode": "bridge",
+ "PidMode": "",
+ "PortBindings": {
+ "8080/tcp": [
+ {
+ "HostIp": "",
+ "HostPort": "8080"
+ }
+ ],
+ "8081/tcp": [
+ {
+ "HostIp": "",
+ "HostPort": "8081"
+ }
+ ]
+ },
+ "Privileged": false,
+ "PublishAllPorts": false,
+ "ReadonlyRootfs": false,
+ "RestartPolicy": {
+ "MaximumRetryCount": 0,
+ "Name": ""
+ },
+ "SecurityOpt": null,
+ "Ulimits": null,
+ "VolumesFrom": null
+ },
+ "HostnamePath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hostname",
+ "HostsPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hosts",
+ "Id": "469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1",
+ "Image": "4300417211ebb75b48b06ed5640d641778f312072d24b37978682345cbb362b1",
+ "LogPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log",
+ "MountLabel": "",
+ "Name": "/desperate_babbage",
+ "NetworkSettings": {
+ "Bridge": "docker0",
+ "Gateway": "172.17.42.1",
+ "GlobalIPv6Address": "",
+ "GlobalIPv6PrefixLen": 0,
+ "IPAddress": "172.17.0.2",
+ "IPPrefixLen": 16,
+ "IPv6Gateway": "",
+ "LinkLocalIPv6Address": "fe80::42:acff:fe11:2",
+ "LinkLocalIPv6PrefixLen": 64,
+ "MacAddress": "02:42:ac:11:00:02",
+ "PortMapping": null,
+ "Ports": {
+ "22/tcp": null,
+ "8080/tcp": [
+ {
+ "HostIp": "0.0.0.0",
+ "HostPort": "8080"
+ }
+ ],
+ "8081/tcp": [
+ {
+ "HostIp": "0.0.0.0",
+ "HostPort": "8081"
+ }
+ ]
+ }
+ },
+ "Path": "/bin/sh",
+ "ProcessLabel": "",
+ "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/resolv.conf",
+ "RestartCount": 0,
+ "State": {
+ "Dead": false,
+ "Error": "",
+ "ExitCode": 0,
+ "FinishedAt": "0001-01-01T00:00:00Z",
+ "OOMKilled": false,
+ "Paused": false,
+ "Pid": 898,
+ "Restarting": false,
+ "Running": true,
+ "StartedAt": "2015-04-29T11:55:43.464717907Z"
+ },
+ "Volumes": { "/foo/bar/myvol":"/path1", "/bar/foo/myvol2":"/path2" },
+ "VolumesRW": { "/foo/bar/myvol": true, "/bar/foo/myvol2": false }
+}
+]
From c31c4aceba8a883bb5d11a9e8a78c0f15f87fd65 Mon Sep 17 00:00:00 2001
From: Oleg Nenashev
Date: Thu, 7 May 2015 11:54:20 +0300
Subject: [PATCH 0055/1272] Add missing serializers to resolve
https://github.com/docker-java/docker-java/issues/211
Resolves #211
---
.../dockerjava/api/model/VolumeBinds.java | 17 +++++++++++++++++
.../github/dockerjava/api/model/VolumesRW.java | 18 ++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
index 62ebc1181..e23ddc9e8 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.model;
+import com.fasterxml.jackson.core.JsonGenerator;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
@@ -12,11 +13,15 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.node.NullNode;
// This is not going to be serialized
@JsonDeserialize(using = VolumeBinds.Deserializer.class)
+@JsonSerialize(using = VolumeBinds.Serializer.class)
public class VolumeBinds {
private final VolumeBind[] binds;
@@ -28,6 +33,18 @@ public VolumeBind[] getBinds() {
return binds;
}
+ public static final class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(VolumeBinds value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+ jgen.writeStartObject();
+ for (final VolumeBind bind : value.binds) {
+ jgen.writeStringField(bind.getContainerPath(), bind.getHostPath());
+ }
+ jgen.writeEndObject();
+ }
+ }
+
public static final class Deserializer extends JsonDeserializer {
@Override
public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
index 223f518cf..a898ed57f 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.model;
+import com.fasterxml.jackson.core.JsonGenerator;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
@@ -12,10 +13,14 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.node.NullNode;
// This is not going to be serialized
+@JsonSerialize(using = VolumesRW.Serializer.class)
@JsonDeserialize(using = VolumesRW.Deserializer.class)
public class VolumesRW {
private final VolumeRW[] volumesRW;
@@ -28,6 +33,19 @@ public VolumeRW[] getVolumesRW() {
return volumesRW;
}
+ public static final class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(VolumesRW value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
+ jgen.writeStartObject();
+ for (final VolumeRW volumeRW : value.volumesRW) {
+ jgen.writeBooleanField(volumeRW.getVolume().getPath(), volumeRW.getAccessMode().toBoolean());
+ }
+ jgen.writeEndObject();
+ }
+
+ }
+
public static final class Deserializer extends JsonDeserializer {
@Override
public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
From d6e8be31202830302b1ab5d00b20a6f7e8d73872 Mon Sep 17 00:00:00 2001
From: Oleg Nenashev
Date: Thu, 7 May 2015 12:00:45 +0300
Subject: [PATCH 0056/1272] Add roundtrip spotcheck to InspectExecCmdImplTest
---
.../dockerjava/core/command/InspectExecCmdImplTest.java | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java
index 2deddca09..f1270f4e6 100644
--- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java
@@ -3,8 +3,11 @@
import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.ExecCreateCmdResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.command.InspectExecResponse;
import com.github.dockerjava.client.AbstractDockerClientTest;
+import com.github.dockerjava.test.serdes.JSONTestHelper;
+import java.io.IOException;
import org.testng.ITestResult;
import org.testng.annotations.*;
@@ -41,7 +44,7 @@ public void afterMethod(ITestResult result) {
}
@Test(groups = "ignoreInCircleCi")
- public void inspectExecTest() {
+ public void inspectExecTest() throws IOException {
String containerName = "generated_" + new SecureRandom().nextInt();
CreateContainerResponse container = dockerClient
@@ -93,5 +96,9 @@ public void inspectExecTest() {
InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec();
assertThat(third.getExitCode(), is(0));
+ // Get container info and check its roundtrip to ensure the consistency
+ InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(container.getId()).exec();
+ assertEquals(containerInfo.getId(), container.getId());
+ JSONTestHelper.testRoundTrip(containerInfo);
}
}
From 390b2f9442eee2014fd1b48df8876582dfef4856 Mon Sep 17 00:00:00 2001
From: Xavier Fournet
Date: Sat, 9 May 2015 00:35:59 +0200
Subject: [PATCH 0057/1272] Use a common path relativize method to fix
testDockerIgnore and testNonstandard2 * testDockerIgnore was failing if your
source checkout directory contains a 'b' char. stripStart function was
misused here * testNonstandard2 was failing on Windows * other usage of
relativize has been changed to this relativize method (extract from
CompressArchiveUtil)
---
.../dockerjava/core/CompressArchiveUtil.java | 9 +++----
.../github/dockerjava/core/FilePathUtil.java | 24 +++++++++++++++++++
.../core/GoLangMatchFileFilter.java | 5 +---
.../core/command/BuildImageCmdImpl.java | 5 ++--
.../core/dockerfile/Dockerfile.java | 5 ++--
5 files changed, 32 insertions(+), 16 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/core/FilePathUtil.java
diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
index f07fa1b25..297adc766 100644
--- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
+++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
@@ -6,6 +6,8 @@
import java.io.*;
+import static com.github.dockerjava.core.FilePathUtil.relativize;
+
public class CompressArchiveUtil {
public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException {
@@ -15,7 +17,7 @@ public static File archiveTARFiles(File base, Iterable files, String archi
tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
for (File file : files) {
TarArchiveEntry tarEntry = new TarArchiveEntry(file);
- tarEntry.setName(relativize(base.getCanonicalFile(), file.getCanonicalFile()));
+ tarEntry.setName(relativize(base, file));
if (!file.isDirectory()) {
if (file.canExecute()) {
@@ -36,9 +38,4 @@ public static File archiveTARFiles(File base, Iterable files, String archi
return tarFile;
}
-
- public static String relativize(File base, File absolute) {
- String relative = base.toURI().relativize(absolute.toURI()).getPath();
- return relative;
- }
}
diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java
new file mode 100644
index 000000000..3fc910217
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java
@@ -0,0 +1,24 @@
+package com.github.dockerjava.core;
+
+import java.io.*;
+import com.github.dockerjava.api.DockerClientException;
+
+public class FilePathUtil {
+
+ /**
+ * Return the relative path. Path elements are separated with / char.
+ * @param baseDir a parent directory of {@code file}
+ * @param file the file to get the relative path
+ * @return the relative path
+ */
+ public static String relativize(File baseDir, File file) {
+ try {
+ baseDir = baseDir.getCanonicalFile();
+ file = file.getCanonicalFile();
+
+ return baseDir.toURI().relativize(file.toURI()).getPath();
+ } catch (IOException e) {
+ throw new DockerClientException(e.getMessage(), e);
+ }
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java
index aa88287b4..33e0f2a47 100644
--- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java
+++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java
@@ -3,8 +3,6 @@
*/
package com.github.dockerjava.core;
-import static org.apache.commons.lang.StringUtils.stripStart;
-
import java.io.File;
import java.util.List;
@@ -25,8 +23,7 @@ public GoLangMatchFileFilter(File base, List patterns) {
@Override
public boolean accept(File file) {
- String basePath = base.getAbsolutePath() + File.separatorChar;
- String relativePath = stripStart(file.getAbsolutePath(), basePath);
+ String relativePath = FilePathUtil.relativize(base, file);
boolean match = GoLangFileMatch.match(patterns, relativePath);
return !match;
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
index 046565d3f..dbccda5fc 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
@@ -8,8 +8,8 @@
import com.github.dockerjava.api.command.BuildImageCmd;
import com.github.dockerjava.api.model.AuthConfigurations;
+import com.github.dockerjava.core.FilePathUtil;
import com.github.dockerjava.core.dockerfile.Dockerfile;
-import com.google.common.base.Optional;
/**
*
@@ -125,8 +125,7 @@ public boolean hasPullEnabled() {
@Override
public String getPathToDockerfile() {
- int baseLen = baseDirectory.getAbsolutePath().length();
- return dockerFile.getAbsolutePath().substring(baseLen+1);
+ return FilePathUtil.relativize(baseDirectory, dockerFile);
}
@Override
diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
index 21d938ffd..f5b25f2b3 100644
--- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
+++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
@@ -2,6 +2,7 @@
import com.github.dockerjava.api.DockerClientException;
import com.github.dockerjava.core.CompressArchiveUtil;
+import com.github.dockerjava.core.FilePathUtil;
import com.github.dockerjava.core.GoLangFileMatch;
import com.github.dockerjava.core.GoLangFileMatchException;
import com.github.dockerjava.core.GoLangMatchFileFilter;
@@ -23,7 +24,6 @@
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
/**
@@ -209,8 +209,7 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException
} else if (!src.exists()) {
filesToAdd.addAll(resolveWildcards(src, ignores));
} else if (!GoLangFileMatch.match(ignores,
- CompressArchiveUtil.relativize(dockerFolder,
- src))) {
+ FilePathUtil.relativize(dockerFolder, src))) {
filesToAdd.add(src);
} else {
throw new DockerClientException(
From 3bdb89994e7fe35b532ef26efd16ff9f00faac0a Mon Sep 17 00:00:00 2001
From: Xavier Fournet
Date: Sat, 9 May 2015 01:18:44 +0200
Subject: [PATCH 0058/1272] Fix testDockerBuilderAddFilesViaWildcard on Windows
However i'm quite skeptical on the Dockerfile.resolveWildcards method
---
.../core/dockerfile/Dockerfile.java | 32 +++++++------------
1 file changed, 12 insertions(+), 20 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
index f5b25f2b3..802299a7c 100644
--- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
+++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
@@ -189,33 +189,25 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException
File src = new File(resource);
if (!src.isAbsolute()) {
- src = new File(dockerFolder, resource)
- .getCanonicalFile();
+ src = new File(dockerFolder, resource);
} else {
throw new DockerClientException(String.format(
"Source file %s must be relative to %s",
src, dockerFolder));
}
- // if (!src.exists()) {
- // throw new DockerClientException(String.format(
- // "Source file %s doesn't exist", src));
- // }
- if (src.isDirectory()) {
- Collection files = FileUtils.listFiles(src,
- new GoLangMatchFileFilter(src, ignores),
- TrueFileFilter.INSTANCE);
- filesToAdd.addAll(files);
- } else if (!src.exists()) {
- filesToAdd.addAll(resolveWildcards(src, ignores));
- } else if (!GoLangFileMatch.match(ignores,
- FilePathUtil.relativize(dockerFolder, src))) {
- filesToAdd.add(src);
+ if (src.exists()) {
+ src = src.getCanonicalFile();
+ if (src.isDirectory()) {
+ Collection files = FileUtils.listFiles(src, new GoLangMatchFileFilter(src, ignores), TrueFileFilter.INSTANCE);
+ filesToAdd.addAll(files);
+ } else if (!GoLangFileMatch.match(ignores, FilePathUtil.relativize(dockerFolder, src))) {
+ filesToAdd.add(src);
+ } else {
+ throw new DockerClientException(String.format("Source file %s is excluded by .dockerignore file", src));
+ }
} else {
- throw new DockerClientException(
- String.format(
- "Source file %s is excluded by .dockerignore file",
- src));
+ filesToAdd.addAll(resolveWildcards(src, ignores));
}
}
}
From 0e52d21471f82368b1ad950e6e49916fc133c8b3 Mon Sep 17 00:00:00 2001
From: Xavier Fournet
Date: Sat, 9 May 2015 01:27:44 +0200
Subject: [PATCH 0059/1272] Fix canCloseFrameReaderAndReadExpectedLines test on
Windows
---
.../github/dockerjava/core/command/FrameReaderITest.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
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 0cf08e953..0c22fc085 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -38,8 +38,8 @@ public void deleteDockerContainerImage() throws Exception {
public void canCloseFrameReaderAndReadExpectedLines() throws Exception {
try (FrameReader reader = new FrameReader(getLoggerStream())) {
- assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes()));
- assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes()));
+ 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());
}
}
@@ -83,4 +83,4 @@ public void run() {
thread.join();
}
-}
\ No newline at end of file
+}
From d61b7c4af08cfcc9bbdc59e450345673dada35dc Mon Sep 17 00:00:00 2001
From: Xavier Fournet
Date: Sat, 9 May 2015 12:54:10 +0200
Subject: [PATCH 0060/1272] Fix regression when building an image from a TAR
input stream
---
.../core/command/BuildImageCmdImpl.java | 6 +-
.../core/command/BuildImageCmdImplTest.java | 63 ++++++++++++-------
2 files changed, 45 insertions(+), 24 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
index dbccda5fc..ef0242857 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
@@ -125,7 +125,11 @@ public boolean hasPullEnabled() {
@Override
public String getPathToDockerfile() {
- return FilePathUtil.relativize(baseDirectory, dockerFile);
+ if (baseDirectory != null && dockerFile != null) {
+ return FilePathUtil.relativize(baseDirectory, dockerFile);
+ } else {
+ return null;
+ }
}
@Override
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 bd8a56d2d..c9bd51b90 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -9,10 +9,15 @@
import static org.hamcrest.Matchers.nullValue;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.UUID;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang.StringUtils;
import org.testng.ITestResult;
@@ -24,12 +29,13 @@
import com.github.dockerjava.api.DockerClientException;
import com.github.dockerjava.api.DockerException;
+import com.github.dockerjava.api.command.BuildImageCmd;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.command.InspectImageResponse;
import com.github.dockerjava.api.model.EventStreamItem;
import com.github.dockerjava.client.AbstractDockerClientTest;
-
+import com.github.dockerjava.core.CompressArchiveUtil;
@Test(groups = "integration")
public class BuildImageCmdImplTest extends AbstractDockerClientTest {
@@ -105,7 +111,16 @@ public void testNonstandard2() {
assertThat(fullLog, containsString("Successfully built"));
}
- @Test
+ @Test
+ public void testDockerBuilderFromTar() throws IOException {
+ 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());
+ String response = dockerfileBuild(new FileInputStream(tarFile));
+ assertThat(response, containsString("Successfully executed testrun.sh"));
+ }
+
+ @Test
public void testDockerBuilderAddUrl() {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
.getResource("testAddUrl").getFile());
@@ -150,37 +165,39 @@ public void testDockerBuilderEnv() throws DockerException,
assertThat(response, containsString("Successfully executed testrun.sh"));
}
+ private String dockerfileBuild(InputStream tarInputStream) {
+ return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream));
+ }
- private String dockerfileBuild(File baseDir) {
-
- // Build image
- InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec();
+ private String dockerfileBuild(File baseDir) {
+ return execBuild(dockerClient.buildImageCmd(baseDir));
+ }
- String fullLog = asString(response);
- assertThat(fullLog, containsString("Successfully built"));
+ private String execBuild(BuildImageCmd buildImageCmd) {
+ // Build image
+ InputStream response = buildImageCmd.withNoCache().exec();
- String imageId = StringUtils.substringBetween(fullLog,
- "Successfully built ", "\\n\"}").trim();
+ String fullLog = asString(response);
+ assertThat(fullLog, containsString("Successfully built"));
- // Create container based on image
- CreateContainerResponse container = dockerClient.createContainerCmd(
- imageId).exec();
+ String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim();
- LOG.info("Created container: {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ // Create container based on image
+ CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec();
- dockerClient.startContainerCmd(container.getId()).exec();
- dockerClient.waitContainerCmd(container.getId()).exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- // Log container
- InputStream logResponse = logContainer(container
- .getId());
+ dockerClient.startContainerCmd(container.getId()).exec();
+ dockerClient.waitContainerCmd(container.getId()).exec();
- //assertThat(asString(logResponse), containsString(expectedText));
+ // Log container
+ InputStream logResponse = logContainer(container.getId());
- return asString(logResponse);
- }
+ //assertThat(asString(logResponse), containsString(expectedText));
+ return asString(logResponse);
+ }
private InputStream logContainer(String containerId) {
return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec();
From 5ee09ba4ae06a90761c7027477cef433a4ca45ce Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 18:33:03 +0200
Subject: [PATCH 0061/1272] Fix issue #201
---
.../java/com/github/dockerjava/jaxrs/EventsCmdExec.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index 78d26fead..32ab45f2a 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -70,7 +70,11 @@ public Void call() throws Exception {
InputStream inputStream = new WrappedResponseInputStream(response);
JsonParser jp = JSON_FACTORY.createParser(inputStream);
while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) {
- eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
+ try {
+ eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
+ } catch(Exception e) {
+ eventCallback.onException(e);
+ }
numEvents++;
}
}
From 72a61dd7834367e99524e5a91a47397d8970b0d7 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 18:33:29 +0200
Subject: [PATCH 0062/1272] Fix test expectation
---
.../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
index dfc330d9e..7d4f9d4ef 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
@@ -42,7 +42,7 @@ public void pullCanBeStreamed() throws Exception {
) {;
assertThat(reader.readItem(),
allOf(
- hasProperty("status", equalTo("Pulling repository busybox")),
+ hasProperty("status", equalTo("Pulling from busybox")),
hasProperty("progress", nullValue()),
hasProperty("progressDetail", nullValue())
)
From 355e649b66b5792bb8401fabf2b6743040ebf99d Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 18:37:33 +0200
Subject: [PATCH 0063/1272] Call onCompletetion callback before close because
of https://github.com/docker-java/docker-java/issues/196
---
.../dockerjava/jaxrs/EventsCmdExec.java | 148 ++++++++++--------
1 file changed, 80 insertions(+), 68 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index 32ab45f2a..924fdaedd 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -22,72 +22,84 @@
import com.github.dockerjava.api.model.Event;
import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
-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 ExecutorService execute(EventsCmd command) {
- ExecutorService executorService = Executors.newSingleThreadExecutor();
-
- WebTarget webResource = getBaseResource().path("/events")
- .queryParam("since", command.getSince())
- .queryParam("until", command.getUntil());
-
- LOGGER.trace("GET: {}", webResource);
- EventNotifier eventNotifier = EventNotifier.create(command.getEventCallback(), webResource);
- executorService.submit(eventNotifier);
- return executorService;
- }
-
- private static class EventNotifier implements Callable {
- private static final JsonFactory JSON_FACTORY = new JsonFactory();
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
- private final EventCallback eventCallback;
- private final WebTarget webTarget;
-
- private EventNotifier(EventCallback eventCallback, WebTarget webTarget) {
- this.eventCallback = eventCallback;
- this.webTarget = webTarget;
- }
-
- public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) {
- checkNotNull(eventCallback, "An EventCallback must be provided");
- checkNotNull(webTarget, "An WebTarget must be provided");
- return new EventNotifier(eventCallback, webTarget);
- }
-
- @Override
- public Void call() throws Exception {
- int numEvents=0;
- Response response = null;
- try {
- response = webTarget.request().get(Response.class);
- InputStream inputStream = new WrappedResponseInputStream(response);
- JsonParser jp = JSON_FACTORY.createParser(inputStream);
- while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) {
- try {
- eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
- } catch(Exception e) {
- eventCallback.onException(e);
- }
- numEvents++;
- }
- }
- catch(Exception e) {
- eventCallback.onException(e);
- }
- finally {
- if (response != null) {
- response.close();
- }
- }
- eventCallback.onCompletion(numEvents);
- return null;
- }
- }
+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 ExecutorService execute(EventsCmd command) {
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+
+ WebTarget webResource = getBaseResource().path("/events")
+ .queryParam("since", command.getSince())
+ .queryParam("until", command.getUntil());
+
+ LOGGER.trace("GET: {}", webResource);
+ EventNotifier eventNotifier = EventNotifier.create(
+ command.getEventCallback(), webResource);
+ executorService.submit(eventNotifier);
+ return executorService;
+ }
+
+ private static class EventNotifier implements Callable {
+ private static final JsonFactory JSON_FACTORY = new JsonFactory();
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private final EventCallback eventCallback;
+ private final WebTarget webTarget;
+
+ private EventNotifier(EventCallback eventCallback, WebTarget webTarget) {
+ this.eventCallback = eventCallback;
+ this.webTarget = webTarget;
+ }
+
+ public static EventNotifier create(EventCallback eventCallback,
+ WebTarget webTarget) {
+ checkNotNull(eventCallback, "An EventCallback must be provided");
+ checkNotNull(webTarget, "An WebTarget must be provided");
+ return new EventNotifier(eventCallback, webTarget);
+ }
+
+ @Override
+ public Void call() throws Exception {
+ int numEvents = 0;
+ Response response = null;
+ try {
+ response = webTarget.request().get(Response.class);
+ InputStream inputStream = new WrappedResponseInputStream(
+ response);
+ JsonParser jp = JSON_FACTORY.createParser(inputStream);
+ while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()
+ && eventCallback.isReceiving()) {
+ try {
+ eventCallback.onEvent(OBJECT_MAPPER.readValue(jp,
+ Event.class));
+ } catch (Exception e) {
+ eventCallback.onException(e);
+ }
+ numEvents++;
+ }
+ } catch (Exception e) {
+ eventCallback.onException(e);
+ } finally {
+ // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196
+ try {
+ eventCallback.onCompletion(numEvents);
+ } catch (Exception e) {
+ eventCallback.onException(e);
+ }
+ if (response != null) {
+ response.close();
+ }
+ }
+
+ return null;
+ }
+ }
}
From 1d52a47266e78db5769b61bcd6e3612c655b8869 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 19:21:05 +0200
Subject: [PATCH 0064/1272] Fix issue #214
---
.../java/com/github/dockerjava/api/model/ContainerConfig.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
index dcb1256b0..ce8c6b88f 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
@@ -64,7 +64,7 @@ public class ContainerConfig {
private boolean networkDisabled = false;
@JsonProperty("OnBuild")
- private int[] onBuild;
+ private String[] onBuild;
@JsonProperty("OpenStdin")
private boolean stdinOpen = false;
@@ -180,7 +180,7 @@ public String[] getEntrypoint() {
return entrypoint;
}
- public int[] getOnBuild() {
+ public String[] getOnBuild() {
return onBuild;
}
From 8652329036eeb5ac583584b27a04c4261aca7b8e Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 10 May 2015 19:22:32 +0200
Subject: [PATCH 0065/1272] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e6fca225d..3d3cb24d7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@ Change Log
===
Latest SNAPSHOT
---
+* [#213](https://github.com/docker-java/docker-java/pull/213) Add ulimit support
* [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events
* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized
* [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build
From 5e268e50343dfebf461b1e71dec8600881c9c3de Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 10 May 2015 19:23:04 +0200
Subject: [PATCH 0066/1272] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index bbafd8a6a..6516793d2 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
Java API client for [Docker](http://docs.docker.io/ "Docker")
-Supports a subset of the Docker Client API v1.17, Docker Server version 1.5.0
+Supports a subset of the Docker Client API v1.18, Docker Server version 1.6.0
The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries!
From 9954713fbbae4828bc0aea3e154ca8a8b7dec810 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 20:07:36 +0200
Subject: [PATCH 0067/1272] Exclude from CircleCI integration tests
---
.../dockerjava/core/command/CreateContainerCmdImplTest.java | 3 ++-
.../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
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 c37f48484..c652f51d7 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -6,6 +6,7 @@
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.*;
import com.github.dockerjava.client.AbstractDockerClientTest;
+
import org.testng.ITestResult;
import org.testng.annotations.*;
@@ -540,7 +541,7 @@ public void createContainerWithMacAddress() throws DockerException {
"00:80:41:ae:fd:7e");
}
- @Test
+ @Test(groups = "ignoreInCircleCi")
public void createContainerWithULimits() throws DockerException {
Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)};
diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
index 7d4f9d4ef..07bca25b5 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java
@@ -33,7 +33,7 @@ public void tearDown() throws Exception {
dockerClient.close();
}
- @Test
+ @Test(groups = "ignoreInCircleCi")
public void pullCanBeStreamed() throws Exception {
try (EventStreamReader reader = new EventStreamReader<>(
From ebcb85c15ba72278b3dae6c425e0804374767e9b Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 20:09:54 +0200
Subject: [PATCH 0068/1272] Set new semver version
---
README.md | 2 +-
pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 6516793d2..9584fdcb6 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [
com.github.docker-java
docker-java
- 1.2.1-SNAPSHOT
+ 1.3.0-SNAPSHOT
## Documentation
diff --git a/pom.xml b/pom.xml
index 1279f9c11..d9aa194da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.2.1-SNAPSHOT
+ 1.3.0-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
From 3a0e734148b6786c1fde4021fe1db6b3ba5cb8fe Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 20:52:29 +0200
Subject: [PATCH 0069/1272] [maven-release-plugin] prepare release
docker-java-1.3.0
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index d9aa194da..0b28d5dd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.3.0-SNAPSHOT
+ 1.3.0
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ docker-java-1.3.0
From f4f8b5616c28688dbb97fa494df47b91b4738525 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 10 May 2015 20:52:32 +0200
Subject: [PATCH 0070/1272] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0b28d5dd6..f8eb34ced 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-java
docker-java
jar
- 1.3.0
+ 1.3.1-SNAPSHOT
docker-java
https://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.git
git@github.com:docker-java/docker-java.git
scm:git:git@github.com:docker-java/docker-java.git
- docker-java-1.3.0
+ HEAD
From 9daa3733233c2733fce2599ff884c1e091cb4993 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 10 May 2015 20:56:21 +0200
Subject: [PATCH 0071/1272] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d3cb24d7..ea3118178 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
Latest SNAPSHOT
---
+
+v1.3.0
+---
* [#213](https://github.com/docker-java/docker-java/pull/213) Add ulimit support
* [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events
* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized
From c5ba01b72951096a4c8088a96eedc1a4697da7cb Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sun, 10 May 2015 20:56:47 +0200
Subject: [PATCH 0072/1272] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 9584fdcb6..4c77e896c 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@ Run build without integration tests:
com.github.docker-java
docker-java
- 1.2.0
+ 1.3.0
### Latest SNAPSHOT version
@@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [
com.github.docker-java
docker-java
- 1.3.0-SNAPSHOT
+ 1.3.1-SNAPSHOT
## Documentation
From e34638a9b38a29eca8242e0aaa910b09d9f019ec Mon Sep 17 00:00:00 2001
From: James Nord
Date: Wed, 13 May 2015 10:52:45 +0100
Subject: [PATCH 0073/1272] Do not wait for another event before exiting.
It the callback decideds it is no longer interested in receiving events
whilst it handles either an event or an exception then it should not have to
wait until the next event from Docker is received to exit the loop.
This adds a check before the event is received and leaves the check after
the event has received as the event may take a long time to come and the
callback may have decided during that time that it wants to shutdown.
---
.../java/com/github/dockerjava/jaxrs/EventsCmdExec.java | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index 924fdaedd..db14ab21b 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -75,8 +75,13 @@ public Void call() throws Exception {
InputStream inputStream = new WrappedResponseInputStream(
response);
JsonParser jp = JSON_FACTORY.createParser(inputStream);
- while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()
- && eventCallback.isReceiving()) {
+ // The following condition looks strange but jp.nextToken() will block until there is an
+ // event from the docker server or the connection is terminated.
+ // therefore we want to check before getting an event (to prevent a blocking operation
+ // and after the event to make sure that the eventCallback is still interested in getting notified.
+ while (eventCallback.isReceiving() &&
+ jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() &&
+ eventCallback.isReceiving()) {
try {
eventCallback.onEvent(OBJECT_MAPPER.readValue(jp,
Event.class));
From a9b92e383c600cafc03d24b811b7176cb7982ff3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 14 May 2015 19:57:01 +0200
Subject: [PATCH 0074/1272] Fix roundtrip test
---
.../dockerjava/test/serdes/JSONTestHelper.java | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
index b465b2aac..b6a33b722 100644
--- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
+++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java
@@ -15,11 +15,15 @@
*/
package com.github.dockerjava.test.serdes;
+import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.command.CommandJSONSamples;
+
import java.io.IOException;
import java.io.InputStream;
+
import org.apache.commons.io.IOUtils;
+
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
@@ -101,10 +105,14 @@ public static TClass testRoundTrip(TClass item, Class asclass)
throws IOException, AssertionError {
ObjectMapper mapper = new ObjectMapper();
- String inputItemString = mapper.writeValueAsString(item);
- TClass convertedItem = mapper.readValue(inputItemString, asclass);
- String convertedItemString = mapper.writeValueAsString(convertedItem);
- assertEquals(convertedItemString, inputItemString, "JSONs must be equal after the second roundtrip");
- return convertedItem;
+ String serialized1 = mapper.writeValueAsString(item);
+ JsonNode json1 = mapper.readTree(serialized1);
+ TClass deserialized1 = mapper.readValue(serialized1, asclass);
+ String serialized2 = mapper.writeValueAsString(deserialized1);
+ JsonNode json2 = mapper.readTree(serialized2);
+ TClass deserialized2 = mapper.readValue(serialized2, asclass);
+
+ assertEquals(json2, json1, "JSONs must be equal after the second roundtrip");
+ return deserialized2;
}
}
From a072d62104d03d53cf2f9a41b95fd527fb6acbb9 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 14 May 2015 20:58:49 +0200
Subject: [PATCH 0075/1272] Workaround for issue #196
---
.../jaxrs/DockerCmdExecFactoryImpl.java | 5 +-
.../jaxrs/connector/ApacheConnector.java | 698 ++++++++++++++++++
.../ApacheConnectorClientResponse.java | 52 ++
.../connector/ApacheConnectorProvider.java | 151 ++++
.../dockerjava/jaxrs/connector/README.txt | 3 +
.../core/command/EventsCmdImplTest.java | 34 +-
6 files changed, 939 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/README.txt
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index bc3afecad..3636bfd06 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -22,7 +22,9 @@
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+// see https://github.com/docker-java/docker-java/issues/196
+import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
@@ -34,6 +36,7 @@
import com.github.dockerjava.core.util.ResponseStatusExceptionFilter;
import com.github.dockerjava.core.util.SelectiveLoggingFilter;
+
public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory {
private static final Logger LOGGER = LoggerFactory
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
new file mode 100644
index 000000000..651db983d
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
@@ -0,0 +1,698 @@
+package com.github.dockerjava.jaxrs.connector;
+
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2010-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common Development
+ * and Distribution License("CDDL") (collectively, the "License"). You
+ * may not use this file except in compliance with the License. You can
+ * obtain a copy of the License at
+ * http://glassfish.java.net/public/CDDL+GPL_1_1.html
+ * or packager/legal/LICENSE.txt. See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ * When distributing the software, include this License Header Notice in each
+ * file and include the License file at packager/legal/LICENSE.txt.
+ *
+ * GPL Classpath Exception:
+ * Oracle designates this particular file as subject to the "Classpath"
+ * exception as provided by Oracle in the GPL Version 2 section of the License
+ * file that accompanied this code.
+ *
+ * Modifications:
+ * If applicable, add the following below the License Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyright [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ * If you wish your version of this file to be governed by only the CDDL or
+ * only the GPL Version 2, indicate your decision by adding "[Contributor]
+ * elects to include this software in this distribution under the [CDDL or GPL
+ * Version 2] license." If you don't indicate a single choice of license, a
+ * recipient has the option to distribute your version of this file under
+ * either the CDDL, the GPL Version 2 or to extend the choice of license to
+ * its licensees as provided above. However, if you add GPL Version 2 code
+ * and therefore, elected the GPL Version 2 license, then the option applies
+ * only if the new code is made subject to such option by the copyright
+ * holder.
+ */
+
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.core.Configuration;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+
+import org.glassfish.jersey.SslConfigurator;
+import org.glassfish.jersey.apache.connector.ApacheClientProperties;
+import org.glassfish.jersey.apache.connector.LocalizationMessages;
+import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.ClientRequest;
+import org.glassfish.jersey.client.ClientResponse;
+import org.glassfish.jersey.client.RequestEntityProcessing;
+import org.glassfish.jersey.client.spi.AsyncConnectorCallback;
+import org.glassfish.jersey.client.spi.Connector;
+import org.glassfish.jersey.internal.util.PropertiesHelper;
+import org.glassfish.jersey.message.internal.HeaderUtils;
+import org.glassfish.jersey.message.internal.OutboundMessageContext;
+import org.glassfish.jersey.message.internal.ReaderWriter;
+import org.glassfish.jersey.message.internal.Statuses;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.CookieStore;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.CookieSpecs;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.config.ConnectionConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.HttpClientConnectionManager;
+import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContexts;
+import org.apache.http.conn.ssl.X509HostnameVerifier;
+import org.apache.http.entity.AbstractHttpEntity;
+import org.apache.http.entity.BufferedHttpEntity;
+import org.apache.http.entity.ContentLengthStrategy;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.DefaultManagedHttpClientConnection;
+import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.io.ChunkedOutputStream;
+import org.apache.http.io.SessionOutputBuffer;
+import org.apache.http.util.TextUtils;
+import org.apache.http.util.VersionInfo;
+
+import jersey.repackaged.com.google.common.util.concurrent.MoreExecutors;
+
+/**
+ * A {@link Connector} that utilizes the Apache HTTP Client to send and receive
+ * HTTP request and responses.
+ *
+ * The following properties are only supported at construction of this class:
+ *
+ * - {@link ApacheClientProperties#CONNECTION_MANAGER}
+ * - {@link ApacheClientProperties#REQUEST_CONFIG}
+ * - {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
+ * - {@link ApacheClientProperties#DISABLE_COOKIES}
+ * - {@link ClientProperties#PROXY_URI}
+ * - {@link ClientProperties#PROXY_USERNAME}
+ * - {@link ClientProperties#PROXY_PASSWORD}
+ * - {@link ClientProperties#REQUEST_ENTITY_PROCESSING} - default value is {@link RequestEntityProcessing#CHUNKED}
+ * - {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
+ * - {@link ApacheClientProperties#SSL_CONFIG}
+ *
+ *
+ * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can
+ * be overridden by the {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the
+ * {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported by using default connection manager. If custom
+ * connection manager needs to be used then chunked encoding size can be set by providing a custom
+ * {@link org.apache.http.HttpClientConnection} (via custom {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory})
+ * and overriding {@code createOutputStream} method.
+ *
+ *
+ * Using of authorization is dependent on the chunk encoding setting. If the entity
+ * buffering is enabled, the entity is buffered and authorization can be performed
+ * automatically in response to a 401 by sending the request again. When entity buffering
+ * is disabled (chunked encoding is used) then the property
+ * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must
+ * be set to {@code true}.
+ *
+ *
+ * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an
+ * entity is not read from the response then
+ * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called
+ * after processing the response to release connection-based resources.
+ *
+ *
+ * Client operations are thread safe, the HTTP connection may
+ * be shared between different threads.
+ *
+ *
+ * If a response entity is obtained that is an instance of {@link Closeable}
+ * then the instance MUST be closed after processing the entity to release
+ * connection-based resources.
+ *
+ *
+ * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
+ *
+ *
+ * @author jorgeluisw@mac.com
+ * @author Paul Sandoz (paul.sandoz at oracle.com)
+ * @author Pavel Bucek (pavel.bucek at oracle.com)
+ * @author Arul Dhesiaseelan (aruld at acm.org)
+ * @see ApacheClientProperties#CONNECTION_MANAGER
+ */
+@SuppressWarnings("deprecation")
+class ApacheConnector implements Connector {
+
+ private final static Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName());
+
+ private static final VersionInfo vi;
+ private static final String release;
+
+ static {
+ vi = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader());
+ release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE;
+ }
+
+ private final CloseableHttpClient client;
+ private final CookieStore cookieStore;
+ private final boolean preemptiveBasicAuth;
+ private final RequestConfig requestConfig;
+
+ /**
+ * Create the new Apache HTTP Client connector.
+ *
+ * @param config client configuration.
+ */
+ ApacheConnector(Configuration config) {
+ Object reqConfig = null;
+
+ if (config != null) {
+ final Object connectionManager = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER);
+
+ if (connectionManager != null) {
+ if (!(connectionManager instanceof HttpClientConnectionManager)) {
+ LOGGER.log(
+ Level.WARNING,
+ LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
+ ApacheClientProperties.CONNECTION_MANAGER,
+ connectionManager.getClass().getName(),
+ HttpClientConnectionManager.class.getName())
+ );
+ }
+ }
+
+ reqConfig = config.getProperties().get(ApacheClientProperties.REQUEST_CONFIG);
+ if (reqConfig != null) {
+ if (!(reqConfig instanceof RequestConfig)) {
+ LOGGER.log(
+ Level.WARNING,
+ LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
+ ApacheClientProperties.REQUEST_CONFIG,
+ reqConfig.getClass().getName(),
+ RequestConfig.class.getName())
+ );
+ reqConfig = null;
+ }
+ }
+ }
+
+ final SSLContext sslContext = getSslContext(config);
+ final HttpClientBuilder clientBuilder = HttpClientBuilder.create();
+
+ clientBuilder.setConnectionManager(getConnectionManager(config, sslContext));
+ clientBuilder.setSslcontext(sslContext);
+
+ final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
+
+ int connectTimeout = 0;
+ int socketTimeout = 0;
+ boolean ignoreCookies = false;
+ if (config != null) {
+ connectTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.CONNECT_TIMEOUT, 0);
+ socketTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.READ_TIMEOUT, 0);
+ ignoreCookies = PropertiesHelper.isProperty(config.getProperties(), ApacheClientProperties.DISABLE_COOKIES);
+
+ final Object credentialsProvider = config.getProperty(ApacheClientProperties.CREDENTIALS_PROVIDER);
+ if (credentialsProvider != null && (credentialsProvider instanceof CredentialsProvider)) {
+ clientBuilder.setDefaultCredentialsProvider((CredentialsProvider) credentialsProvider);
+ }
+
+ Object proxyUri;
+ proxyUri = config.getProperty(ClientProperties.PROXY_URI);
+ if (proxyUri != null) {
+ final URI u = getProxyUri(proxyUri);
+ final HttpHost proxy = new HttpHost(u.getHost(), u.getPort(), u.getScheme());
+ String userName;
+ userName = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_USERNAME, String.class);
+ if (userName != null) {
+ String password;
+ password = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_PASSWORD, String.class);
+
+ if (password != null) {
+ final CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(
+ new AuthScope(u.getHost(), u.getPort()),
+ new UsernamePasswordCredentials(userName, password)
+ );
+ clientBuilder.setDefaultCredentialsProvider(credsProvider);
+ }
+ }
+ clientBuilder.setProxy(proxy);
+ }
+
+ final Boolean preemptiveBasicAuthProperty = (Boolean) config.getProperties()
+ .get(ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION);
+ this.preemptiveBasicAuth = (preemptiveBasicAuthProperty != null) ? preemptiveBasicAuthProperty : false;
+ } else {
+ this.preemptiveBasicAuth = false;
+ }
+
+
+ if (reqConfig != null) {
+ RequestConfig.Builder reqConfigBuilder = RequestConfig.copy((RequestConfig) reqConfig);
+ if (connectTimeout > 0) {
+ reqConfigBuilder.setConnectTimeout(connectTimeout);
+ }
+ if (socketTimeout > 0) {
+ reqConfigBuilder.setSocketTimeout(socketTimeout);
+ }
+ if (ignoreCookies) {
+ reqConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES);
+ }
+ requestConfig = reqConfigBuilder.build();
+ } else {
+ requestConfigBuilder.setConnectTimeout(connectTimeout);
+ requestConfigBuilder.setSocketTimeout(socketTimeout);
+ if (ignoreCookies) {
+ requestConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES);
+ }
+ requestConfig = requestConfigBuilder.build();
+ }
+
+ if (requestConfig.getCookieSpec() == null || !requestConfig.getCookieSpec().equals(CookieSpecs.IGNORE_COOKIES)) {
+ this.cookieStore = new BasicCookieStore();
+ clientBuilder.setDefaultCookieStore(cookieStore);
+ } else {
+ this.cookieStore = null;
+ }
+ clientBuilder.setDefaultRequestConfig(requestConfig);
+ this.client = clientBuilder.build();
+ }
+
+ private SSLContext getSslContext(final Configuration config) {
+ final SslConfigurator sslConfigurator = ApacheClientProperties.getValue(
+ config.getProperties(),
+ ApacheClientProperties.SSL_CONFIG,
+ SslConfigurator.class);
+
+ return sslConfigurator != null ? sslConfigurator.createSSLContext() : null;
+ }
+
+ HttpClientConnectionManager getConnectionManager(final Configuration config, final SSLContext sslContext) {
+ final Object cmObject = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER);
+
+ // Connection manager from configuration.
+ if (cmObject != null) {
+ if (cmObject instanceof HttpClientConnectionManager) {
+ return (HttpClientConnectionManager) cmObject;
+ } else {
+ LOGGER.log(
+ Level.WARNING,
+ LocalizationMessages.IGNORING_VALUE_OF_PROPERTY(
+ ApacheClientProperties.CONNECTION_MANAGER,
+ cmObject.getClass().getName(),
+ HttpClientConnectionManager.class.getName())
+ );
+ }
+ }
+
+ // Create custom connection manager.
+ return createConnectionManager(
+ config,
+ sslContext,
+ null,
+ false);
+ }
+
+ private HttpClientConnectionManager createConnectionManager(
+ final Configuration config,
+ final SSLContext sslContext,
+ X509HostnameVerifier hostnameVerifier,
+ final boolean useSystemProperties) {
+
+ final String[] supportedProtocols = useSystemProperties ? split(
+ System.getProperty("https.protocols")) : null;
+ final String[] supportedCipherSuites = useSystemProperties ? split(
+ System.getProperty("https.cipherSuites")) : null;
+
+ if (hostnameVerifier == null) {
+ hostnameVerifier = SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
+ }
+
+ final LayeredConnectionSocketFactory sslSocketFactory;
+ if (sslContext != null) {
+ sslSocketFactory = new SSLConnectionSocketFactory(
+ sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier);
+ } else {
+ if (useSystemProperties) {
+ sslSocketFactory = new SSLConnectionSocketFactory(
+ (SSLSocketFactory) SSLSocketFactory.getDefault(),
+ supportedProtocols, supportedCipherSuites, hostnameVerifier);
+ } else {
+ sslSocketFactory = new SSLConnectionSocketFactory(
+ SSLContexts.createDefault(),
+ hostnameVerifier);
+ }
+ }
+
+ final Registry registry = RegistryBuilder.create()
+ .register("http", PlainConnectionSocketFactory.getSocketFactory())
+ .register("https", sslSocketFactory)
+ .build();
+
+ final Integer chunkSize = ClientProperties.getValue(config.getProperties(),
+ ClientProperties.CHUNKED_ENCODING_SIZE, 4096, Integer.class);
+
+ final PoolingHttpClientConnectionManager connectionManager =
+ new PoolingHttpClientConnectionManager(registry, new ConnectionFactory(chunkSize));
+
+ if (useSystemProperties) {
+ String s = System.getProperty("http.keepAlive", "true");
+ if ("true".equalsIgnoreCase(s)) {
+ s = System.getProperty("http.maxConnections", "5");
+ final int max = Integer.parseInt(s);
+ connectionManager.setDefaultMaxPerRoute(max);
+ connectionManager.setMaxTotal(2 * max);
+ }
+ }
+
+ return connectionManager;
+ }
+
+ private static String[] split(final String s) {
+ if (TextUtils.isBlank(s)) {
+ return null;
+ }
+ return s.split(" *, *");
+ }
+
+ /**
+ * Get the {@link HttpClient}.
+ *
+ * @return the {@link HttpClient}.
+ */
+ @SuppressWarnings("UnusedDeclaration")
+ public HttpClient getHttpClient() {
+ return client;
+ }
+
+ /**
+ * Get the {@link CookieStore}.
+ *
+ * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to
+ * {@code true}.
+ */
+ public CookieStore getCookieStore() {
+ return cookieStore;
+ }
+
+ private static URI getProxyUri(final Object proxy) {
+ if (proxy instanceof URI) {
+ return (URI) proxy;
+ } else if (proxy instanceof String) {
+ return URI.create((String) proxy);
+ } else {
+ throw new ProcessingException(LocalizationMessages.WRONG_PROXY_URI_TYPE(ClientProperties.PROXY_URI));
+ }
+ }
+
+ @Override
+ public ClientResponse apply(final ClientRequest clientRequest) throws ProcessingException {
+ final HttpUriRequest request = getUriHttpRequest(clientRequest);
+ final Map clientHeadersSnapshot = writeOutBoundHeaders(clientRequest.getHeaders(), request);
+
+ try {
+ final CloseableHttpResponse response;
+ final HttpClientContext context = HttpClientContext.create();
+ if (preemptiveBasicAuth) {
+ final AuthCache authCache = new BasicAuthCache();
+ final BasicScheme basicScheme = new BasicScheme();
+ authCache.put(getHost(request), basicScheme);
+ context.setAuthCache(authCache);
+ }
+ response = client.execute(getHost(request), request, context);
+ HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(),
+ this.getClass().getName());
+
+ final Response.StatusType status = response.getStatusLine().getReasonPhrase() == null ?
+ Statuses.from(response.getStatusLine().getStatusCode()) :
+ Statuses.from(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase());
+
+ final ClientResponse responseContext = new ApacheConnectorClientResponse(status, clientRequest, response);
+ final List redirectLocations = context.getRedirectLocations();
+ if (redirectLocations != null && !redirectLocations.isEmpty()) {
+ responseContext.setResolvedRequestUri(redirectLocations.get(redirectLocations.size() - 1));
+ }
+
+ final Header[] respHeaders = response.getAllHeaders();
+ final MultivaluedMap headers = responseContext.getHeaders();
+ for (final Header header : respHeaders) {
+ final String headerName = header.getName();
+ List list = headers.get(headerName);
+ if (list == null) {
+ list = new ArrayList();
+ }
+ list.add(header.getValue());
+ headers.put(headerName, list);
+ }
+
+ final HttpEntity entity = response.getEntity();
+
+ if (entity != null) {
+ if (headers.get(HttpHeaders.CONTENT_LENGTH) == null) {
+ headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(entity.getContentLength()));
+ }
+
+ final Header contentEncoding = entity.getContentEncoding();
+ if (headers.get(HttpHeaders.CONTENT_ENCODING) == null && contentEncoding != null) {
+ headers.add(HttpHeaders.CONTENT_ENCODING, contentEncoding.getValue());
+ }
+ }
+
+
+ try {
+ responseContext.setEntityStream(new HttpClientResponseInputStream(response));
+ } catch (final IOException e) {
+ LOGGER.log(Level.SEVERE, null, e);
+ }
+
+ return responseContext;
+ } catch (final Exception e) {
+ throw new ProcessingException(e);
+ }
+ }
+
+ @Override
+ public Future> apply(final ClientRequest request, final AsyncConnectorCallback callback) {
+ return MoreExecutors.sameThreadExecutor().submit(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ callback.response(apply(request));
+ } catch (final ProcessingException ex) {
+ callback.failure(ex);
+ } catch (final Throwable t) {
+ callback.failure(t);
+ }
+ }
+ });
+ }
+
+ @Override
+ public String getName() {
+ return "Apache HttpClient " + release;
+ }
+
+ @Override
+ public void close() {
+ try {
+ client.close();
+ } catch (final IOException e) {
+ throw new ProcessingException(LocalizationMessages.FAILED_TO_STOP_CLIENT(), e);
+ }
+ }
+
+ private HttpHost getHost(final HttpUriRequest request) {
+ return new HttpHost(request.getURI().getHost(), request.getURI().getPort(), request.getURI().getScheme());
+ }
+
+ private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) {
+ final Boolean redirectsEnabled =
+ clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, requestConfig.isRedirectsEnabled());
+ final RequestConfig config = RequestConfig.copy(requestConfig).setRedirectsEnabled(redirectsEnabled).build();
+
+ final Boolean bufferingEnabled = clientRequest.resolveProperty(ClientProperties.REQUEST_ENTITY_PROCESSING,
+ RequestEntityProcessing.class) == RequestEntityProcessing.BUFFERED;
+ final HttpEntity entity = getHttpEntity(clientRequest, bufferingEnabled);
+
+ return RequestBuilder
+ .create(clientRequest.getMethod())
+ .setUri(clientRequest.getUri())
+ .setConfig(config)
+ .setEntity(entity)
+ .build();
+ }
+
+
+ private HttpEntity getHttpEntity(final ClientRequest clientRequest, final boolean bufferingEnabled) {
+ final Object entity = clientRequest.getEntity();
+
+ if (entity == null) {
+ return null;
+ }
+
+ final AbstractHttpEntity httpEntity = new AbstractHttpEntity() {
+ @Override
+ public boolean isRepeatable() {
+ return false;
+ }
+
+ @Override
+ public long getContentLength() {
+ return -1;
+ }
+
+ @Override
+ public InputStream getContent() throws IOException, IllegalStateException {
+ if (bufferingEnabled) {
+ final ByteArrayOutputStream buffer = new ByteArrayOutputStream(512);
+ writeTo(buffer);
+ return new ByteArrayInputStream(buffer.toByteArray());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void writeTo(final OutputStream outputStream) throws IOException {
+ clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() {
+ @Override
+ public OutputStream getOutputStream(final int contentLength) throws IOException {
+ return outputStream;
+ }
+ });
+ clientRequest.writeEntity();
+ }
+
+ @Override
+ public boolean isStreaming() {
+ return false;
+ }
+ };
+
+ if (bufferingEnabled) {
+ try {
+ return new BufferedHttpEntity(httpEntity);
+ } catch (final IOException e) {
+ throw new ProcessingException(LocalizationMessages.ERROR_BUFFERING_ENTITY(), e);
+ }
+ } else {
+ return httpEntity;
+ }
+ }
+
+ private static Map writeOutBoundHeaders(final MultivaluedMap headers, final HttpUriRequest request) {
+ Map stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers);
+
+ for (Map.Entry e : stringHeaders.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ return stringHeaders;
+ }
+
+ private static final class HttpClientResponseInputStream extends FilterInputStream {
+
+ HttpClientResponseInputStream(final CloseableHttpResponse response) throws IOException {
+ super(getInputStream(response));
+ }
+
+ @Override
+ public void close() throws IOException {
+ super.close();
+ }
+ }
+
+ private static InputStream getInputStream(final CloseableHttpResponse response) throws IOException {
+
+ if (response.getEntity() == null) {
+ return new ByteArrayInputStream(new byte[0]);
+ } else {
+ final InputStream i = response.getEntity().getContent();
+ if (i.markSupported()) {
+ return i;
+ }
+ return new BufferedInputStream(i, ReaderWriter.BUFFER_SIZE);
+ }
+ }
+
+ private static class ConnectionFactory extends ManagedHttpClientConnectionFactory {
+
+ private static final AtomicLong COUNTER = new AtomicLong();
+
+ private final int chunkSize;
+
+ private ConnectionFactory(final int chunkSize) {
+ this.chunkSize = chunkSize;
+ }
+
+ @Override
+ public ManagedHttpClientConnection create(final HttpRoute route, final ConnectionConfig config) {
+ final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement());
+
+ return new HttpClientConnection(id, config.getBufferSize(), chunkSize);
+ }
+ }
+
+ private static class HttpClientConnection extends DefaultManagedHttpClientConnection {
+
+ private final int chunkSize;
+
+ private HttpClientConnection(final String id, final int buffersize, final int chunkSize) {
+ super(id, buffersize);
+
+ this.chunkSize = chunkSize;
+ }
+
+ @Override
+ protected OutputStream createOutputStream(final long len, final SessionOutputBuffer outbuffer) {
+ if (len == ContentLengthStrategy.CHUNKED) {
+ return new ChunkedOutputStream(chunkSize, outbuffer);
+ }
+ return super.createOutputStream(len, outbuffer);
+ }
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java
new file mode 100644
index 000000000..7ba9d8abd
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java
@@ -0,0 +1,52 @@
+package com.github.dockerjava.jaxrs.connector;
+
+import java.io.IOException;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.StatusType;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.glassfish.jersey.client.ClientRequest;
+import org.glassfish.jersey.client.ClientResponse;
+
+/**
+ * Fix for https://github.com/docker-java/docker-java/issues/196
+ *
+ * https://java.net/jira/browse/JERSEY-2852
+ *
+ * @author marcus
+ *
+ */
+public class ApacheConnectorClientResponse extends ClientResponse {
+
+ private CloseableHttpResponse closeableHttpResponse;
+
+ public ApacheConnectorClientResponse(ClientRequest requestContext,
+ Response response) {
+ super(requestContext, response);
+ }
+
+ public ApacheConnectorClientResponse(StatusType status,
+ ClientRequest requestContext, CloseableHttpResponse closeableHttpResponse) {
+ super(status, requestContext);
+ this.closeableHttpResponse = closeableHttpResponse;
+ }
+
+ public ApacheConnectorClientResponse(StatusType status,
+ ClientRequest requestContext) {
+ super(status, requestContext);
+ }
+
+ @Override
+ public void close() {
+ try {
+ closeableHttpResponse.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ super.close();
+ }
+
+
+
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java
new file mode 100644
index 000000000..fbde136ff
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java
@@ -0,0 +1,151 @@
+package com.github.dockerjava.jaxrs.connector;
+
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common Development
+ * and Distribution License("CDDL") (collectively, the "License"). You
+ * may not use this file except in compliance with the License. You can
+ * obtain a copy of the License at
+ * http://glassfish.java.net/public/CDDL+GPL_1_1.html
+ * or packager/legal/LICENSE.txt. See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ * When distributing the software, include this License Header Notice in each
+ * file and include the License file at packager/legal/LICENSE.txt.
+ *
+ * GPL Classpath Exception:
+ * Oracle designates this particular file as subject to the "Classpath"
+ * exception as provided by Oracle in the GPL Version 2 section of the License
+ * file that accompanied this code.
+ *
+ * Modifications:
+ * If applicable, add the following below the License Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyright [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ * If you wish your version of this file to be governed by only the CDDL or
+ * only the GPL Version 2, indicate your decision by adding "[Contributor]
+ * elects to include this software in this distribution under the [CDDL or GPL
+ * Version 2] license." If you don't indicate a single choice of license, a
+ * recipient has the option to distribute your version of this file under
+ * either the CDDL, the GPL Version 2 or to extend the choice of license to
+ * its licensees as provided above. However, if you add GPL Version 2 code
+ * and therefore, elected the GPL Version 2 license, then the option applies
+ * only if the new code is made subject to such option by the copyright
+ * holder.
+ */
+import javax.ws.rs.client.Client;
+import javax.ws.rs.core.Configurable;
+import javax.ws.rs.core.Configuration;
+
+import org.glassfish.jersey.apache.connector.LocalizationMessages;
+import org.glassfish.jersey.client.Initializable;
+import org.glassfish.jersey.client.spi.Connector;
+import org.glassfish.jersey.client.spi.ConnectorProvider;
+import org.apache.http.client.HttpClient;
+
+/**
+ * Connector provider for Jersey {@link Connector connectors} that utilize
+ * Apache HTTP Client to send and receive HTTP request and responses.
+ *
+ * The following connector configuration properties are supported:
+ *
+ * - {@link ApacheClientProperties#CONNECTION_MANAGER}
+ * - {@link ApacheClientProperties#REQUEST_CONFIG}
+ * - {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
+ * - {@link ApacheClientProperties#DISABLE_COOKIES}
+ * - {@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}
+ * - {@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}
+ * - {@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}
+ * - {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}
+ * - default value is {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}
+ * - {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
+ * - {@link ApacheClientProperties#SSL_CONFIG}
+ *
+ *
+ *
+ * Connector instances created via this connector provider use
+ * {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked encoding} as a default setting.
+ * This can be overridden by the {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}.
+ * By default the {@link org.glassfish.jersey.client.ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported
+ * when using the default {@code org.apache.http.conn.HttpClientConnectionManager} instance. If custom
+ * connection manager is used, then chunked encoding size can be set by providing a custom
+ * {@code org.apache.http.HttpClientConnection} (via custom {@code org.apache.http.impl.conn.ManagedHttpClientConnectionFactory})
+ * and overriding it's {@code createOutputStream} method.
+ *
+ *
+ * Use of authorization by the AHC-based connectors is dependent on the chunk encoding setting.
+ * If the entity buffering is enabled, the entity is buffered and authorization can be performed
+ * automatically in response to a 401 by sending the request again. When entity buffering
+ * is disabled (chunked encoding is used) then the property
+ * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must
+ * be set to {@code true}.
+ *
+ *
+ * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then
+ * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release
+ * connection-based resources.
+ *
+ *
+ * If a response entity is obtained that is an instance of {@link java.io.Closeable}
+ * then the instance MUST be closed after processing the entity to release
+ * connection-based resources.
+ *
+ *
+ * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
+ *
+ *
+ * @author Pavel Bucek (pavel.bucek at oracle.com)
+ * @author Arul Dhesiaseelan (aruld at acm.org)
+ * @author jorgeluisw at mac.com
+ * @author Marek Potociar (marek.potociar at oracle.com)
+ * @author Paul Sandoz (paul.sandoz at oracle.com)
+ * @since 2.5
+ */
+public class ApacheConnectorProvider implements ConnectorProvider {
+
+ @Override
+ public Connector getConnector(Client client, Configuration runtimeConfig) {
+ return new ApacheConnector(runtimeConfig);
+ }
+
+ /**
+ * Retrieve the underlying Apache {@link HttpClient} instance from
+ * {@link org.glassfish.jersey.client.JerseyClient} or {@link org.glassfish.jersey.client.JerseyWebTarget}
+ * configured to use {@code ApacheConnectorProvider}.
+ *
+ * @param component {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use
+ * {@code ApacheConnectorProvider}.
+ * @return underlying Apache {@code HttpClient} instance.
+ *
+ * @throws java.lang.IllegalArgumentException in case the {@code component} is neither {@code JerseyClient}
+ * nor {@code JerseyWebTarget} instance or in case the component
+ * is not configured to use a {@code ApacheConnectorProvider}.
+ * @since 2.8
+ */
+ public static HttpClient getHttpClient(Configurable> component) {
+ if (!(component instanceof Initializable)) {
+ throw new IllegalArgumentException(
+ LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component.getClass().getName()));
+ }
+
+ final Initializable> initializable = (Initializable>) component;
+ Connector connector = initializable.getConfiguration().getConnector();
+ if (connector == null) {
+ initializable.preInitialize();
+ connector = initializable.getConfiguration().getConnector();
+ }
+
+ if (connector instanceof ApacheConnector) {
+ return ((ApacheConnector) connector).getHttpClient();
+ }
+
+ throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED());
+ }
+}
+
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt
new file mode 100644
index 000000000..c3c1415f1
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt
@@ -0,0 +1,3 @@
+This package exists as a workaround to https://java.net/jira/browse/JERSEY-2852.
+It introduces ApacheConnectorClientResponse which extends ClientResponse and closes
+the underlying CloseableHttpResponse when close() is called.
\ No newline at end of file
diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
index f92949294..569283ce7 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -16,6 +16,8 @@
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;
@@ -66,17 +68,37 @@ public void testEventStreamTimeBound() throws InterruptedException,
EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback)
.withSince(startTime).withUntil(endTime);
ExecutorService executorService = eventsCmd.exec();
-
+
boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
-
+
executorService.shutdown();
eventCallback.close();
+ assertTrue(zeroCount, "" + eventCallback.getEvents());
+ }
+
+ @Test
+ public void testEventStreaming1() throws InterruptedException, IOException {
+ // Don't include other tests events
+ TimeUnit.SECONDS.sleep(1);
+
+ CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
+ EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch);
+
+ EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(
+ getEpochTime());
+ ExecutorService executorService = eventsCmd.exec();
+
+ generateEvents();
+
+ boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
+ executorService.shutdown();
+ eventCallback.close();
assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]");
}
@Test
- public void testEventStreaming() throws InterruptedException, IOException {
+ public void testEventStreaming2() throws InterruptedException, IOException {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
@@ -111,6 +133,7 @@ private int generateEvents() {
private class EventCallbackTest implements EventCallback {
private final CountDownLatch countDownLatch;
private final AtomicBoolean isReceiving = new AtomicBoolean(true);
+ private final List events = new ArrayList();
public EventCallbackTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
@@ -124,6 +147,7 @@ public void close() {
public void onEvent(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
countDownLatch.countDown();
+ events.add(event);
}
@Override
@@ -140,5 +164,9 @@ public void onCompletion(int numEvents) {
public boolean isReceiving() {
return isReceiving.get();
}
+
+ public List getEvents() {
+ return new ArrayList(events);
+ }
}
}
From 1ed6fbfe5ae6fd1ddd27e80375a3e94b56436de3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 15 May 2015 15:30:20 +0200
Subject: [PATCH 0076/1272] Warning comment on 'followStream'
---
.../api/command/AttachContainerCmd.java | 26 ++++++++----
.../api/command/LogContainerCmd.java | 41 ++++++++++++-------
2 files changed, 46 insertions(+), 21 deletions(-)
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 abdec8f58..0fb72d452 100644
--- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
@@ -2,6 +2,7 @@
import java.io.InputStream;
+import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.NotFoundException;
/**
@@ -20,7 +21,7 @@
* - true or false, if true, print timestamps for every log line.
* Defaults to false.
*/
-public interface AttachContainerCmd extends DockerCmd{
+public interface AttachContainerCmd extends DockerCmd {
public String getContainerId();
@@ -36,8 +37,17 @@ public interface AttachContainerCmd extends DockerCmd{
public AttachContainerCmd withContainerId(String containerId);
+ /**
+ * 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);
public AttachContainerCmd withTimestamps(boolean timestamps);
@@ -51,19 +61,21 @@ public interface AttachContainerCmd extends DockerCmd{
public AttachContainerCmd withStdErr(boolean stderr);
public AttachContainerCmd withLogs(boolean logs);
-
+
public AttachContainerCmd withLogs();
/**
- * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent
- * connection leaks.
+ * Its the responsibility of the caller to consume and/or close the
+ * {@link InputStream} to prevent connection leaks.
*
- * @throws NotFoundException No such container
+ * @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/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
index 05e108550..c966ef953 100644
--- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
@@ -1,12 +1,13 @@
package com.github.dockerjava.api.command;
+import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.NotFoundException;
import java.io.InputStream;
/**
* Get container logs
- *
+ *
* @param followStream
* - true or false, return stream. Defaults to false.
* @param stdout
@@ -17,13 +18,15 @@
* - true or false, if true, print timestamps for every log line.
* Defaults to false.
* @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.
- *
+ * - `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 DockerCmd {
public String getContainerId();
@@ -39,12 +42,21 @@ public interface LogContainerCmd extends DockerCmd{
public LogContainerCmd withContainerId(String containerId);
+ /**
+ * See {@link #withFollowStream(boolean)}
+ */
public LogContainerCmd 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 LogContainerCmd withFollowStream(boolean followStream);
public LogContainerCmd withTimestamps();
-
+
public LogContainerCmd withTimestamps(boolean timestamps);
public LogContainerCmd withStdOut();
@@ -60,16 +72,17 @@ public interface LogContainerCmd extends DockerCmd{
public LogContainerCmd withTail(int tail);
/**
- * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent
- * connection leaks.
- *
- * @throws NotFoundException No such container
+ * 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
From 2df09cdca8bd41cb5be0b28e00fbd72632d4f33c Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 15 May 2015 15:30:48 +0200
Subject: [PATCH 0077/1272] Make FrameReaderITest work again
---
.../client/AbstractDockerClientTest.java | 8 +-
.../core/command/DockerfileFixture.java | 15 +-
.../core/command/FrameReaderITest.java | 163 ++++++++++--------
.../frameReaderDockerfile/Dockerfile | 4 +-
4 files changed, 106 insertions(+), 84 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 1e61b9a7d..802166a00 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -104,8 +104,12 @@ public void afterMethod(ITestResult result) {
"################################## END OF {} ##################################\n",
result.getName());
}
+
+ protected String asString(InputStream response) {
+ return consumeAsString(response);
+ }
- protected String asString(InputStream response) {
+ public static String consumeAsString(InputStream response) {
StringWriter logwriter = new StringWriter();
@@ -116,7 +120,7 @@ protected String asString(InputStream response) {
while (itr.hasNext()) {
String line = itr.next();
logwriter.write(line + (itr.hasNext() ? "\n" : ""));
- //LOG.info("line: "+line);
+ LOG.info("line: "+line);
}
response.close();
diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
index 840f63da4..53131c611 100644
--- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
+++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java
@@ -1,14 +1,20 @@
package com.github.dockerjava.core.command;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.InternalServerErrorException;
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.model.Image;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
/**
* Start and stop a single container for testing.
@@ -29,11 +35,14 @@ public DockerfileFixture(DockerClient dockerClient, String directory) {
public void open() throws IOException {
LOGGER.info("building {}", directory);
- dockerClient
+ InputStream response = dockerClient
.buildImageCmd(new File("src/test/resources", directory))
.withNoCache() // remove alternatives, cause problems
- .exec()
- .close();
+ .exec();
+
+ String log = AbstractDockerClientTest.consumeAsString(response);
+
+ assertThat(log, containsString("Successfully built"));
Image lastCreatedImage = dockerClient
.listImagesCmd()
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 0c22fc085..24c833559 100644
--- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
+++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java
@@ -1,86 +1,97 @@
package com.github.dockerjava.core.command;
+import static org.testng.Assert.assertEquals;
+import static org.testng.AssertJUnit.assertNull;
+
+import java.io.IOException;
+import java.io.InputStream;
-import com.github.dockerjava.api.DockerClient;
-import com.github.dockerjava.api.model.Frame;
-import com.github.dockerjava.api.model.StreamType;
-import com.github.dockerjava.core.DockerClientBuilder;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.AssertJUnit.assertNull;
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.StreamType;
+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 {
-
- try (FrameReader reader = new FrameReader(getLoggerStream())) {
- 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()
- .withTail(10)
- .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();
-
- }
+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();
+
+ }
}
diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile
index 8d9b553e1..9aa6b9847 100644
--- a/src/test/resources/frameReaderDockerfile/Dockerfile
+++ b/src/test/resources/frameReaderDockerfile/Dockerfile
@@ -3,11 +3,9 @@ FROM busybox:latest
# log to stdout and stderr so we can make sure logging with FrameReader works
RUN echo '#! /bin/sh' > cmd.sh
-RUN echo 'sleep 1' >> cmd.sh
RUN echo 'echo "to stdout"' >> cmd.sh
RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh
-# block for ever
-RUN echo 'cat' >> cmd.sh
+RUN echo 'sleep 1' >> cmd.sh
RUN chmod +x cmd.sh
CMD ["./cmd.sh"]
\ No newline at end of file
From 02e8cc1aaa448db064c3d9aa4d8e0b0af9415495 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 17 May 2015 20:55:28 +0200
Subject: [PATCH 0078/1272] Refactor streaming API
---
.../github/dockerjava/api/DockerClient.java | 3 +-
.../dockerjava/api/command/EventCallback.java | 13 ---
.../dockerjava/api/command/EventsCmd.java | 20 +++-
.../api/stream/ObjectStreamCallback.java | 18 ++++
.../dockerjava/core/DockerClientImpl.java | 3 +-
.../core/command/EventsCmdImpl.java | 21 ++--
.../dockerjava/jaxrs/EventsCmdExec.java | 79 +++++----------
.../dockerjava/jaxrs/util/Streaming.java | 52 ++++++++++
.../util/WrappedResponseInputStream.java | 2 +-
.../core/command/EventsCmdImplTest.java | 95 +++++++++++--------
10 files changed, 174 insertions(+), 132 deletions(-)
delete mode 100644 src/main/java/com/github/dockerjava/api/command/EventCallback.java
create mode 100644 src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 9e275eb35..1cd3e0760 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -3,6 +3,7 @@
import java.io.*;
import com.github.dockerjava.api.command.*;
+import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.Identifier;
@@ -112,7 +113,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(
public UnpauseContainerCmd unpauseContainerCmd(String containerId);
- public EventsCmd eventsCmd(EventCallback eventCallback);
+ public EventsCmd eventsCmd(EventStreamCallback eventCallback);
@Override
public void close() throws IOException;
diff --git a/src/main/java/com/github/dockerjava/api/command/EventCallback.java b/src/main/java/com/github/dockerjava/api/command/EventCallback.java
deleted file mode 100644
index 18b8669ea..000000000
--- a/src/main/java/com/github/dockerjava/api/command/EventCallback.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.dockerjava.api.command;
-
-import com.github.dockerjava.api.model.Event;
-
-/**
- * Event callback
- */
-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..c3016a7ff 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,7 @@
package com.github.dockerjava.api.command;
-import java.util.concurrent.ExecutorService;
+import com.github.dockerjava.api.model.Event;
+import com.github.dockerjava.api.stream.ObjectStreamCallback;
/**
@@ -9,7 +10,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 DockerCmd {
public EventsCmd withSince(String since);
public EventsCmd withUntil(String until);
@@ -18,10 +19,19 @@ public interface EventsCmd extends DockerCmd {
public String getUntil();
- public EventCallback getEventCallback();
+ public EventStreamCallback getEventCallback();
- public EventsCmd withEventCallback(EventCallback eventCallback);
+ public EventsCmd withEventCallback(EventStreamCallback eventCallback);
- public static interface Exec extends DockerCmdExec {
+ public static interface Exec extends DockerCmdExec {
}
+
+ /**
+ * {@link Event} stream callback
+ */
+ public interface EventStreamCallback extends ObjectStreamCallback{
+
+
+ }
+
}
diff --git a/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java b/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java
new file mode 100644
index 000000000..c636c06cf
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java
@@ -0,0 +1,18 @@
+package com.github.dockerjava.api.stream;
+
+import java.io.Closeable;
+
+/**
+ * Object stream callback
+ */
+public interface ObjectStreamCallback {
+ /** Called when the stream starts. The passed {@link Closeable} can be used to close/interrupt the stream */
+ void streamStarted(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 streamFinished();
+
+}
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
index 7e96225f8..599db377a 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -9,6 +9,7 @@
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.model.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.api.model.Identifier;
@@ -342,7 +343,7 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
}
@Override
- public EventsCmd eventsCmd(EventCallback eventCallback) {
+ public EventsCmd eventsCmd(EventStreamCallback eventCallback) {
return new EventsCmdImpl(getDockerCmdExecFactory()
.createEventsCmdExec(), eventCallback);
}
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 ac55de714..07180bdf9 100644
--- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java
@@ -1,20 +1,17 @@
package com.github.dockerjava.core.command;
-import java.util.concurrent.ExecutorService;
-
-import com.github.dockerjava.api.command.EventCallback;
import com.github.dockerjava.api.command.EventsCmd;
/**
* Stream docker events
*/
-public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd {
+public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd {
private String since;
private String until;
- private EventCallback eventCallback;
+ private EventStreamCallback eventCallback;
- public EventsCmdImpl(EventsCmd.Exec exec, EventCallback eventCallback) {
+ public EventsCmdImpl(EventsCmd.Exec exec, EventStreamCallback eventCallback) {
super(exec);
withEventCallback(eventCallback);
}
@@ -32,7 +29,7 @@ public EventsCmd withUntil(String until) {
}
@Override
- public EventsCmd withEventCallback(EventCallback eventCallback) {
+ public EventsCmd withEventCallback(EventStreamCallback eventCallback) {
this.eventCallback = eventCallback;
return this;
}
@@ -48,14 +45,14 @@ public String getUntil() {
}
@Override
- public EventCallback getEventCallback() {
+ public EventStreamCallback getEventCallback() {
return eventCallback;
}
- @Override
- public ExecutorService exec() {
- return super.exec();
- }
+// @Override
+// public InputStream exec() {
+// return super.exec();
+// }
@Override
public String toString() {
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index db14ab21b..37c048fa1 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -2,7 +2,6 @@
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;
@@ -13,18 +12,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-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.command.EventCallback;
import com.github.dockerjava.api.command.EventsCmd;
import com.github.dockerjava.api.model.Event;
-import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream;
+import com.github.dockerjava.jaxrs.util.Streaming;
-public class EventsCmdExec extends
- AbstrDockerCmdExec implements
- EventsCmd.Exec {
+public class EventsCmdExec extends AbstrDockerCmdExec
+ implements EventsCmd.Exec {
private static final Logger LOGGER = LoggerFactory
.getLogger(EventsCmdExec.class);
@@ -33,33 +26,35 @@ public EventsCmdExec(WebTarget baseResource) {
}
@Override
- protected ExecutorService execute(EventsCmd command) {
- ExecutorService executorService = Executors.newSingleThreadExecutor();
+ protected Void execute(EventsCmd command) {
+
- WebTarget webResource = getBaseResource().path("/events")
+ WebTarget webTarget = getBaseResource().path("/events")
.queryParam("since", command.getSince())
.queryParam("until", command.getUntil());
- LOGGER.trace("GET: {}", webResource);
+ LOGGER.trace("GET: {}", webTarget);
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
EventNotifier eventNotifier = EventNotifier.create(
- command.getEventCallback(), webResource);
+ command.getEventCallback(), webTarget);
executorService.submit(eventNotifier);
- return executorService;
+ executorService.shutdown();
+
+ return null;
}
private static class EventNotifier implements Callable {
- private static final JsonFactory JSON_FACTORY = new JsonFactory();
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
- private final EventCallback eventCallback;
+ private final EventsCmd.EventStreamCallback eventCallback;
private final WebTarget webTarget;
- private EventNotifier(EventCallback eventCallback, WebTarget webTarget) {
+ private EventNotifier(EventsCmd.EventStreamCallback eventCallback,
+ WebTarget webTarget) {
this.eventCallback = eventCallback;
this.webTarget = webTarget;
}
- public static EventNotifier create(EventCallback eventCallback,
+ public static EventNotifier create(EventsCmd.EventStreamCallback eventCallback,
WebTarget webTarget) {
checkNotNull(eventCallback, "An EventCallback must be provided");
checkNotNull(webTarget, "An WebTarget must be provided");
@@ -68,43 +63,13 @@ public static EventNotifier create(EventCallback eventCallback,
@Override
public Void call() throws Exception {
- int numEvents = 0;
- Response response = null;
- try {
- response = webTarget.request().get(Response.class);
- InputStream inputStream = new WrappedResponseInputStream(
- response);
- JsonParser jp = JSON_FACTORY.createParser(inputStream);
- // The following condition looks strange but jp.nextToken() will block until there is an
- // event from the docker server or the connection is terminated.
- // therefore we want to check before getting an event (to prevent a blocking operation
- // and after the event to make sure that the eventCallback is still interested in getting notified.
- while (eventCallback.isReceiving() &&
- jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() &&
- eventCallback.isReceiving()) {
- try {
- eventCallback.onEvent(OBJECT_MAPPER.readValue(jp,
- Event.class));
- } catch (Exception e) {
- eventCallback.onException(e);
- }
- numEvents++;
- }
- } catch (Exception e) {
- eventCallback.onException(e);
- } finally {
- // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196
- try {
- eventCallback.onCompletion(numEvents);
- } catch (Exception e) {
- eventCallback.onException(e);
- }
- if (response != null) {
- response.close();
- }
- }
-
+ Response response = webTarget.request().get(Response.class);
+
+ Streaming.processJsonStream(response, eventCallback, Event.class);
+
return null;
}
}
+
+
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
new file mode 100644
index 000000000..5f68ab09b
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java
@@ -0,0 +1,52 @@
+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.stream.ObjectStreamCallback;
+
+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,
+ ObjectStreamCallback objectStreamCallback, Class clazz) {
+
+ InputStream inputStream = new WrappedResponseInputStream(
+ response);
+
+ objectStreamCallback.streamStarted(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.streamFinished();
+ }
+ }
+ }
+
+
+
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
index bf40dbfc0..752ff3423 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
@@ -8,7 +8,7 @@
/**
* This is a wrapper around {@link Response} that acts as a {@link InputStream}.
* When this {@link WrappedResponseInputStream} is closed it closes the
- * underlying {@link Response} object also to prevent connection leaks.
+ * underlying {@link Response} object also to prevent blocking/hanging connections.
*
* @author marcus
*/
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 569283ce7..ab3e5c30b 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -1,11 +1,12 @@
package com.github.dockerjava.core.command;
-import com.github.dockerjava.api.DockerException;
-import com.github.dockerjava.api.command.CreateContainerResponse;
-import com.github.dockerjava.api.command.EventCallback;
-import com.github.dockerjava.api.command.EventsCmd;
-import com.github.dockerjava.api.model.Event;
-import com.github.dockerjava.client.AbstractDockerClientTest;
+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.TimeUnit;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -14,14 +15,11 @@
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
-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 com.github.dockerjava.api.DockerException;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback;
+import com.github.dockerjava.api.model.Event;
+import com.github.dockerjava.client.AbstractDockerClientTest;
@Test(groups = "integration")
public class EventsCmdImplTest extends AbstractDockerClientTest {
@@ -65,54 +63,60 @@ public void testEventStreamTimeBound() throws InterruptedException,
CountDownLatch countDownLatch = new CountDownLatch(expectedEvents);
EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch);
- EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback)
- .withSince(startTime).withUntil(endTime);
- ExecutorService executorService = eventsCmd.exec();
+ dockerClient.eventsCmd(eventCallback)
+ .withSince(startTime)
+ .withUntil(endTime)
+ .exec();
boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
- executorService.shutdown();
eventCallback.close();
+
+ LOG.debug("events: " + eventCallback.getEvents());
assertTrue(zeroCount, "" + eventCallback.getEvents());
}
@Test
- public void testEventStreaming1() throws InterruptedException, IOException {
+ public void testEventStreamingUnbound() throws InterruptedException, IOException {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch);
- EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(
- getEpochTime());
- ExecutorService executorService = eventsCmd.exec();
+ dockerClient.eventsCmd(eventCallback)
+ .withSince(getEpochTime())
+ .exec();
generateEvents();
boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
- executorService.shutdown();
+
+ System.out.println("close callback");
+
eventCallback.close();
assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]");
+
+ assertTrue(eventCallback.getErrors().isEmpty(), "At least on Exception was thrown: " + eventCallback.getErrors());
}
@Test
- public void testEventStreaming2() throws InterruptedException, IOException {
+ public void testEventStreamingUnbound2() throws InterruptedException, IOException {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch);
- EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(
- getEpochTime());
- ExecutorService executorService = eventsCmd.exec();
+ dockerClient.eventsCmd(eventCallback)
+ .withSince(getEpochTime())
+ .exec();
generateEvents();
boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
- executorService.shutdown();
+
eventCallback.close();
assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]");
}
@@ -130,43 +134,50 @@ private int generateEvents() {
return KNOWN_NUM_EVENTS;
}
- private class EventCallbackTest implements EventCallback {
+ private class EventCallbackTest implements EventStreamCallback, Closeable {
private final CountDownLatch countDownLatch;
- private final AtomicBoolean isReceiving = new AtomicBoolean(true);
private final List events = new ArrayList();
+ private final List errors = new ArrayList();
+ private Closeable closeable;
public EventCallbackTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
- public void close() {
- isReceiving.set(false);
+ @Override
+ public void close() throws IOException {
+ closeable.close();
+ }
+
+ @Override
+ public void streamStarted(Closeable closeable) {
+ this.closeable = closeable;
}
@Override
- public void onEvent(Event event) {
+ public void onStream(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
countDownLatch.countDown();
events.add(event);
}
@Override
- public void onException(Throwable throwable) {
+ public void onError(Throwable throwable) {
LOG.error("Error occurred: {}", throwable.getMessage());
+ errors.add(throwable);
}
-
- @Override
- public void onCompletion(int numEvents) {
- LOG.info("Number of events received: {}", numEvents);
- }
-
+
@Override
- public boolean isReceiving() {
- return isReceiving.get();
+ public void streamFinished() {
+ LOG.info("Event stream finished");
}
public List getEvents() {
return new ArrayList(events);
}
+
+ public List getErrors() {
+ return errors;
+ }
}
}
From bff4291ebb6ce99e1132199876af77208956c60d Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 22 May 2015 23:29:43 +0200
Subject: [PATCH 0079/1272] Added test for starting container with auto
assigned port binding
---
.../command/StartContainerCmdImplTest.java | 66 ++++++++++++++-----
1 file changed, 50 insertions(+), 16 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index 9a3071653..045c008e1 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -65,8 +65,7 @@ public void startContainerWithVolumes() throws DockerException {
Volume volume2 = new Volume("/opt/webapp2");
CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox")
- .withVolumes(volume1, volume2)
+ .createContainerCmd("busybox").withVolumes(volume1, volume2)
.withCmd("true").exec();
LOG.info("Created container {}", container.toString());
@@ -91,8 +90,10 @@ public void startContainerWithVolumes() throws DockerException {
assertContainerHasVolumes(inspectContainerResponse, volume1, volume2);
- assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
- contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2)));
+ assertThat(
+ Arrays.asList(inspectContainerResponse.getVolumesRW()),
+ contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(
+ volume2)));
}
@@ -224,6 +225,41 @@ public void startContainerWithPortBindings() throws DockerException {
}
+ @Test
+ public void startContainerWithRandomPortBindings() throws DockerException {
+
+ ExposedPort tcp22 = ExposedPort.tcp(22);
+ ExposedPort tcp23 = ExposedPort.tcp(23);
+
+ Ports portBindings = new Ports();
+ portBindings.bind(tcp22, Ports.Binding(null));
+ portBindings.bind(tcp23, Ports.Binding(null));
+
+ CreateContainerResponse container = dockerClient
+ .createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings)
+ .withPublishAllPorts(true).exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient
+ .inspectContainerCmd(container.getId()).exec();
+
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig()
+ .getExposedPorts()), contains(tcp22, tcp23));
+
+ assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
+ .getBindings().get(tcp22)[0].getHostPort(), is(notNullValue()));
+
+ assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
+ .getBindings().get(tcp23)[0], is(notNullValue()));
+
+ }
+
@Test
public void startContainerWithConflictingPortBindings()
throws DockerException {
@@ -303,8 +339,9 @@ public void startContainerWithLinkingDeprecated() throws DockerException {
is(notNullValue()));
assertThat(inspectContainerResponse2.getHostConfig().getLinks(),
is(notNullValue()));
- assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1",
- "container1Link") }));
+ assertThat(
+ inspectContainerResponse2.getHostConfig().getLinks(),
+ equalTo(new Link[] { new Link("container1", "container1Link") }));
assertThat(inspectContainerResponse2.getId(),
startsWith(container2.getId()));
assertThat(inspectContainerResponse2.getName(), equalTo("/container2"));
@@ -313,8 +350,7 @@ public void startContainerWithLinkingDeprecated() throws DockerException {
assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
}
-
-
+
@Test
public void startContainerWithLinking() throws DockerException {
@@ -348,14 +384,12 @@ public void startContainerWithLinking() throws DockerException {
CreateContainerResponse container2 = dockerClient
.createContainerCmd("busybox").withCmd("sleep", "9999")
.withName("container2")
- .withLinks(new Link("container1", "container1Link"))
- .exec();
+ .withLinks(new Link("container1", "container1Link")).exec();
LOG.info("Created container2 {}", container2.toString());
assertThat(container2.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container2.getId())
- .exec();
+ dockerClient.startContainerCmd(container2.getId()).exec();
InspectContainerResponse inspectContainerResponse2 = dockerClient
.inspectContainerCmd(container2.getId()).exec();
@@ -367,8 +401,9 @@ public void startContainerWithLinking() throws DockerException {
is(notNullValue()));
assertThat(inspectContainerResponse2.getHostConfig().getLinks(),
is(notNullValue()));
- assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1",
- "container1Link") }));
+ assertThat(
+ inspectContainerResponse2.getHostConfig().getLinks(),
+ equalTo(new Link[] { new Link("container1", "container1Link") }));
assertThat(inspectContainerResponse2.getId(),
startsWith(container2.getId()));
assertThat(inspectContainerResponse2.getName(), equalTo("/container2"));
@@ -512,8 +547,7 @@ public void startContainerWithExtraHosts() throws DockerException {
assertThat(container.getId(), not(isEmptyString()));
dockerClient.startContainerCmd(container.getId())
- .withExtraHosts("dockerhost:127.0.0.1")
- .exec();
+ .withExtraHosts("dockerhost:127.0.0.1").exec();
InspectContainerResponse inspectContainerResponse = dockerClient
.inspectContainerCmd(container.getId()).exec();
From dac0be3c89039667ea3149bfb2fde46c34d619df Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 28 May 2015 23:16:36 +0200
Subject: [PATCH 0080/1272] Modify stats implementation according to events
command
---
.../dockerjava/jaxrs/EventsCmdExec.java | 9 ++--
.../github/dockerjava/jaxrs/StatsCmdExec.java | 47 ++++++++++++-------
.../core/command/StatsCmdImplTest.java | 8 ++--
3 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
index db14ab21b..a601ea90c 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java
@@ -79,7 +79,7 @@ public Void call() throws Exception {
// event from the docker server or the connection is terminated.
// therefore we want to check before getting an event (to prevent a blocking operation
// and after the event to make sure that the eventCallback is still interested in getting notified.
- while (eventCallback.isReceiving() &&
+ while (eventCallback.isReceiving() &&
jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() &&
eventCallback.isReceiving()) {
try {
@@ -93,15 +93,14 @@ public Void call() throws Exception {
} catch (Exception e) {
eventCallback.onException(e);
} finally {
- // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196
+ if (response != null) {
+ response.close();
+ }
try {
eventCallback.onCompletion(numEvents);
} catch (Exception e) {
eventCallback.onException(e);
}
- if (response != null) {
- response.close();
- }
}
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 97b9a2754..c0c6f36c1 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java
@@ -24,7 +24,7 @@
public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class);
-
+
public StatsCmdExec(WebTarget baseResource) {
super(baseResource);
}
@@ -32,7 +32,7 @@ public StatsCmdExec(WebTarget baseResource) {
@Override
protected ExecutorService execute(StatsCmd command) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
-
+
WebTarget webResource = getBaseResource().path("/containers/{id}/stats")
.resolveTemplate("id", command.getContainerId());
@@ -41,7 +41,7 @@ protected ExecutorService execute(StatsCmd command) {
executorService.submit(eventNotifier);
return executorService;
}
-
+
private static class StatsNotifier implements Callable {
private static final JsonFactory JSON_FACTORY = new JsonFactory();
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -62,29 +62,42 @@ public static StatsNotifier create(StatsCallback statsCallback, WebTarget webTar
@Override
public Void call() throws Exception {
- int numStats=0;
+ int numEvents = 0;
Response response = null;
try {
response = webTarget.request().get(Response.class);
- InputStream inputStream = new WrappedResponseInputStream(response);
+ InputStream inputStream = new WrappedResponseInputStream(
+ response);
JsonParser jp = JSON_FACTORY.createParser(inputStream);
- while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && statsCallback.isReceiving()) {
- statsCallback.onStats(OBJECT_MAPPER.readValue(jp, Statistics.class));
- numStats++;
+ // The following condition looks strange but jp.nextToken() will block until there is an
+ // event from the docker server or the connection is terminated.
+ // therefore we want to check before getting an event (to prevent a blocking operation
+ // and after the event to make sure that the eventCallback is still interested in getting notified.
+ while (statsCallback.isReceiving() &&
+ jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() &&
+ statsCallback.isReceiving()) {
+ try {
+ statsCallback.onStats(OBJECT_MAPPER.readValue(jp,
+ Statistics.class));
+ } catch (Exception e) {
+ statsCallback.onException(e);
+ }
+ numEvents++;
}
- statsCallback.onCompletion(numStats);
- LOGGER.info("Finished collecting stats");
- return null ;
- }
- catch(Throwable t) {
- statsCallback.onException(t);
- }
- finally {
+ } catch (Exception e) {
+ statsCallback.onException(e);
+ } finally {
if (response != null) {
response.close();
}
+ try {
+ statsCallback.onCompletion(numEvents);
+ } catch (Exception e) {
+ statsCallback.onException(e);
+ }
}
- return null ;
+
+ return null;
}
}
}
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 c5e575373..1e6baffd2 100644
--- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
@@ -57,7 +57,7 @@ public void testStatsStreaming() throws InterruptedException, IOException {
CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS);
StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch);
-
+
String containerName = "generated_" + new SecureRandom().nextInt();
CreateContainerResponse container = dockerClient
@@ -74,7 +74,7 @@ public void testStatsStreaming() throws InterruptedException, IOException {
countDownLatch.await(3, TimeUnit.SECONDS);
boolean gotStats = statsCallback.gotStats();
-
+
LOG.info("Stop stats collection");
executorService.shutdown();
statsCallback.close();
@@ -82,7 +82,7 @@ public void testStatsStreaming() throws InterruptedException, IOException {
LOG.info("Stopping container");
dockerClient.stopContainerCmd(container.getId()).exec();
dockerClient.removeContainerCmd(container.getId()).exec();
-
+
LOG.info("Completed test");
assertTrue(gotStats, "Expected true");
@@ -125,7 +125,7 @@ public void onCompletion(int numStats) {
public boolean isReceiving() {
return isReceiving.get();
}
-
+
public boolean gotStats() {
return gotStats;
}
From 4bec0ec31eec8eedcf8b82cfbc7aa389772a32ff Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 28 May 2015 23:20:02 +0200
Subject: [PATCH 0081/1272] Fix test setup
---
.../dockerjava/client/AbstractDockerClientTest.java | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 80c22cd69..373680471 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -39,7 +39,7 @@ public abstract class AbstractDockerClientTest extends Assert {
protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory(DockerClientBuilder.getDefaultDockerCmdExecFactory());
public void beforeTest() {
-
+
LOG.info("======================= BEFORETEST =======================");
LOG.info("Connecting to Docker server");
dockerClient = DockerClientBuilder.getInstance(config())
@@ -60,7 +60,7 @@ private DockerClientConfig config() {
protected DockerClientConfig config(String password) {
DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder()
- .withServerAddress("https://index.docker.io/v1/").withMaxTotalConnections(5).withMaxPerRouteConnections(5);
+ .withServerAddress("https://index.docker.io/v1/");
if (password!=null) {
builder = builder.withPassword(password);
}
@@ -104,7 +104,7 @@ public void afterMethod(ITestResult result) {
"################################## END OF {} ##################################\n",
result.getName());
}
-
+
protected String asString(InputStream response) {
return consumeAsString(response);
}
@@ -123,7 +123,7 @@ public static String consumeAsString(InputStream response) {
LOG.info("line: "+line);
}
response.close();
-
+
return logwriter.toString();
} catch (IOException e) {
throw new RuntimeException(e);
@@ -175,11 +175,11 @@ public static boolean available(int port) {
* Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes)
* has {@link VolumeBind}s for the given {@link Volume}s
*/
- public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse,
+ public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse,
Volume ... expectedVolumes) {
VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes();
LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds));
-
+
List volumes = new ArrayList();
for (VolumeBind bind : volumeBinds) {
volumes.add(new Volume(bind.getContainerPath()));
From 679cb8d8691857317dfd323e85e9920e32709a11 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 28 May 2015 23:34:44 +0200
Subject: [PATCH 0082/1272] Ignore with CirecleCI
---
.../com/github/dockerjava/core/command/StatsCmdImplTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 1e6baffd2..b82f2f75c 100644
--- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java
@@ -51,7 +51,7 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- @Test
+ @Test(groups = "ignoreInCircleCi")
public void testStatsStreaming() throws InterruptedException, IOException {
TimeUnit.SECONDS.sleep(1);
From 16c17767051b7aba2dbb22ecd7e5e483ae43447d Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Fri, 29 May 2015 06:50:20 +0200
Subject: [PATCH 0083/1272] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4c77e896c..7948c6776 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
Java API client for [Docker](http://docs.docker.io/ "Docker")
-Supports a subset of the Docker Client API v1.18, Docker Server version 1.6.0
+Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/sources/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x
The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries!
From ad50bfdfb50f82bc4c2fb62dcc7d07857e5de3fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Igor=20Spasi=C4=87?=
Date: Fri, 29 May 2015 15:43:28 +0200
Subject: [PATCH 0084/1272] Labels are array of Strings (fixes #232)
---
src/main/java/com/github/dockerjava/api/model/Info.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/Info.java b/src/main/java/com/github/dockerjava/api/model/Info.java
index fb63f2ff0..bf96b9fc1 100644
--- a/src/main/java/com/github/dockerjava/api/model/Info.java
+++ b/src/main/java/com/github/dockerjava/api/model/Info.java
@@ -60,7 +60,7 @@ public class Info {
private String kernelVersion;
@JsonProperty("Labels")
- private String Labels;
+ private String[] Labels;
@JsonProperty("MemoryLimit")
private boolean memoryLimit;
@@ -140,7 +140,7 @@ public String getKernelVersion() {
return kernelVersion;
}
- public String getLabels() {
+ public String[] getLabels() {
return Labels;
}
From cdb2d5f5637ca4fac0ea3762372576a91673703d Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 29 May 2015 21:46:59 +0200
Subject: [PATCH 0085/1272] Modify test timing
---
.../core/command/EventsCmdImplTest.java | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
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 569283ce7..46600a160 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -68,13 +68,13 @@ public void testEventStreamTimeBound() throws InterruptedException,
EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback)
.withSince(startTime).withUntil(endTime);
ExecutorService executorService = eventsCmd.exec();
-
- boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
-
+
+ boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
+
executorService.shutdown();
eventCallback.close();
- assertTrue(zeroCount, "" + eventCallback.getEvents());
+ assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
}
@Test
@@ -91,10 +91,10 @@ public void testEventStreaming1() throws InterruptedException, IOException {
generateEvents();
- boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
+ boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
executorService.shutdown();
eventCallback.close();
- assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]");
+ assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
}
@Test
@@ -111,10 +111,10 @@ public void testEventStreaming2() throws InterruptedException, IOException {
generateEvents();
- boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS);
+ boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
executorService.shutdown();
eventCallback.close();
- assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]");
+ assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
}
/**
From 3923cd1ce0182ae0284ba5d3770451e3363ca1b5 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 29 May 2015 22:03:29 +0200
Subject: [PATCH 0086/1272] Debug log connection pool
---
pom.xml | 17 ++++++++++++-----
src/test/resources/logback.xml | 2 ++
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/pom.xml b/pom.xml
index f8eb34ced..ee80a9c9e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,4 +1,5 @@
-
+
4.0.0
@@ -84,7 +85,7 @@
${jackson-jaxrs.version}
- org.glassfish.jersey.connectors
+ org.glassfish.jersey.connectors
jersey-apache-connector
${jersey.version}
@@ -100,8 +101,8 @@
de.gesellix
- unix-socket-factory
- ${unix-socket-factory.version}
+ unix-socket-factory
+ ${unix-socket-factory.version}
@@ -129,6 +130,12 @@
slf4j-api
${slf4j-api.version}
+
+ org.slf4j
+ jcl-over-slf4j
+ 1.7.12
+
+
com.google.guava
guava
@@ -189,7 +196,7 @@
test
-
+
ossrh
diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml
index bdb0ee75a..bea30de0e 100644
--- a/src/test/resources/logback.xml
+++ b/src/test/resources/logback.xml
@@ -8,6 +8,8 @@
+
+
From a28cabb62ecf4dd1271eac92e26e83cd87f152ac Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Fri, 29 May 2015 22:13:43 +0200
Subject: [PATCH 0087/1272] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea3118178..b71f4e928 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,8 @@ Change Log
===
Latest SNAPSHOT
---
+* [#233](https://github.com/docker-java/docker-java/pull/233) Labels are array of Strings (fixes #232)
+* [#189](https://github.com/docker-java/docker-java/pull/189) Add docker stats support
v1.3.0
---
From 99f46efbcd09da305f8df2215e6d1ef6cdf1b2c3 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sat, 30 May 2015 00:21:00 +0300
Subject: [PATCH 0088/1272] VolumesFrom is an array
---
.../github/dockerjava/api/command/StartContainerCmd.java | 5 +++--
.../dockerjava/core/command/StartContainerCmdImpl.java | 7 ++++---
.../dockerjava/core/command/StartContainerCmdImplTest.java | 2 +-
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
index e76598e3e..aeddfd0bd 100644
--- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
@@ -10,6 +10,7 @@
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.api.model.VolumesFrom;
/**
* Start a container.
@@ -56,7 +57,7 @@ public static interface Exec extends DockerCmdExec {
public RestartPolicy getRestartPolicy();
- public String getVolumesFrom();
+ public VolumesFrom[] getVolumesFrom();
public Boolean isPrivileged();
@@ -165,6 +166,6 @@ public static interface Exec extends DockerCmdExec {
public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
@Deprecated
- public StartContainerCmd withVolumesFrom(String volumesFrom);
+ public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
}
diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
index dba35fb99..27fca12f8 100644
--- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
@@ -21,6 +21,7 @@
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.api.model.VolumesFrom;
/**
@@ -57,7 +58,7 @@ public class StartContainerCmdImpl extends AbstrDockerCmd
Date: Fri, 5 Jun 2015 18:58:11 +0200
Subject: [PATCH 0089/1272] Fix auto bind test
---
.../dockerjava/core/command/StartContainerCmdImplTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index 70108ae68..640839915 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -253,10 +253,10 @@ public void startContainerWithRandomPortBindings() throws DockerException {
.getExposedPorts()), contains(tcp22, tcp23));
assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
- .getBindings().get(tcp22)[0].getHostPort(), is(notNullValue()));
+ .getBindings().get(tcp22)[0].getHostPort(), is(not(equalTo(tcp22.getPort()))));
assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
- .getBindings().get(tcp23)[0], is(notNullValue()));
+ .getBindings().get(tcp23)[0].getHostPort(), is(not(equalTo(tcp23.getPort()))));
}
From 43a77ba567be3f366fec11e7f459c9aadf418813 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 5 Jun 2015 20:18:19 +0200
Subject: [PATCH 0090/1272] Add pool timeout
---
.../github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index b7469a43d..58f85e7ea 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -4,6 +4,7 @@
import java.io.IOException;
import java.net.URI;
+import java.util.concurrent.TimeUnit;
import com.github.dockerjava.api.command.*;
@@ -22,9 +23,11 @@
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
+
//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
// see https://github.com/docker-java/docker-java/issues/196
import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider;
+
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
@@ -84,7 +87,8 @@ public void init(DockerClientConfig dockerClientConfig) {
}
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
- getSchemeRegistry(originalUri, sslContext));
+ getSchemeRegistry(originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS);
+
if (dockerClientConfig.getMaxTotalConnections() != null)
connManager
@@ -315,7 +319,7 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
public EventsCmd.Exec createEventsCmdExec() {
return new EventsCmdExec(getBaseResource());
}
-
+
@Override
public StatsCmd.Exec createStatsCmdExec() {
return new StatsCmdExec(getBaseResource());
From 21b7c06b6c04af2d44ed578081d6dce6f98aa952 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 5 Jun 2015 20:50:39 +0200
Subject: [PATCH 0091/1272] Connect timeout of 10 seconds
---
.../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index 58f85e7ea..9e375f24a 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -72,6 +72,7 @@ public void init(DockerClientConfig dockerClientConfig) {
int readTimeout = dockerClientConfig.getReadTimeout();
clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout);
}
+ clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000);
URI originalUri = dockerClientConfig.getUri();
From 4c3e96466e8a45a8cb50122833417dfdad16a9a3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 5 Jun 2015 21:39:38 +0200
Subject: [PATCH 0092/1272] Added connection request timeout
---
.../com/github/dockerjava/jaxrs/connector/ApacheConnector.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
index 651db983d..d785bff7c 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
@@ -464,6 +464,9 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing
authCache.put(getHost(request), basicScheme);
context.setAuthCache(authCache);
}
+
+ context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build());
+
response = client.execute(getHost(request), request, context);
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(),
this.getClass().getName());
From 5c4b0b0fc42c9d0d070ad6dbd131ceec8d4346dc Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 5 Jun 2015 22:08:07 +0200
Subject: [PATCH 0093/1272] Connection request timeout
---
.../github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 8 +++++++-
.../dockerjava/jaxrs/connector/ApacheConnector.java | 2 +-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index 9e375f24a..1e77e5b26 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -16,6 +16,7 @@
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
+import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
@@ -24,6 +25,7 @@
import org.glassfish.jersey.CommonProperties;
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
+
//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
// see https://github.com/docker-java/docker-java/issues/196
import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider;
@@ -72,7 +74,8 @@ public void init(DockerClientConfig dockerClientConfig) {
int readTimeout = dockerClientConfig.getReadTimeout();
clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout);
}
- clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000);
+
+ //clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000);
URI originalUri = dockerClientConfig.getUri();
@@ -101,6 +104,9 @@ public void init(DockerClientConfig dockerClientConfig) {
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER,
connManager);
+ clientConfig.property(ApacheClientProperties.REQUEST_CONFIG,
+ RequestConfig.custom().setConnectionRequestTimeout(10).build());
+
ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(
clientConfig);
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
index d785bff7c..63fea0954 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java
@@ -465,7 +465,7 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing
context.setAuthCache(authCache);
}
- context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build());
+ //context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build());
response = client.execute(getHost(request), request, context);
HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(),
From 2c9e12c3541550cfd983f478fcec93a1666718df Mon Sep 17 00:00:00 2001
From: Zach Marshall
Date: Fri, 12 Jun 2015 15:27:23 -0400
Subject: [PATCH 0094/1272] Remove temp tar files created by
CompressArchiveUtil
CompressArchiveUtil creates tar files in a temporary directory, but
does not clean them up after. Call deleteOnExit on this file so that
they are automatically cleaned up when the JVM terminates.
---
.../java/com/github/dockerjava/core/CompressArchiveUtil.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
index 297adc766..0afd5171d 100644
--- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
+++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java
@@ -12,6 +12,7 @@ public class CompressArchiveUtil {
public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException {
File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar");
+ tarFile.deleteOnExit();
TarArchiveOutputStream tos = new TarArchiveOutputStream(new FileOutputStream(tarFile));
try {
tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
From d6aef1bc03e7cc64c2771314c607977d59996e4f Mon Sep 17 00:00:00 2001
From: scadge
Date: Mon, 15 Jun 2015 16:46:45 +0300
Subject: [PATCH 0095/1272] Added ReadonlyFs option.
---
.../github/dockerjava/api/model/HostConfig.java | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
index 9973e6252..6b8cdcd45 100644
--- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
@@ -27,6 +27,9 @@ public class HostConfig {
@JsonProperty("Privileged")
private boolean privileged;
+ @JsonProperty("ReadonlyRootfs")
+ private boolean readonlyRootfs;
+
@JsonProperty("Dns")
private String[] dns;
@@ -64,7 +67,7 @@ public HostConfig() {
}
public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts,
- boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile,
+ boolean privileged, boolean readonlyRootfs, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile,
Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices,
String[] extraHosts, Ulimit[] ulimits) {
this.binds = new Binds(binds);
@@ -73,6 +76,7 @@ public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindi
this.portBindings = portBindings;
this.publishAllPorts = publishAllPorts;
this.privileged = privileged;
+ this.readonlyRootfs = readonlyRootfs;
this.dns = dns;
this.dnsSearch = dnsSearch;
this.volumesFrom = volumesFrom;
@@ -95,7 +99,7 @@ public Bind[] getBinds() {
public LxcConf[] getLxcConf() {
return lxcConf;
}
-
+
public Ports getPortBindings() {
return portBindings;
}
@@ -108,6 +112,10 @@ public boolean isPrivileged() {
return privileged;
}
+ public boolean isReadonlyRootfs() {
+ return readonlyRootfs;
+ }
+
public String[] getDns() {
return dns;
}
@@ -183,6 +191,10 @@ public void setPrivileged(boolean privileged) {
this.privileged = privileged;
}
+ public void setReadonlyRootfs(boolean readonlyRootfs) {
+ this.readonlyRootfs = readonlyRootfs;
+ }
+
public void setDns(String[] dns) {
this.dns = dns;
}
From 3c4b71bd42ec82cc6829dfad41eb6160f8f69e6e Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:11:13 +0200
Subject: [PATCH 0096/1272] Adjust timeout
---
.../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index 1e77e5b26..8a5d5d879 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -105,7 +105,7 @@ public void init(DockerClientConfig dockerClientConfig) {
connManager);
clientConfig.property(ApacheClientProperties.REQUEST_CONFIG,
- RequestConfig.custom().setConnectionRequestTimeout(10).build());
+ RequestConfig.custom().setConnectionRequestTimeout(1000).build());
ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(
clientConfig);
From eb8be7593f583e9a31b71cc49f7abc1431c283af Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:14:20 +0200
Subject: [PATCH 0097/1272] Ignore test in CircleCI
---
.../com/github/dockerjava/core/command/EventsCmdImplTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 46600a160..0d61c8f59 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -97,7 +97,7 @@ public void testEventStreaming1() throws InterruptedException, IOException {
assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
}
- @Test
+ @Test(groups = "ignoreInCircleCi")
public void testEventStreaming2() throws InterruptedException, IOException {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
From 480a7fefc3205b4483ce0cabf21852e936fef365 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 16 Jun 2015 21:28:37 +0200
Subject: [PATCH 0098/1272] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 7948c6776..a4c18a0ce 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
Java API client for [Docker](http://docs.docker.io/ "Docker")
-Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/sources/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x
+Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x
The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries!
From 591e871e09288a6484f6cb3f4cb9349b4237f96e Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:35:52 +0200
Subject: [PATCH 0099/1272] Add Domainname attribute on create command
---
.../api/command/CreateContainerCmd.java | 66 ++++++++++---------
.../core/command/CreateContainerCmdImpl.java | 23 +++++--
2 files changed, 53 insertions(+), 36 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index 708e3139a..fa8f40f33 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -44,7 +44,7 @@ public CreateContainerResponse exec() throws NotFoundException,
public Device[] getDevices();
public String[] getDns();
-
+
public String[] getDnsSearch();
public String[] getEntrypoint();
@@ -52,19 +52,21 @@ public CreateContainerResponse exec() throws NotFoundException,
public String[] getEnv();
public ExposedPort[] getExposedPorts();
-
+
public String[] getExtraHosts();
public HostConfig getHostConfig();
public String getHostName();
+ public String getDomainName();
+
public String getImage();
public Link[] getLinks();
-
+
public LxcConf[] getLxcConf();
-
+
public String getMacAddress();
public long getMemoryLimit();
@@ -72,13 +74,13 @@ public CreateContainerResponse exec() throws NotFoundException,
public long getMemorySwap();
public String getName();
-
+
public String getNetworkMode();
-
+
public Ports getPortBindings();
public String[] getPortSpecs();
-
+
public RestartPolicy getRestartPolicy();
public String getUser();
@@ -96,9 +98,9 @@ public CreateContainerResponse exec() throws NotFoundException,
public boolean isAttachStdout();
public boolean isNetworkDisabled();
-
+
public Boolean isPrivileged();
-
+
public Boolean isPublishAllPorts();
public boolean isStdInOnce();
@@ -110,9 +112,9 @@ public CreateContainerResponse exec() throws NotFoundException,
public CreateContainerCmd withAttachStderr(boolean attachStderr);
public CreateContainerCmd withAttachStdin(boolean attachStdin);
-
+
public CreateContainerCmd withAttachStdout(boolean attachStdout);
-
+
public CreateContainerCmd withBinds(Bind... binds);
/**
@@ -134,9 +136,9 @@ public CreateContainerResponse exec() throws NotFoundException,
public CreateContainerCmd withCmd(String... cmd);
public CreateContainerCmd withCpuset(String cpuset);
-
+
public CreateContainerCmd withCpuShares(int cpuShares);
-
+
/**
* Add host devices to the container
*/
@@ -148,7 +150,7 @@ public CreateContainerResponse exec() throws NotFoundException,
* Set custom DNS servers
*/
public CreateContainerCmd withDns(String... dns);
-
+
/**
* Set custom DNS search domains
*/
@@ -157,33 +159,35 @@ public CreateContainerResponse exec() throws NotFoundException,
public CreateContainerCmd withEntrypoint(String... entrypoint);
public CreateContainerCmd withEnv(String... env);
-
+
public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
-
+
/**
* Add hostnames to /etc/hosts in the container
*/
public CreateContainerCmd withExtraHosts(String... extraHosts);
-
+
public CreateContainerCmd withHostConfig(HostConfig hostConfig);
public CreateContainerCmd withHostName(String hostName);
+ public CreateContainerCmd withDomainName(String domainName);
+
public CreateContainerCmd withImage(String image);
/**
* Add link to another container.
*/
public CreateContainerCmd withLinks(Link... links);
-
+
public CreateContainerCmd withLxcConf(LxcConf... lxcConf);
public CreateContainerCmd withMemoryLimit(long memoryLimit);
-
+
public CreateContainerCmd withMemorySwap(long memorySwap);
-
+
public CreateContainerCmd withName(String name);
-
+
/**
* Set the Network mode for the container
@@ -198,28 +202,28 @@ public CreateContainerResponse exec() throws NotFoundException,
*
*/
public CreateContainerCmd withNetworkMode(String networkMode);
-
+
/**
* Add one or more {@link PortBinding}s.
* This corresponds to the --publish (-p)
* option of the docker run CLI command.
*/
public CreateContainerCmd withPortBindings(PortBinding... portBindings);
-
+
/**
* Add the port bindings that are contained in the given {@link Ports}
* object.
- *
+ *
* @see #withPortBindings(PortBinding...)
*/
public CreateContainerCmd withPortBindings(Ports portBindings);
public CreateContainerCmd withPortSpecs(String... portSpecs);
-
+
public CreateContainerCmd withPrivileged(boolean privileged);
-
+
public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts);
-
+
/**
* Set custom {@link RestartPolicy} for the container. Defaults to
* {@link RestartPolicy#noRestart()}
@@ -231,13 +235,13 @@ public CreateContainerResponse exec() throws NotFoundException,
public CreateContainerCmd withStdinOpen(boolean stdinOpen);
public CreateContainerCmd withTty(boolean tty);
-
+
public CreateContainerCmd withUser(String user);
-
+
public CreateContainerCmd withVolumes(Volume... volumes);
-
+
public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
-
+
public CreateContainerCmd withWorkingDir(String workingDir);
public CreateContainerCmd withMacAddress(String macAddress);
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 18b089d4d..4b3f064e2 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -26,9 +26,9 @@
import com.github.dockerjava.api.model.Volumes;
/**
- *
+ *
* Creates a new container.
- *
+ *
*/
public class CreateContainerCmdImpl extends
AbstrDockerCmd implements
@@ -38,6 +38,8 @@ public class CreateContainerCmdImpl extends
@JsonProperty("Hostname")
private String hostName = "";
+ @JsonProperty("Domainname")
+ private String domainName = "";
@JsonProperty("User")
private String user = "";
@JsonProperty("Memory")
@@ -182,6 +184,11 @@ public String getHostName() {
return hostName;
}
+ @Override
+ public String getDomainName() {
+ return domainName;
+ }
+
@Override
public String getImage() {
return image;
@@ -198,7 +205,7 @@ public Link[] getLinks() {
public LxcConf[] getLxcConf() {
return hostConfig.getLxcConf();
}
-
+
public String getMacAddress() {
return macAddress;
}
@@ -432,6 +439,12 @@ public CreateContainerCmdImpl withHostName(String hostName) {
return this;
}
+ @Override
+ public CreateContainerCmdImpl withDomainName(String domainName) {
+ this.domainName = domainName;
+ return this;
+ }
+
@Override
public CreateContainerCmdImpl withImage(String image) {
this.image = image;
@@ -451,7 +464,7 @@ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
this.hostConfig.setLxcConf(lxcConf);
return this;
}
-
+
@Override
public CreateContainerCmdImpl withMacAddress(String macAddress) {
this.macAddress = macAddress;
@@ -515,7 +528,7 @@ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
this.hostConfig.setPublishAllPorts(publishAllPorts);
return this;
}
-
+
@Override
public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
this.hostConfig.setRestartPolicy(restartPolicy);
From f3900a3c76ea53c51283a3130d81eab5d106f29c Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:40:56 +0200
Subject: [PATCH 0100/1272] code formatting
---
.../core/command/CreateContainerCmdImpl.java | 1090 +++++++++--------
1 file changed, 555 insertions(+), 535 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 4b3f064e2..cc082b61f 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -30,551 +30,571 @@
* Creates a new container.
*
*/
-public class CreateContainerCmdImpl extends
- AbstrDockerCmd implements
- CreateContainerCmd {
+public class CreateContainerCmdImpl extends AbstrDockerCmd implements
+ CreateContainerCmd {
- private String name;
+ private String name;
- @JsonProperty("Hostname")
- private String hostName = "";
- @JsonProperty("Domainname")
+ @JsonProperty("Hostname")
+ private String hostName = "";
+
+ @JsonProperty("Domainname")
private String domainName = "";
- @JsonProperty("User")
- private String user = "";
- @JsonProperty("Memory")
- private long memoryLimit = 0;
- @JsonProperty("MemorySwap")
- private long memorySwap = 0;
- @JsonProperty("CpuShares")
- private int cpuShares = 0;
- @JsonProperty("Cpuset")
- private String cpuset;
- @JsonProperty("AttachStdin")
- private boolean attachStdin = false;
- @JsonProperty("AttachStdout")
- private boolean attachStdout = false;
- @JsonProperty("AttachStderr")
- private boolean attachStderr = false;
- @JsonProperty("PortSpecs")
- private String[] portSpecs;
- @JsonProperty("Tty")
- private boolean tty = false;
- @JsonProperty("OpenStdin")
- private boolean stdinOpen = false;
- @JsonProperty("StdinOnce")
- private boolean stdInOnce = false;
- @JsonProperty("Env")
- private String[] env;
- @JsonProperty("Cmd")
- private String[] cmd;
- @JsonProperty("Entrypoint")
- private String[] entrypoint;
- @JsonProperty("Image")
- private String image;
- @JsonProperty("Volumes")
- private Volumes volumes = new Volumes();
- @JsonProperty("WorkingDir")
- private String workingDir = "";
- @JsonProperty("MacAddress")
- private String macAddress;
- @JsonProperty("NetworkDisabled")
- private boolean networkDisabled = false;
- @JsonProperty("ExposedPorts")
- private ExposedPorts exposedPorts = new ExposedPorts();
- @JsonProperty("HostConfig")
- private HostConfig hostConfig = new HostConfig();
-
- public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
- super(exec);
- checkNotNull(image, "image was not specified");
- withImage(image);
- }
-
- /**
- * @throws NotFoundException
- * No such container
- * @throws ConflictException
- * Named container already exists
- */
- @Override
- public CreateContainerResponse exec() throws NotFoundException,
- ConflictException {
- return super.exec();
- }
-
- @Override
- @JsonIgnore
- public Bind[] getBinds() {
- return hostConfig.getBinds();
- }
-
- @Override
- public Capability[] getCapAdd() {
- return hostConfig.getCapAdd();
- }
-
- @Override
- public Capability[] getCapDrop() {
- return hostConfig.getCapDrop();
- }
-
- @Override
- public String[] getCmd() {
- return cmd;
- }
-
- @Override
- public String getCpuset() {
- return cpuset;
- }
-
- @Override
- public int getCpuShares() {
- return cpuShares;
- }
-
- @Override
- @JsonIgnore
- public Device[] getDevices() {
- return hostConfig.getDevices();
- }
-
- @Override
- @JsonIgnore
- public String[] getDns() {
- return hostConfig.getDns();
- }
-
- @Override
- @JsonIgnore
- public String[] getDnsSearch() {
- return hostConfig.getDnsSearch();
- }
-
- @Override
- public String[] getEntrypoint() {
- return entrypoint;
- }
-
- @Override
- public String[] getEnv() {
- return env;
- }
-
- @Override
- @JsonIgnore
- public ExposedPort[] getExposedPorts() {
- return exposedPorts.getExposedPorts();
- }
-
- @Override
- @JsonIgnore
- public String[] getExtraHosts() {
- return hostConfig.getExtraHosts();
- }
-
- @Override
- public HostConfig getHostConfig() {
- return hostConfig;
- }
-
- @Override
- public String getHostName() {
- return hostName;
- }
-
- @Override
- public String getDomainName() {
+
+ @JsonProperty("User")
+ private String user = "";
+
+ @JsonProperty("Memory")
+ private long memoryLimit = 0;
+
+ @JsonProperty("MemorySwap")
+ private long memorySwap = 0;
+
+ @JsonProperty("CpuShares")
+ private int cpuShares = 0;
+
+ @JsonProperty("Cpuset")
+ private String cpuset;
+
+ @JsonProperty("AttachStdin")
+ private boolean attachStdin = false;
+
+ @JsonProperty("AttachStdout")
+ private boolean attachStdout = false;
+
+ @JsonProperty("AttachStderr")
+ private boolean attachStderr = false;
+
+ @JsonProperty("PortSpecs")
+ private String[] portSpecs;
+
+ @JsonProperty("Tty")
+ private boolean tty = false;
+
+ @JsonProperty("OpenStdin")
+ private boolean stdinOpen = false;
+
+ @JsonProperty("StdinOnce")
+ private boolean stdInOnce = false;
+
+ @JsonProperty("Env")
+ private String[] env;
+
+ @JsonProperty("Cmd")
+ private String[] cmd;
+
+ @JsonProperty("Entrypoint")
+ private String[] entrypoint;
+
+ @JsonProperty("Image")
+ private String image;
+
+ @JsonProperty("Volumes")
+ private Volumes volumes = new Volumes();
+
+ @JsonProperty("WorkingDir")
+ private String workingDir = "";
+
+ @JsonProperty("MacAddress")
+ private String macAddress;
+
+ @JsonProperty("NetworkDisabled")
+ private boolean networkDisabled = false;
+
+ @JsonProperty("ExposedPorts")
+ private ExposedPorts exposedPorts = new ExposedPorts();
+
+ @JsonProperty("HostConfig")
+ private HostConfig hostConfig = new HostConfig();
+
+ public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
+ super(exec);
+ checkNotNull(image, "image was not specified");
+ withImage(image);
+ }
+
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws ConflictException
+ * Named container already exists
+ */
+ @Override
+ public CreateContainerResponse exec() throws NotFoundException, ConflictException {
+ return super.exec();
+ }
+
+ @Override
+ @JsonIgnore
+ public Bind[] getBinds() {
+ return hostConfig.getBinds();
+ }
+
+ @Override
+ public Capability[] getCapAdd() {
+ return hostConfig.getCapAdd();
+ }
+
+ @Override
+ public Capability[] getCapDrop() {
+ return hostConfig.getCapDrop();
+ }
+
+ @Override
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ @Override
+ public String getCpuset() {
+ return cpuset;
+ }
+
+ @Override
+ public int getCpuShares() {
+ return cpuShares;
+ }
+
+ @Override
+ @JsonIgnore
+ public Device[] getDevices() {
+ return hostConfig.getDevices();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getDns() {
+ return hostConfig.getDns();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getDnsSearch() {
+ return hostConfig.getDnsSearch();
+ }
+
+ @Override
+ public String[] getEntrypoint() {
+ return entrypoint;
+ }
+
+ @Override
+ public String[] getEnv() {
+ return env;
+ }
+
+ @Override
+ @JsonIgnore
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts.getExposedPorts();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getExtraHosts() {
+ return hostConfig.getExtraHosts();
+ }
+
+ @Override
+ public HostConfig getHostConfig() {
+ return hostConfig;
+ }
+
+ @Override
+ public String getHostName() {
+ return hostName;
+ }
+
+ @Override
+ public String getDomainName() {
return domainName;
}
- @Override
- public String getImage() {
- return image;
- }
-
- @Override
- @JsonIgnore
- public Link[] getLinks() {
- return hostConfig.getLinks();
- }
-
- @Override
- @JsonIgnore
- public LxcConf[] getLxcConf() {
- return hostConfig.getLxcConf();
- }
-
- public String getMacAddress() {
- return macAddress;
- }
-
- @Override
- public long getMemoryLimit() {
- return memoryLimit;
- }
-
- @Override
- public long getMemorySwap() {
- return memorySwap;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- @JsonIgnore
- public String getNetworkMode() {
- return hostConfig.getNetworkMode();
- }
-
- @Override
- @JsonIgnore
- public Ports getPortBindings() {
- return hostConfig.getPortBindings();
- }
-
- @Override
- public String[] getPortSpecs() {
- return portSpecs;
- }
-
- @Override
- @JsonIgnore
- public RestartPolicy getRestartPolicy() {
- return hostConfig.getRestartPolicy();
- }
-
- @Override
- public String getUser() {
- return user;
- }
-
- @Override
- @JsonIgnore
- public Volume[] getVolumes() {
- return volumes.getVolumes();
- }
-
- @Override
- @JsonIgnore
- public VolumesFrom[] getVolumesFrom() {
- return hostConfig.getVolumesFrom();
- }
-
- @Override
- public String getWorkingDir() {
- return workingDir;
- }
-
- @Override
- public boolean isAttachStderr() {
- return attachStderr;
- }
-
- @Override
- public boolean isAttachStdin() {
- return attachStdin;
- }
-
- @Override
- public boolean isAttachStdout() {
- return attachStdout;
- }
-
- @Override
- public boolean isNetworkDisabled() {
- return networkDisabled;
- }
-
- @Override
- @JsonIgnore
- public Boolean isPrivileged() {
- return hostConfig.isPrivileged();
- }
-
- @Override
- @JsonIgnore
- public Boolean isPublishAllPorts() {
- return hostConfig.isPublishAllPorts();
- }
-
- @Override
- public boolean isStdInOnce() {
- return stdInOnce;
- }
-
- @Override
- public boolean isStdinOpen() {
- return stdinOpen;
- }
-
- @Override
- public boolean isTty() {
- return tty;
- }
-
- @Override
- public String toString() {
- return new ToStringBuilder(this).append("create container ")
- .append(name != null ? "name=" + name + " " : "").append(this)
- .toString();
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
- this.attachStderr = attachStderr;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
- this.attachStdin = attachStdin;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
- this.attachStdout = attachStdout;
- return this;
- }
-
- @Override
- public CreateContainerCmd withBinds(Bind... binds) {
- hostConfig.setBinds(binds);
- return this;
- }
-
- @Override
- public CreateContainerCmd withCapAdd(Capability... capAdd) {
- hostConfig.setCapAdd(capAdd);
- return this;
- }
-
- @Override
- public CreateContainerCmd withCapDrop(Capability... capDrop) {
- hostConfig.setCapDrop(capDrop);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCmd(String... cmd) {
- this.cmd = cmd;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCpuset(String cpuset) {
- this.cpuset = cpuset;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCpuShares(int cpuShares) {
- this.cpuShares = cpuShares;
- return this;
- }
-
- @Override
- public CreateContainerCmd withDevices(Device... devices) {
- this.hostConfig.setDevices(devices);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) {
- this.networkDisabled = disableNetwork;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withDns(String... dns) {
- this.hostConfig.setDns(dns);
- return this;
- }
-
- @Override
- public CreateContainerCmd withDnsSearch(String... dnsSearch) {
- this.hostConfig.setDnsSearch(dnsSearch);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
- this.entrypoint = entrypoint;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withEnv(String... env) {
- this.env = env;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
- this.exposedPorts = new ExposedPorts(exposedPorts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withExtraHosts(String... extraHosts) {
- this.hostConfig.setExtraHosts(extraHosts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
- checkNotNull(hostConfig, "no host config was specified");
- this.hostConfig = hostConfig;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withHostName(String hostName) {
- this.hostName = hostName;
- return this;
- }
-
- @Override
+ @Override
+ public String getImage() {
+ return image;
+ }
+
+ @Override
+ @JsonIgnore
+ public Link[] getLinks() {
+ return hostConfig.getLinks();
+ }
+
+ @Override
+ @JsonIgnore
+ public LxcConf[] getLxcConf() {
+ return hostConfig.getLxcConf();
+ }
+
+ public String getMacAddress() {
+ return macAddress;
+ }
+
+ @Override
+ public long getMemoryLimit() {
+ return memoryLimit;
+ }
+
+ @Override
+ public long getMemorySwap() {
+ return memorySwap;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ @JsonIgnore
+ public String getNetworkMode() {
+ return hostConfig.getNetworkMode();
+ }
+
+ @Override
+ @JsonIgnore
+ public Ports getPortBindings() {
+ return hostConfig.getPortBindings();
+ }
+
+ @Override
+ public String[] getPortSpecs() {
+ return portSpecs;
+ }
+
+ @Override
+ @JsonIgnore
+ public RestartPolicy getRestartPolicy() {
+ return hostConfig.getRestartPolicy();
+ }
+
+ @Override
+ public String getUser() {
+ return user;
+ }
+
+ @Override
+ @JsonIgnore
+ public Volume[] getVolumes() {
+ return volumes.getVolumes();
+ }
+
+ @Override
+ @JsonIgnore
+ public VolumesFrom[] getVolumesFrom() {
+ return hostConfig.getVolumesFrom();
+ }
+
+ @Override
+ public String getWorkingDir() {
+ return workingDir;
+ }
+
+ @Override
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
+
+ @Override
+ public boolean isAttachStdin() {
+ return attachStdin;
+ }
+
+ @Override
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ @Override
+ public boolean isNetworkDisabled() {
+ return networkDisabled;
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPrivileged() {
+ return hostConfig.isPrivileged();
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPublishAllPorts() {
+ return hostConfig.isPublishAllPorts();
+ }
+
+ @Override
+ public boolean isStdInOnce() {
+ return stdInOnce;
+ }
+
+ @Override
+ public boolean isStdinOpen() {
+ return stdinOpen;
+ }
+
+ @Override
+ public boolean isTty() {
+ return tty;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("create container ").append(name != null ? "name=" + name + " " : "")
+ .append(this).toString();
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
+ this.attachStderr = attachStderr;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
+ this.attachStdin = attachStdin;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
+ this.attachStdout = attachStdout;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withBinds(Bind... binds) {
+ hostConfig.setBinds(binds);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withCapAdd(Capability... capAdd) {
+ hostConfig.setCapAdd(capAdd);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withCapDrop(Capability... capDrop) {
+ hostConfig.setCapDrop(capDrop);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCmd(String... cmd) {
+ this.cmd = cmd;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCpuset(String cpuset) {
+ this.cpuset = cpuset;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCpuShares(int cpuShares) {
+ this.cpuShares = cpuShares;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withDevices(Device... devices) {
+ this.hostConfig.setDevices(devices);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) {
+ this.networkDisabled = disableNetwork;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withDns(String... dns) {
+ this.hostConfig.setDns(dns);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withDnsSearch(String... dnsSearch) {
+ this.hostConfig.setDnsSearch(dnsSearch);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
+ this.entrypoint = entrypoint;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withEnv(String... env) {
+ this.env = env;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
+ this.exposedPorts = new ExposedPorts(exposedPorts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withExtraHosts(String... extraHosts) {
+ this.hostConfig.setExtraHosts(extraHosts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
+ checkNotNull(hostConfig, "no host config was specified");
+ this.hostConfig = hostConfig;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withHostName(String hostName) {
+ this.hostName = hostName;
+ return this;
+ }
+
+ @Override
public CreateContainerCmdImpl withDomainName(String domainName) {
this.domainName = domainName;
return this;
}
- @Override
- public CreateContainerCmdImpl withImage(String image) {
- this.image = image;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withLinks(Link... links) {
- checkNotNull(links, "links was not specified");
- this.hostConfig.setLinks(links);
- return this;
- }
-
- @Override
- public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
- checkNotNull(lxcConf, "lxcConf was not specified");
- this.hostConfig.setLxcConf(lxcConf);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMacAddress(String macAddress) {
- this.macAddress = macAddress;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
- this.memoryLimit = memoryLimit;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
- this.memorySwap = memorySwap;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withName(String name) {
- checkNotNull(name, "name was not specified");
- this.name = name;
- return this;
- }
-
- @Override
- public CreateContainerCmd withNetworkMode(String networkMode) {
- checkNotNull(networkMode, "networkMode was not specified");
- this.hostConfig.setNetworkMode(networkMode);
- return this;
- }
-
- @Override
- public CreateContainerCmd withPortBindings(PortBinding... portBindings) {
- checkNotNull(portBindings, "portBindings was not specified");
- this.hostConfig.setPortBindings(new Ports(portBindings));
- return this;
- }
-
- @Override
- public CreateContainerCmd withPortBindings(Ports portBindings) {
- checkNotNull(portBindings, "portBindings was not specified");
- this.hostConfig.setPortBindings(portBindings);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
- this.portSpecs = portSpecs;
- return this;
- }
-
- @Override
- public CreateContainerCmd withPrivileged(boolean privileged) {
- this.hostConfig.setPrivileged(privileged);
- return this;
- }
-
- @Override
- public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
- this.hostConfig.setPublishAllPorts(publishAllPorts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
- this.hostConfig.setRestartPolicy(restartPolicy);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
- this.stdInOnce = stdInOnce;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
- this.stdinOpen = stdinOpen;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withTty(boolean tty) {
- this.tty = tty;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withUser(String user) {
- this.user = user;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withVolumes(Volume... volumes) {
- this.volumes = new Volumes(volumes);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) {
- this.hostConfig.setVolumesFrom(volumesFrom);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withWorkingDir(String workingDir) {
- this.workingDir = workingDir;
- return this;
- }
+ @Override
+ public CreateContainerCmdImpl withImage(String image) {
+ this.image = image;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withLinks(Link... links) {
+ checkNotNull(links, "links was not specified");
+ this.hostConfig.setLinks(links);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
+ checkNotNull(lxcConf, "lxcConf was not specified");
+ this.hostConfig.setLxcConf(lxcConf);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMacAddress(String macAddress) {
+ this.macAddress = macAddress;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
+ this.memoryLimit = memoryLimit;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
+ this.memorySwap = memorySwap;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withName(String name) {
+ checkNotNull(name, "name was not specified");
+ this.name = name;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withNetworkMode(String networkMode) {
+ checkNotNull(networkMode, "networkMode was not specified");
+ this.hostConfig.setNetworkMode(networkMode);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(PortBinding... portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(new Ports(portBindings));
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(Ports portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(portBindings);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
+ this.portSpecs = portSpecs;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPrivileged(boolean privileged) {
+ this.hostConfig.setPrivileged(privileged);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
+ this.hostConfig.setPublishAllPorts(publishAllPorts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
+ this.hostConfig.setRestartPolicy(restartPolicy);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
+ this.stdInOnce = stdInOnce;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
+ this.stdinOpen = stdinOpen;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withTty(boolean tty) {
+ this.tty = tty;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withVolumes(Volume... volumes) {
+ this.volumes = new Volumes(volumes);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) {
+ this.hostConfig.setVolumesFrom(volumesFrom);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withWorkingDir(String workingDir) {
+ this.workingDir = workingDir;
+ return this;
+ }
}
From 36a17bfdbfc9bcfb148253fb9469365fd1ecc2c2 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:40:56 +0200
Subject: [PATCH 0101/1272] code formatting
---
.../api/command/CreateContainerCmd.java | 283 +++--
.../core/command/CreateContainerCmdImpl.java | 1090 +++++++++--------
2 files changed, 693 insertions(+), 680 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index fa8f40f33..be6e83adf 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -16,234 +16,227 @@
import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.core.command.CreateContainerCmdImpl;
-public interface CreateContainerCmd extends DockerCmd{
+public interface CreateContainerCmd extends DockerCmd {
- public static interface Exec extends DockerCmdExec {
- }
+ public static interface Exec extends DockerCmdExec {
+ }
- /**
- * @throws NotFoundException No such container
- * @throws ConflictException Named container already exists
- */
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws ConflictException
+ * Named container already exists
+ */
@Override
- public CreateContainerResponse exec() throws NotFoundException,
- ConflictException;
+ public CreateContainerResponse exec() throws NotFoundException, ConflictException;
- public Bind[] getBinds();
+ public Bind[] getBinds();
- public Capability[] getCapAdd();
+ public Capability[] getCapAdd();
- public Capability[] getCapDrop();
+ public Capability[] getCapDrop();
- public String[] getCmd();
+ public String[] getCmd();
- public String getCpuset();
+ public String getCpuset();
- public int getCpuShares();
+ public int getCpuShares();
- public Device[] getDevices();
+ public Device[] getDevices();
- public String[] getDns();
+ public String[] getDns();
- public String[] getDnsSearch();
+ public String[] getDnsSearch();
- public String[] getEntrypoint();
+ public String[] getEntrypoint();
- public String[] getEnv();
+ public String[] getEnv();
- public ExposedPort[] getExposedPorts();
+ public ExposedPort[] getExposedPorts();
- public String[] getExtraHosts();
+ public String[] getExtraHosts();
- public HostConfig getHostConfig();
+ public HostConfig getHostConfig();
- public String getHostName();
+ public String getHostName();
- public String getDomainName();
+ public String getDomainName();
- public String getImage();
+ public String getImage();
- public Link[] getLinks();
+ public Link[] getLinks();
- public LxcConf[] getLxcConf();
+ public LxcConf[] getLxcConf();
- public String getMacAddress();
+ public String getMacAddress();
- public long getMemoryLimit();
+ public long getMemoryLimit();
- public long getMemorySwap();
+ public long getMemorySwap();
- public String getName();
+ public String getName();
- public String getNetworkMode();
+ public String getNetworkMode();
- public Ports getPortBindings();
+ public Ports getPortBindings();
- public String[] getPortSpecs();
+ public String[] getPortSpecs();
- public RestartPolicy getRestartPolicy();
+ public RestartPolicy getRestartPolicy();
- public String getUser();
+ public String getUser();
- public Volume[] getVolumes();
+ public Volume[] getVolumes();
- public VolumesFrom[] getVolumesFrom();
+ public VolumesFrom[] getVolumesFrom();
- public String getWorkingDir();
+ public String getWorkingDir();
- public boolean isAttachStderr();
+ public boolean isAttachStderr();
- public boolean isAttachStdin();
+ public boolean isAttachStdin();
- public boolean isAttachStdout();
+ public boolean isAttachStdout();
- public boolean isNetworkDisabled();
+ public boolean isNetworkDisabled();
- public Boolean isPrivileged();
+ public Boolean isPrivileged();
- public Boolean isPublishAllPorts();
+ public Boolean isPublishAllPorts();
- public boolean isStdInOnce();
+ public boolean isStdInOnce();
- public boolean isStdinOpen();
+ public boolean isStdinOpen();
- public boolean isTty();
+ public boolean isTty();
- public CreateContainerCmd withAttachStderr(boolean attachStderr);
+ public CreateContainerCmd withAttachStderr(boolean attachStderr);
- public CreateContainerCmd withAttachStdin(boolean attachStdin);
+ public CreateContainerCmd withAttachStdin(boolean attachStdin);
- public CreateContainerCmd withAttachStdout(boolean attachStdout);
+ public CreateContainerCmd withAttachStdout(boolean attachStdout);
- public CreateContainerCmd withBinds(Bind... binds);
+ public CreateContainerCmd withBinds(Bind... binds);
- /**
- * Add linux kernel
- * capability to the container. For example: adding {@link Capability#MKNOD}
- * allows the container to create special files using the 'mknod' command.
- */
- public CreateContainerCmd withCapAdd(Capability... capAdd);
+ /**
+ * Add linux kernel capability to the
+ * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the
+ * 'mknod' command.
+ */
+ public CreateContainerCmd withCapAdd(Capability... capAdd);
- /**
- * Drop linux kernel
- * capability from the container. For example: dropping {@link Capability#CHOWN}
- * prevents the container from changing the owner of any files.
- */
- public CreateContainerCmd withCapDrop(Capability... capDrop);
+ /**
+ * Drop linux kernel capability from the
+ * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any
+ * files.
+ */
+ public CreateContainerCmd withCapDrop(Capability... capDrop);
- public CreateContainerCmd withCmd(String... cmd);
+ public CreateContainerCmd withCmd(String... cmd);
- public CreateContainerCmd withCpuset(String cpuset);
+ public CreateContainerCmd withCpuset(String cpuset);
- public CreateContainerCmd withCpuShares(int cpuShares);
+ public CreateContainerCmd withCpuShares(int cpuShares);
- /**
- * Add host devices to the container
- */
- public CreateContainerCmd withDevices(Device... devices);
+ /**
+ * Add host devices to the container
+ */
+ public CreateContainerCmd withDevices(Device... devices);
- public CreateContainerCmd withNetworkDisabled(boolean disableNetwork);
+ public CreateContainerCmd withNetworkDisabled(boolean disableNetwork);
- /**
- * Set custom DNS servers
- */
- public CreateContainerCmd withDns(String... dns);
+ /**
+ * Set custom DNS servers
+ */
+ public CreateContainerCmd withDns(String... dns);
- /**
- * Set custom DNS search domains
- */
- public CreateContainerCmd withDnsSearch(String... dnsSearch);
+ /**
+ * Set custom DNS search domains
+ */
+ public CreateContainerCmd withDnsSearch(String... dnsSearch);
- public CreateContainerCmd withEntrypoint(String... entrypoint);
+ public CreateContainerCmd withEntrypoint(String... entrypoint);
- public CreateContainerCmd withEnv(String... env);
+ public CreateContainerCmd withEnv(String... env);
- public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
+ public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
- /**
- * Add hostnames to /etc/hosts in the container
- */
- public CreateContainerCmd withExtraHosts(String... extraHosts);
+ /**
+ * Add hostnames to /etc/hosts in the container
+ */
+ public CreateContainerCmd withExtraHosts(String... extraHosts);
- public CreateContainerCmd withHostConfig(HostConfig hostConfig);
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig);
- public CreateContainerCmd withHostName(String hostName);
+ public CreateContainerCmd withHostName(String hostName);
- public CreateContainerCmd withDomainName(String domainName);
+ public CreateContainerCmd withDomainName(String domainName);
- public CreateContainerCmd withImage(String image);
+ public CreateContainerCmd withImage(String image);
- /**
- * Add link to another container.
- */
- public CreateContainerCmd withLinks(Link... links);
+ /**
+ * Add link to another container.
+ */
+ public CreateContainerCmd withLinks(Link... links);
- public CreateContainerCmd withLxcConf(LxcConf... lxcConf);
+ public CreateContainerCmd withLxcConf(LxcConf... lxcConf);
- public CreateContainerCmd withMemoryLimit(long memoryLimit);
+ public CreateContainerCmd withMemoryLimit(long memoryLimit);
- public CreateContainerCmd withMemorySwap(long memorySwap);
+ public CreateContainerCmd withMemorySwap(long memorySwap);
- public CreateContainerCmd withName(String name);
+ public CreateContainerCmd withName(String name);
+ /**
+ * 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.
+ *
+ */
+ public CreateContainerCmd withNetworkMode(String networkMode);
- /**
- * 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.
- *
- */
- public CreateContainerCmd withNetworkMode(String networkMode);
+ /**
+ * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of
+ * the docker run CLI command.
+ */
+ public CreateContainerCmd withPortBindings(PortBinding... portBindings);
- /**
- * Add one or more {@link PortBinding}s.
- * This corresponds to the --publish (-p)
- * option of the docker run CLI command.
- */
- public CreateContainerCmd withPortBindings(PortBinding... portBindings);
+ /**
+ * Add the port bindings that are contained in the given {@link Ports} object.
+ *
+ * @see #withPortBindings(PortBinding...)
+ */
+ public CreateContainerCmd withPortBindings(Ports portBindings);
- /**
- * Add the port bindings that are contained in the given {@link Ports}
- * object.
- *
- * @see #withPortBindings(PortBinding...)
- */
- public CreateContainerCmd withPortBindings(Ports portBindings);
+ public CreateContainerCmd withPortSpecs(String... portSpecs);
- public CreateContainerCmd withPortSpecs(String... portSpecs);
+ public CreateContainerCmd withPrivileged(boolean privileged);
- public CreateContainerCmd withPrivileged(boolean privileged);
+ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts);
- public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts);
+ /**
+ * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()}
+ */
+ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
- /**
- * Set custom {@link RestartPolicy} for the container. Defaults to
- * {@link RestartPolicy#noRestart()}
- */
- public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
+ public CreateContainerCmd withStdInOnce(boolean stdInOnce);
- public CreateContainerCmd withStdInOnce(boolean stdInOnce);
+ public CreateContainerCmd withStdinOpen(boolean stdinOpen);
- public CreateContainerCmd withStdinOpen(boolean stdinOpen);
+ public CreateContainerCmd withTty(boolean tty);
- public CreateContainerCmd withTty(boolean tty);
+ public CreateContainerCmd withUser(String user);
- public CreateContainerCmd withUser(String user);
+ public CreateContainerCmd withVolumes(Volume... volumes);
- public CreateContainerCmd withVolumes(Volume... volumes);
+ public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
- public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
+ public CreateContainerCmd withWorkingDir(String workingDir);
- public CreateContainerCmd withWorkingDir(String workingDir);
-
- public CreateContainerCmd withMacAddress(String macAddress);
+ public CreateContainerCmd withMacAddress(String macAddress);
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 4b3f064e2..cc082b61f 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -30,551 +30,571 @@
* Creates a new container.
*
*/
-public class CreateContainerCmdImpl extends
- AbstrDockerCmd implements
- CreateContainerCmd {
+public class CreateContainerCmdImpl extends AbstrDockerCmd implements
+ CreateContainerCmd {
- private String name;
+ private String name;
- @JsonProperty("Hostname")
- private String hostName = "";
- @JsonProperty("Domainname")
+ @JsonProperty("Hostname")
+ private String hostName = "";
+
+ @JsonProperty("Domainname")
private String domainName = "";
- @JsonProperty("User")
- private String user = "";
- @JsonProperty("Memory")
- private long memoryLimit = 0;
- @JsonProperty("MemorySwap")
- private long memorySwap = 0;
- @JsonProperty("CpuShares")
- private int cpuShares = 0;
- @JsonProperty("Cpuset")
- private String cpuset;
- @JsonProperty("AttachStdin")
- private boolean attachStdin = false;
- @JsonProperty("AttachStdout")
- private boolean attachStdout = false;
- @JsonProperty("AttachStderr")
- private boolean attachStderr = false;
- @JsonProperty("PortSpecs")
- private String[] portSpecs;
- @JsonProperty("Tty")
- private boolean tty = false;
- @JsonProperty("OpenStdin")
- private boolean stdinOpen = false;
- @JsonProperty("StdinOnce")
- private boolean stdInOnce = false;
- @JsonProperty("Env")
- private String[] env;
- @JsonProperty("Cmd")
- private String[] cmd;
- @JsonProperty("Entrypoint")
- private String[] entrypoint;
- @JsonProperty("Image")
- private String image;
- @JsonProperty("Volumes")
- private Volumes volumes = new Volumes();
- @JsonProperty("WorkingDir")
- private String workingDir = "";
- @JsonProperty("MacAddress")
- private String macAddress;
- @JsonProperty("NetworkDisabled")
- private boolean networkDisabled = false;
- @JsonProperty("ExposedPorts")
- private ExposedPorts exposedPorts = new ExposedPorts();
- @JsonProperty("HostConfig")
- private HostConfig hostConfig = new HostConfig();
-
- public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
- super(exec);
- checkNotNull(image, "image was not specified");
- withImage(image);
- }
-
- /**
- * @throws NotFoundException
- * No such container
- * @throws ConflictException
- * Named container already exists
- */
- @Override
- public CreateContainerResponse exec() throws NotFoundException,
- ConflictException {
- return super.exec();
- }
-
- @Override
- @JsonIgnore
- public Bind[] getBinds() {
- return hostConfig.getBinds();
- }
-
- @Override
- public Capability[] getCapAdd() {
- return hostConfig.getCapAdd();
- }
-
- @Override
- public Capability[] getCapDrop() {
- return hostConfig.getCapDrop();
- }
-
- @Override
- public String[] getCmd() {
- return cmd;
- }
-
- @Override
- public String getCpuset() {
- return cpuset;
- }
-
- @Override
- public int getCpuShares() {
- return cpuShares;
- }
-
- @Override
- @JsonIgnore
- public Device[] getDevices() {
- return hostConfig.getDevices();
- }
-
- @Override
- @JsonIgnore
- public String[] getDns() {
- return hostConfig.getDns();
- }
-
- @Override
- @JsonIgnore
- public String[] getDnsSearch() {
- return hostConfig.getDnsSearch();
- }
-
- @Override
- public String[] getEntrypoint() {
- return entrypoint;
- }
-
- @Override
- public String[] getEnv() {
- return env;
- }
-
- @Override
- @JsonIgnore
- public ExposedPort[] getExposedPorts() {
- return exposedPorts.getExposedPorts();
- }
-
- @Override
- @JsonIgnore
- public String[] getExtraHosts() {
- return hostConfig.getExtraHosts();
- }
-
- @Override
- public HostConfig getHostConfig() {
- return hostConfig;
- }
-
- @Override
- public String getHostName() {
- return hostName;
- }
-
- @Override
- public String getDomainName() {
+
+ @JsonProperty("User")
+ private String user = "";
+
+ @JsonProperty("Memory")
+ private long memoryLimit = 0;
+
+ @JsonProperty("MemorySwap")
+ private long memorySwap = 0;
+
+ @JsonProperty("CpuShares")
+ private int cpuShares = 0;
+
+ @JsonProperty("Cpuset")
+ private String cpuset;
+
+ @JsonProperty("AttachStdin")
+ private boolean attachStdin = false;
+
+ @JsonProperty("AttachStdout")
+ private boolean attachStdout = false;
+
+ @JsonProperty("AttachStderr")
+ private boolean attachStderr = false;
+
+ @JsonProperty("PortSpecs")
+ private String[] portSpecs;
+
+ @JsonProperty("Tty")
+ private boolean tty = false;
+
+ @JsonProperty("OpenStdin")
+ private boolean stdinOpen = false;
+
+ @JsonProperty("StdinOnce")
+ private boolean stdInOnce = false;
+
+ @JsonProperty("Env")
+ private String[] env;
+
+ @JsonProperty("Cmd")
+ private String[] cmd;
+
+ @JsonProperty("Entrypoint")
+ private String[] entrypoint;
+
+ @JsonProperty("Image")
+ private String image;
+
+ @JsonProperty("Volumes")
+ private Volumes volumes = new Volumes();
+
+ @JsonProperty("WorkingDir")
+ private String workingDir = "";
+
+ @JsonProperty("MacAddress")
+ private String macAddress;
+
+ @JsonProperty("NetworkDisabled")
+ private boolean networkDisabled = false;
+
+ @JsonProperty("ExposedPorts")
+ private ExposedPorts exposedPorts = new ExposedPorts();
+
+ @JsonProperty("HostConfig")
+ private HostConfig hostConfig = new HostConfig();
+
+ public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
+ super(exec);
+ checkNotNull(image, "image was not specified");
+ withImage(image);
+ }
+
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws ConflictException
+ * Named container already exists
+ */
+ @Override
+ public CreateContainerResponse exec() throws NotFoundException, ConflictException {
+ return super.exec();
+ }
+
+ @Override
+ @JsonIgnore
+ public Bind[] getBinds() {
+ return hostConfig.getBinds();
+ }
+
+ @Override
+ public Capability[] getCapAdd() {
+ return hostConfig.getCapAdd();
+ }
+
+ @Override
+ public Capability[] getCapDrop() {
+ return hostConfig.getCapDrop();
+ }
+
+ @Override
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ @Override
+ public String getCpuset() {
+ return cpuset;
+ }
+
+ @Override
+ public int getCpuShares() {
+ return cpuShares;
+ }
+
+ @Override
+ @JsonIgnore
+ public Device[] getDevices() {
+ return hostConfig.getDevices();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getDns() {
+ return hostConfig.getDns();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getDnsSearch() {
+ return hostConfig.getDnsSearch();
+ }
+
+ @Override
+ public String[] getEntrypoint() {
+ return entrypoint;
+ }
+
+ @Override
+ public String[] getEnv() {
+ return env;
+ }
+
+ @Override
+ @JsonIgnore
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts.getExposedPorts();
+ }
+
+ @Override
+ @JsonIgnore
+ public String[] getExtraHosts() {
+ return hostConfig.getExtraHosts();
+ }
+
+ @Override
+ public HostConfig getHostConfig() {
+ return hostConfig;
+ }
+
+ @Override
+ public String getHostName() {
+ return hostName;
+ }
+
+ @Override
+ public String getDomainName() {
return domainName;
}
- @Override
- public String getImage() {
- return image;
- }
-
- @Override
- @JsonIgnore
- public Link[] getLinks() {
- return hostConfig.getLinks();
- }
-
- @Override
- @JsonIgnore
- public LxcConf[] getLxcConf() {
- return hostConfig.getLxcConf();
- }
-
- public String getMacAddress() {
- return macAddress;
- }
-
- @Override
- public long getMemoryLimit() {
- return memoryLimit;
- }
-
- @Override
- public long getMemorySwap() {
- return memorySwap;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- @Override
- @JsonIgnore
- public String getNetworkMode() {
- return hostConfig.getNetworkMode();
- }
-
- @Override
- @JsonIgnore
- public Ports getPortBindings() {
- return hostConfig.getPortBindings();
- }
-
- @Override
- public String[] getPortSpecs() {
- return portSpecs;
- }
-
- @Override
- @JsonIgnore
- public RestartPolicy getRestartPolicy() {
- return hostConfig.getRestartPolicy();
- }
-
- @Override
- public String getUser() {
- return user;
- }
-
- @Override
- @JsonIgnore
- public Volume[] getVolumes() {
- return volumes.getVolumes();
- }
-
- @Override
- @JsonIgnore
- public VolumesFrom[] getVolumesFrom() {
- return hostConfig.getVolumesFrom();
- }
-
- @Override
- public String getWorkingDir() {
- return workingDir;
- }
-
- @Override
- public boolean isAttachStderr() {
- return attachStderr;
- }
-
- @Override
- public boolean isAttachStdin() {
- return attachStdin;
- }
-
- @Override
- public boolean isAttachStdout() {
- return attachStdout;
- }
-
- @Override
- public boolean isNetworkDisabled() {
- return networkDisabled;
- }
-
- @Override
- @JsonIgnore
- public Boolean isPrivileged() {
- return hostConfig.isPrivileged();
- }
-
- @Override
- @JsonIgnore
- public Boolean isPublishAllPorts() {
- return hostConfig.isPublishAllPorts();
- }
-
- @Override
- public boolean isStdInOnce() {
- return stdInOnce;
- }
-
- @Override
- public boolean isStdinOpen() {
- return stdinOpen;
- }
-
- @Override
- public boolean isTty() {
- return tty;
- }
-
- @Override
- public String toString() {
- return new ToStringBuilder(this).append("create container ")
- .append(name != null ? "name=" + name + " " : "").append(this)
- .toString();
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
- this.attachStderr = attachStderr;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
- this.attachStdin = attachStdin;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
- this.attachStdout = attachStdout;
- return this;
- }
-
- @Override
- public CreateContainerCmd withBinds(Bind... binds) {
- hostConfig.setBinds(binds);
- return this;
- }
-
- @Override
- public CreateContainerCmd withCapAdd(Capability... capAdd) {
- hostConfig.setCapAdd(capAdd);
- return this;
- }
-
- @Override
- public CreateContainerCmd withCapDrop(Capability... capDrop) {
- hostConfig.setCapDrop(capDrop);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCmd(String... cmd) {
- this.cmd = cmd;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCpuset(String cpuset) {
- this.cpuset = cpuset;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withCpuShares(int cpuShares) {
- this.cpuShares = cpuShares;
- return this;
- }
-
- @Override
- public CreateContainerCmd withDevices(Device... devices) {
- this.hostConfig.setDevices(devices);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) {
- this.networkDisabled = disableNetwork;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withDns(String... dns) {
- this.hostConfig.setDns(dns);
- return this;
- }
-
- @Override
- public CreateContainerCmd withDnsSearch(String... dnsSearch) {
- this.hostConfig.setDnsSearch(dnsSearch);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
- this.entrypoint = entrypoint;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withEnv(String... env) {
- this.env = env;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
- this.exposedPorts = new ExposedPorts(exposedPorts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withExtraHosts(String... extraHosts) {
- this.hostConfig.setExtraHosts(extraHosts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
- checkNotNull(hostConfig, "no host config was specified");
- this.hostConfig = hostConfig;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withHostName(String hostName) {
- this.hostName = hostName;
- return this;
- }
-
- @Override
+ @Override
+ public String getImage() {
+ return image;
+ }
+
+ @Override
+ @JsonIgnore
+ public Link[] getLinks() {
+ return hostConfig.getLinks();
+ }
+
+ @Override
+ @JsonIgnore
+ public LxcConf[] getLxcConf() {
+ return hostConfig.getLxcConf();
+ }
+
+ public String getMacAddress() {
+ return macAddress;
+ }
+
+ @Override
+ public long getMemoryLimit() {
+ return memoryLimit;
+ }
+
+ @Override
+ public long getMemorySwap() {
+ return memorySwap;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ @JsonIgnore
+ public String getNetworkMode() {
+ return hostConfig.getNetworkMode();
+ }
+
+ @Override
+ @JsonIgnore
+ public Ports getPortBindings() {
+ return hostConfig.getPortBindings();
+ }
+
+ @Override
+ public String[] getPortSpecs() {
+ return portSpecs;
+ }
+
+ @Override
+ @JsonIgnore
+ public RestartPolicy getRestartPolicy() {
+ return hostConfig.getRestartPolicy();
+ }
+
+ @Override
+ public String getUser() {
+ return user;
+ }
+
+ @Override
+ @JsonIgnore
+ public Volume[] getVolumes() {
+ return volumes.getVolumes();
+ }
+
+ @Override
+ @JsonIgnore
+ public VolumesFrom[] getVolumesFrom() {
+ return hostConfig.getVolumesFrom();
+ }
+
+ @Override
+ public String getWorkingDir() {
+ return workingDir;
+ }
+
+ @Override
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
+
+ @Override
+ public boolean isAttachStdin() {
+ return attachStdin;
+ }
+
+ @Override
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ @Override
+ public boolean isNetworkDisabled() {
+ return networkDisabled;
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPrivileged() {
+ return hostConfig.isPrivileged();
+ }
+
+ @Override
+ @JsonIgnore
+ public Boolean isPublishAllPorts() {
+ return hostConfig.isPublishAllPorts();
+ }
+
+ @Override
+ public boolean isStdInOnce() {
+ return stdInOnce;
+ }
+
+ @Override
+ public boolean isStdinOpen() {
+ return stdinOpen;
+ }
+
+ @Override
+ public boolean isTty() {
+ return tty;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("create container ").append(name != null ? "name=" + name + " " : "")
+ .append(this).toString();
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) {
+ this.attachStderr = attachStderr;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) {
+ this.attachStdin = attachStdin;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) {
+ this.attachStdout = attachStdout;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withBinds(Bind... binds) {
+ hostConfig.setBinds(binds);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withCapAdd(Capability... capAdd) {
+ hostConfig.setCapAdd(capAdd);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withCapDrop(Capability... capDrop) {
+ hostConfig.setCapDrop(capDrop);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCmd(String... cmd) {
+ this.cmd = cmd;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCpuset(String cpuset) {
+ this.cpuset = cpuset;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withCpuShares(int cpuShares) {
+ this.cpuShares = cpuShares;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withDevices(Device... devices) {
+ this.hostConfig.setDevices(devices);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) {
+ this.networkDisabled = disableNetwork;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withDns(String... dns) {
+ this.hostConfig.setDns(dns);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withDnsSearch(String... dnsSearch) {
+ this.hostConfig.setDnsSearch(dnsSearch);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withEntrypoint(String... entrypoint) {
+ this.entrypoint = entrypoint;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withEnv(String... env) {
+ this.env = env;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) {
+ this.exposedPorts = new ExposedPorts(exposedPorts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withExtraHosts(String... extraHosts) {
+ this.hostConfig.setExtraHosts(extraHosts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
+ checkNotNull(hostConfig, "no host config was specified");
+ this.hostConfig = hostConfig;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withHostName(String hostName) {
+ this.hostName = hostName;
+ return this;
+ }
+
+ @Override
public CreateContainerCmdImpl withDomainName(String domainName) {
this.domainName = domainName;
return this;
}
- @Override
- public CreateContainerCmdImpl withImage(String image) {
- this.image = image;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withLinks(Link... links) {
- checkNotNull(links, "links was not specified");
- this.hostConfig.setLinks(links);
- return this;
- }
-
- @Override
- public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
- checkNotNull(lxcConf, "lxcConf was not specified");
- this.hostConfig.setLxcConf(lxcConf);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMacAddress(String macAddress) {
- this.macAddress = macAddress;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
- this.memoryLimit = memoryLimit;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
- this.memorySwap = memorySwap;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withName(String name) {
- checkNotNull(name, "name was not specified");
- this.name = name;
- return this;
- }
-
- @Override
- public CreateContainerCmd withNetworkMode(String networkMode) {
- checkNotNull(networkMode, "networkMode was not specified");
- this.hostConfig.setNetworkMode(networkMode);
- return this;
- }
-
- @Override
- public CreateContainerCmd withPortBindings(PortBinding... portBindings) {
- checkNotNull(portBindings, "portBindings was not specified");
- this.hostConfig.setPortBindings(new Ports(portBindings));
- return this;
- }
-
- @Override
- public CreateContainerCmd withPortBindings(Ports portBindings) {
- checkNotNull(portBindings, "portBindings was not specified");
- this.hostConfig.setPortBindings(portBindings);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
- this.portSpecs = portSpecs;
- return this;
- }
-
- @Override
- public CreateContainerCmd withPrivileged(boolean privileged) {
- this.hostConfig.setPrivileged(privileged);
- return this;
- }
-
- @Override
- public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
- this.hostConfig.setPublishAllPorts(publishAllPorts);
- return this;
- }
-
- @Override
- public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
- this.hostConfig.setRestartPolicy(restartPolicy);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
- this.stdInOnce = stdInOnce;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
- this.stdinOpen = stdinOpen;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withTty(boolean tty) {
- this.tty = tty;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withUser(String user) {
- this.user = user;
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withVolumes(Volume... volumes) {
- this.volumes = new Volumes(volumes);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) {
- this.hostConfig.setVolumesFrom(volumesFrom);
- return this;
- }
-
- @Override
- public CreateContainerCmdImpl withWorkingDir(String workingDir) {
- this.workingDir = workingDir;
- return this;
- }
+ @Override
+ public CreateContainerCmdImpl withImage(String image) {
+ this.image = image;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withLinks(Link... links) {
+ checkNotNull(links, "links was not specified");
+ this.hostConfig.setLinks(links);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
+ checkNotNull(lxcConf, "lxcConf was not specified");
+ this.hostConfig.setLxcConf(lxcConf);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMacAddress(String macAddress) {
+ this.macAddress = macAddress;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) {
+ this.memoryLimit = memoryLimit;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withMemorySwap(long memorySwap) {
+ this.memorySwap = memorySwap;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withName(String name) {
+ checkNotNull(name, "name was not specified");
+ this.name = name;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withNetworkMode(String networkMode) {
+ checkNotNull(networkMode, "networkMode was not specified");
+ this.hostConfig.setNetworkMode(networkMode);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(PortBinding... portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(new Ports(portBindings));
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPortBindings(Ports portBindings) {
+ checkNotNull(portBindings, "portBindings was not specified");
+ this.hostConfig.setPortBindings(portBindings);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withPortSpecs(String... portSpecs) {
+ this.portSpecs = portSpecs;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPrivileged(boolean privileged) {
+ this.hostConfig.setPrivileged(privileged);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) {
+ this.hostConfig.setPublishAllPorts(publishAllPorts);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
+ this.hostConfig.setRestartPolicy(restartPolicy);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) {
+ this.stdInOnce = stdInOnce;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) {
+ this.stdinOpen = stdinOpen;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withTty(boolean tty) {
+ this.tty = tty;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withVolumes(Volume... volumes) {
+ this.volumes = new Volumes(volumes);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) {
+ this.hostConfig.setVolumesFrom(volumesFrom);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmdImpl withWorkingDir(String workingDir) {
+ this.workingDir = workingDir;
+ return this;
+ }
}
From d22fe533358dc74bfa2988f529a0c627130cfadd Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 21:52:21 +0200
Subject: [PATCH 0102/1272] Fix imports
---
.../com/github/dockerjava/api/command/CreateContainerCmd.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index be6e83adf..3b558b6d9 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -14,7 +14,6 @@
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
-import com.github.dockerjava.core.command.CreateContainerCmdImpl;
public interface CreateContainerCmd extends DockerCmd {
From 651446b7a6da43eb1a96699cab7868b25ddc1f48 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 16 Jun 2015 23:05:35 +0200
Subject: [PATCH 0103/1272] Removed deprecated start options
---
.../api/command/StartContainerCmd.java | 170 +---
.../core/command/StartContainerCmdImpl.java | 298 +------
.../command/StartContainerCmdImplTest.java | 830 ++++++++----------
3 files changed, 401 insertions(+), 897 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
index aeddfd0bd..2195e1eca 100644
--- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
@@ -2,170 +2,26 @@
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.NotModifiedException;
-import com.github.dockerjava.api.model.Bind;
-import com.github.dockerjava.api.model.Capability;
-import com.github.dockerjava.api.model.Device;
-import com.github.dockerjava.api.model.Link;
-import com.github.dockerjava.api.model.LxcConf;
-import com.github.dockerjava.api.model.PortBinding;
-import com.github.dockerjava.api.model.Ports;
-import com.github.dockerjava.api.model.RestartPolicy;
-import com.github.dockerjava.api.model.VolumesFrom;
/**
* Start a container.
- *
- * TODO: Almost all methods are deprecated as they have corresponding siblings in {@link CreateContainerCmd} now.
+ *
*/
public interface StartContainerCmd extends DockerCmd {
- public static interface Exec extends DockerCmdExec {
- }
+ public static interface Exec extends DockerCmdExec {
+ }
- /**
- * @throws NotFoundException
- * No such container
- * @throws NotModifiedException
- * Container already started
- */
- @Override
- public Void exec() throws NotFoundException, NotModifiedException;
+ String getContainerId();
- public Bind[] getBinds();
-
- public Capability[] getCapAdd();
-
- public Capability[] getCapDrop();
-
- public String getContainerId();
-
- public Device[] getDevices();
-
- public String[] getDns();
-
- public String[] getDnsSearch();
-
- public String[] getExtraHosts();
-
- public Link[] getLinks();
-
- public LxcConf[] getLxcConf();
-
- public String getNetworkMode();
-
- public Ports getPortBindings();
-
- public RestartPolicy getRestartPolicy();
-
- public VolumesFrom[] getVolumesFrom();
-
- public Boolean isPrivileged();
-
- public Boolean isPublishAllPorts();
-
- @Deprecated
- public StartContainerCmd withBinds(Bind... binds);
-
- /**
- * Add linux kernel
- * capability to the container. For example: adding {@link Capability#MKNOD}
- * allows the container to create special files using the 'mknod' command.
- */
- @Deprecated
- public StartContainerCmd withCapAdd(Capability... capAdd);
-
- /**
- * Drop linux kernel
- * capability from the container. For example: dropping {@link Capability#CHOWN}
- * prevents the container from changing the owner of any files.
- */
- @Deprecated
- public StartContainerCmd withCapDrop(Capability... capDrop);
-
- @Deprecated
- public StartContainerCmd withContainerId(String containerId);
-
- /**
- * Add host devices to the container
- */
- @Deprecated
- public StartContainerCmd withDevices(Device... devices);
-
- /**
- * Set custom DNS servers
- */
- @Deprecated
- public StartContainerCmd withDns(String... dns);
-
- /**
- * Set custom DNS search domains
- */
- @Deprecated
- public StartContainerCmd withDnsSearch(String... dnsSearch);
-
- /**
- * Add hostnames to /etc/hosts in the container
- */
- @Deprecated
- public StartContainerCmd withExtraHosts(String... extraHosts);
-
- /**
- * Add link to another container.
- */
- @Deprecated
- public StartContainerCmd withLinks(Link... links);
-
- @Deprecated
- public StartContainerCmd withLxcConf(LxcConf... lxcConf);
-
- /**
- * 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.
- *
- */
- @Deprecated
- public StartContainerCmd withNetworkMode(String networkMode);
-
- /**
- * Add one or more {@link PortBinding}s.
- * This corresponds to the --publish (-p)
- * option of the docker run CLI command.
- */
- @Deprecated
- public StartContainerCmd withPortBindings(PortBinding... portBindings);
-
- /**
- * Add the port bindings that are contained in the given {@link Ports}
- * object.
- *
- * @see #withPortBindings(PortBinding...)
- */
- @Deprecated
- public StartContainerCmd withPortBindings(Ports portBindings);
-
- @Deprecated
- public StartContainerCmd withPrivileged(Boolean privileged);
-
- @Deprecated
- public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts);
-
- /**
- * Set custom {@link RestartPolicy} for the container. Defaults to
- * {@link RestartPolicy#noRestart()}
- */
- @Deprecated
- public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
-
- @Deprecated
- public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom);
+ StartContainerCmd withContainerId(String containerId);
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws NotModifiedException
+ * Container already started
+ */
+ @Override
+ public Void exec() throws NotFoundException, NotModifiedException;
}
diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
index 27fca12f8..6fe60734d 100644
--- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java
@@ -7,22 +7,9 @@
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.api.NotFoundException;
import com.github.dockerjava.api.NotModifiedException;
import com.github.dockerjava.api.command.StartContainerCmd;
-import com.github.dockerjava.api.model.Bind;
-import com.github.dockerjava.api.model.Binds;
-import com.github.dockerjava.api.model.Capability;
-import com.github.dockerjava.api.model.Device;
-import com.github.dockerjava.api.model.Link;
-import com.github.dockerjava.api.model.Links;
-import com.github.dockerjava.api.model.LxcConf;
-import com.github.dockerjava.api.model.PortBinding;
-import com.github.dockerjava.api.model.Ports;
-import com.github.dockerjava.api.model.RestartPolicy;
-import com.github.dockerjava.api.model.VolumesFrom;
-
/**
* Start a container
@@ -30,276 +17,39 @@
@JsonInclude(NON_EMPTY)
public class StartContainerCmdImpl extends AbstrDockerCmd implements StartContainerCmd {
- @JsonIgnore
- private String containerId;
-
- @JsonProperty("Binds")
- private Binds binds;
-
- @JsonProperty("Links")
- private Links links;
-
- @JsonProperty("LxcConf")
- private LxcConf[] lxcConf;
-
- @JsonProperty("PortBindings")
- private Ports portBindings;
-
- @JsonProperty("PublishAllPorts")
- private Boolean publishAllPorts;
-
- @JsonProperty("Privileged")
- private Boolean privileged;
-
- @JsonProperty("Dns")
- private String[] dns;
-
- @JsonProperty("DnsSearch")
- private String[] dnsSearch;
-
- @JsonProperty("VolumesFrom")
- private VolumesFrom[] volumesFrom;
-
- @JsonProperty("NetworkMode")
- private String networkMode;
-
- @JsonProperty("Devices")
- private Device[] devices;
-
- @JsonProperty("ExtraHosts")
- private String[] extraHosts;
-
- @JsonProperty("RestartPolicy")
- private RestartPolicy restartPolicy;
-
- @JsonProperty("CapAdd")
- private Capability[] capAdd;
-
- @JsonProperty("CapDrop")
- private Capability[] capDrop;
-
- public StartContainerCmdImpl(StartContainerCmd.Exec exec, String containerId) {
- super(exec);
- withContainerId(containerId);
- }
-
- @Override
- @JsonIgnore
- public Bind[] getBinds() {
- return (binds == null) ? new Bind[0] : binds.getBinds();
- }
-
- @Override
- @JsonIgnore
- public Link[] getLinks() {
- return (links == null) ? new Link[0] : links.getLinks();
- }
+ @JsonIgnore
+ private String containerId;
- @Override
- public LxcConf[] getLxcConf() {
- return lxcConf;
- }
-
- @Override
- public Ports getPortBindings() {
- return portBindings;
- }
-
- @Override
- public Boolean isPublishAllPorts() {
- return publishAllPorts;
- }
-
- @Override
- public Boolean isPrivileged() {
- return privileged;
- }
-
- @Override
- public String[] getDns() {
- return dns;
- }
-
- @Override
- public String[] getDnsSearch() {
- return dnsSearch;
- }
-
- @Override
- public VolumesFrom[] getVolumesFrom() {
- return volumesFrom;
- }
-
- @Override
- public String getContainerId() {
- return containerId;
- }
-
- @Override
- public String getNetworkMode() {
- return networkMode;
- }
-
- @Override
- public Device[] getDevices() {
- return devices;
- }
-
- @Override
- public String[] getExtraHosts() {
- return extraHosts;
- }
-
- @Override
- public RestartPolicy getRestartPolicy() {
- return restartPolicy;
+ public StartContainerCmdImpl(StartContainerCmd.Exec exec, String containerId) {
+ super(exec);
+ withContainerId(containerId);
}
-
- @Override
- public Capability[] getCapAdd() {
- return capAdd;
- }
-
+
@Override
- public Capability[] getCapDrop() {
- return capDrop;
+ public StartContainerCmd withContainerId(String containerId) {
+ checkNotNull(containerId, "containerId was not specified");
+ this.containerId = containerId;
+ return this;
}
- @Override
- @JsonIgnore
- public StartContainerCmd withBinds(Bind... binds) {
- checkNotNull(binds, "binds was not specified");
- this.binds = new Binds(binds);
- return this;
- }
-
- @Override
- @JsonIgnore
- public StartContainerCmd withLinks(Link... links) {
- checkNotNull(links, "links was not specified");
- this.links = new Links(links);
- return this;
- }
-
- @Override
- public StartContainerCmd withLxcConf(LxcConf... lxcConf) {
- checkNotNull(lxcConf, "lxcConf was not specified");
- this.lxcConf = lxcConf;
- return this;
- }
-
- @Override
- public StartContainerCmd withPortBindings(Ports portBindings) {
- checkNotNull(portBindings,
- "portBindings was not specified");
- this.portBindings = portBindings;
- return this;
- }
-
- @Override
- public StartContainerCmd withPortBindings(PortBinding... portBindings) {
- checkNotNull(portBindings, "portBindings was not specified");
- if (this.portBindings == null) {
- this.portBindings = new Ports();
- }
- this.portBindings.add(portBindings);
- return this;
- }
-
- @Override
- public StartContainerCmd withPrivileged(Boolean privileged) {
- this.privileged = privileged;
- return this;
- }
-
- @Override
- public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts) {
- this.publishAllPorts = publishAllPorts;
- return this;
- }
-
- @Override
- public StartContainerCmd withDns(String... dns) {
- checkNotNull(dns, "dns was not specified");
- this.dns = dns;
- return this;
- }
-
- @Override
- public StartContainerCmd withDnsSearch(String... dnsSearch) {
- checkNotNull(dnsSearch, "dnsSearch was not specified");
- this.dnsSearch = dnsSearch;
- return this;
- }
-
- @Override
- public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) {
- checkNotNull(volumesFrom, "volumesFrom was not specified");
- this.volumesFrom = volumesFrom;
- return this;
- }
-
- @Override
- public StartContainerCmd withContainerId(String containerId) {
- checkNotNull(containerId, "containerId was not specified");
- this.containerId = containerId;
- return this;
+ @Override
+ public String getContainerId() {
+ return containerId;
}
@Override
- public StartContainerCmd withNetworkMode(String networkMode) {
- checkNotNull(networkMode, "networkMode was not specified");
- this.networkMode = networkMode;
- return this;
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this).toString();
}
-
- @Override
- public StartContainerCmd withDevices(Device... devices) {
- checkNotNull(devices, "devices was not specified");
- this.devices = devices;
- return this;
- }
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws NotModifiedException
+ * Container already started
+ */
@Override
- public StartContainerCmd withExtraHosts(String... extraHosts) {
- checkNotNull(extraHosts, "extraHosts was not specified");
- this.extraHosts = extraHosts;
- return this;
- }
-
-
- @Override
- public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
- checkNotNull(restartPolicy, "restartPolicy was not specified");
- this.restartPolicy = restartPolicy;
- return this;
- }
-
- @Override
- public StartContainerCmd withCapAdd(Capability... capAdd) {
- checkNotNull(capAdd, "capAdd was not specified");
- this.capAdd = capAdd;
- return this;
- }
-
- @Override
- public StartContainerCmd withCapDrop(Capability... capDrop) {
- checkNotNull(capDrop, "capDrop was not specified");
- this.capDrop = capDrop;
- return this;
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this).toString();
- }
-
- /**
- * @throws NotFoundException No such container
- * @throws NotModifiedException Container already started
- */
- @Override
- public Void exec() throws NotFoundException, NotModifiedException {
- return super.exec();
- }
+ public Void exec() throws NotFoundException, NotModifiedException {
+ return super.exec();
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index 640839915..d690f4e13 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -1,8 +1,8 @@
package com.github.dockerjava.core.command;
import static com.github.dockerjava.api.model.AccessMode.ro;
-import static com.github.dockerjava.api.model.Capability.*;
-import static org.hamcrest.CoreMatchers.nullValue;
+import static com.github.dockerjava.api.model.Capability.MKNOD;
+import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
@@ -13,16 +13,8 @@
import static org.hamcrest.Matchers.startsWith;
import java.lang.reflect.Method;
-import java.util.*;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.DockerException;
-import com.github.dockerjava.api.InternalServerErrorException;
-import com.github.dockerjava.api.NotFoundException;
-import com.github.dockerjava.api.command.CreateContainerResponse;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import com.github.dockerjava.api.command.StartContainerCmd;
-import com.github.dockerjava.api.model.*;
+import java.util.Arrays;
+import java.util.UUID;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -31,624 +23,530 @@
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.api.DockerException;
+import com.github.dockerjava.api.InternalServerErrorException;
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.model.AccessMode;
+import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.Device;
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.Link;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.api.model.Volume;
+import com.github.dockerjava.api.model.VolumeRW;
+import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.client.AbstractDockerClientTest;
@Test(groups = "integration")
public class StartContainerCmdImplTest extends AbstractDockerClientTest {
- @BeforeTest
- public void beforeTest() throws DockerException {
- super.beforeTest();
- }
+ @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 startContainerWithVolumes() throws DockerException {
+
+ // see http://docs.docker.io/use/working_with_volumes/
+ Volume volume1 = new Volume("/opt/webapp1");
+
+ Volume volume2 = new Volume("/opt/webapp2");
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume1, volume2)
+ .withCmd("true").withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2))
+ .exec();
- @AfterTest
- public void afterTest() {
- super.afterTest();
- }
+ LOG.info("Created container {}", container.toString());
- @BeforeMethod
- public void beforeMethod(Method method) {
- super.beforeMethod(method);
- }
+ assertThat(container.getId(), not(isEmptyString()));
- @AfterMethod
- public void afterMethod(ITestResult result) {
- super.afterMethod(result);
- }
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- @Test
- public void startContainerWithVolumes() throws DockerException {
+ assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/opt/webapp1", "/opt/webapp2"));
- // see http://docs.docker.io/use/working_with_volumes/
- Volume volume1 = new Volume("/opt/webapp1");
+ dockerClient.startContainerCmd(container.getId()).exec();
- Volume volume2 = new Volume("/opt/webapp2");
+ dockerClient.waitContainerCmd(container.getId()).exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withVolumes(volume1, volume2)
- .withCmd("true").exec();
+ inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- LOG.info("Created container {}", container.toString());
+ assertContainerHasVolumes(inspectContainerResponse, volume1, volume2);
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()),
+ contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2)));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ }
- assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(),
- contains("/opt/webapp1", "/opt/webapp2"));
+ @Test
+ public void startContainerWithVolumesFrom() throws DockerException {
- dockerClient
- .startContainerCmd(container.getId())
- .withBinds(new Bind("/src/webapp1", volume1, ro),
- new Bind("/src/webapp2", volume2)).exec();
+ Volume volume1 = new Volume("/opt/webapp1");
+ Volume volume2 = new Volume("/opt/webapp2");
- dockerClient.waitContainerCmd(container.getId()).exec();
+ String container1Name = UUID.randomUUID().toString();
- inspectContainerResponse = dockerClient.inspectContainerCmd(
- container.getId()).exec();
+ 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());
- assertContainerHasVolumes(inspectContainerResponse, volume1, volume2);
+ dockerClient.startContainerCmd(container1.getId()).exec();
+ LOG.info("Started container1 {}", container1.toString());
- assertThat(
- Arrays.asList(inspectContainerResponse.getVolumesRW()),
- contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(
- volume2)));
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
- }
+ assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2);
- @Test
- public void startContainerWithVolumesFrom() throws DockerException {
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withVolumesFrom(new VolumesFrom(container1Name)).exec();
+ LOG.info("Created container2 {}", container2.toString());
- Volume volume1 = new Volume("/opt/webapp1");
- Volume volume2 = new Volume("/opt/webapp2");
+ dockerClient.startContainerCmd(container2.getId()).exec();
+ LOG.info("Started container2 {}", container2.toString());
- String container1Name = UUID.randomUUID().toString();
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
- CreateContainerResponse container1 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName(container1Name).exec();
- LOG.info("Created container1 {}", container1.toString());
+ assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2);
+ }
- dockerClient
- .startContainerCmd(container1.getId())
- .withBinds(new Bind("/src/webapp1", volume1),
- new Bind("/src/webapp2", volume2)).exec();
- LOG.info("Started container1 {}", container1.toString());
+ @Test
+ public void startContainerWithDns() throws DockerException {
- InspectContainerResponse inspectContainerResponse1 = dockerClient
- .inspectContainerCmd(container1.getId()).exec();
+ String aDnsServer = "8.8.8.8";
+ String anotherDnsServer = "8.8.4.4";
- assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2);
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withDns(aDnsServer, anotherDnsServer).exec();
- CreateContainerResponse container2 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").exec();
- LOG.info("Created container2 {}", container2.toString());
+ LOG.info("Created container {}", container.toString());
- dockerClient.startContainerCmd(container2.getId())
- .withVolumesFrom(new VolumesFrom(container1Name)).exec();
- LOG.info("Started container2 {}", container2.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse2 = dockerClient
- .inspectContainerCmd(container2.getId()).exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
- assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2);
- }
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- @Test
- public void startContainerWithDns() throws DockerException {
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()),
+ contains(aDnsServer, anotherDnsServer));
+ }
- String aDnsServer = "8.8.8.8";
- String anotherDnsServer = "8.8.4.4";
+ @Test
+ public void startContainerWithDnsSearch() throws DockerException {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true").exec();
+ String dnsSearch = "example.com";
- LOG.info("Created container {}", container.toString());
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withDnsSearch(dnsSearch).exec();
- assertThat(container.getId(), not(isEmptyString()));
+ LOG.info("Created container {}", container.toString());
- dockerClient.startContainerCmd(container.getId())
- .withDns(aDnsServer, anotherDnsServer).exec();
+ assertThat(container.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getDns()), contains(aDnsServer, anotherDnsServer));
- }
+ dockerClient.startContainerCmd(container.getId()).exec();
- @Test
- public void startContainerWithDnsSearch() throws DockerException {
+ inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- String dnsSearch = "example.com";
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDnsSearch()), contains(dnsSearch));
+ }
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true").exec();
+ @Test
+ public void startContainerWithPortBindings() throws DockerException {
- LOG.info("Created container {}", container.toString());
+ ExposedPort tcp22 = ExposedPort.tcp(22);
+ ExposedPort tcp23 = ExposedPort.tcp(23);
- assertThat(container.getId(), not(isEmptyString()));
+ 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();
- dockerClient.startContainerCmd(container.getId())
- .withDnsSearch(dnsSearch).exec();
+ LOG.info("Created container {}", container.toString());
- inspectContainerResponse = dockerClient.inspectContainerCmd(
- container.getId()).exec();
+ assertThat(container.getId(), not(isEmptyString()));
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getDnsSearch()), contains(dnsSearch));
- }
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- @Test
- public void startContainerWithPortBindings() throws DockerException {
+ dockerClient.startContainerCmd(container.getId()).exec();
- ExposedPort tcp22 = ExposedPort.tcp(22);
- ExposedPort tcp23 = ExposedPort.tcp(23);
+ inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true")
- .withExposedPorts(tcp22, tcp23).exec();
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23));
- LOG.info("Created container {}", container.toString());
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0],
+ is(equalTo(Ports.Binding(11022))));
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0],
+ is(equalTo(Ports.Binding(11023))));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1],
+ is(equalTo(Ports.Binding(11024))));
- Ports portBindings = new Ports();
- portBindings.bind(tcp22, Ports.Binding(11022));
- portBindings.bind(tcp23, Ports.Binding(11023));
- portBindings.bind(tcp23, Ports.Binding(11024));
+ }
- dockerClient.startContainerCmd(container.getId())
- .withPortBindings(portBindings).exec();
+ @Test
+ public void startContainerWithRandomPortBindings() throws DockerException {
- inspectContainerResponse = dockerClient.inspectContainerCmd(
- container.getId()).exec();
+ ExposedPort tcp22 = ExposedPort.tcp(22);
+ ExposedPort tcp23 = ExposedPort.tcp(23);
- assertThat(Arrays.asList(inspectContainerResponse.getConfig()
- .getExposedPorts()), contains(tcp22, tcp23));
+ Ports portBindings = new Ports();
+ portBindings.bind(tcp22, Ports.Binding(null));
+ portBindings.bind(tcp23, Ports.Binding(null));
- assertThat(inspectContainerResponse.getHostConfig().getPortBindings()
- .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022))));
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).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()));
- }
+ dockerClient.startContainerCmd(container.getId()).exec();
- @Test
- public void startContainerWithRandomPortBindings() throws DockerException {
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- ExposedPort tcp22 = ExposedPort.tcp(22);
- ExposedPort tcp23 = ExposedPort.tcp(23);
+ assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23));
- Ports portBindings = new Ports();
- portBindings.bind(tcp22, Ports.Binding(null));
- portBindings.bind(tcp23, Ports.Binding(null));
+ assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp22)[0].getHostPort(),
+ is(not(equalTo(tcp22.getPort()))));
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings)
- .withPublishAllPorts(true).exec();
+ assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp23)[0].getHostPort(),
+ is(not(equalTo(tcp23.getPort()))));
- LOG.info("Created container {}", container.toString());
+ }
- assertThat(container.getId(), not(isEmptyString()));
+ @Test
+ public void startContainerWithConflictingPortBindings() throws DockerException {
- dockerClient.startContainerCmd(container.getId()).exec();
+ ExposedPort tcp22 = ExposedPort.tcp(22);
+ ExposedPort tcp23 = ExposedPort.tcp(23);
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ Ports portBindings = new Ports();
+ portBindings.bind(tcp22, Ports.Binding(11022));
+ portBindings.bind(tcp23, Ports.Binding(11022));
- assertThat(Arrays.asList(inspectContainerResponse.getConfig()
- .getExposedPorts()), contains(tcp22, tcp23));
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec();
- assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
- .getBindings().get(tcp22)[0].getHostPort(), is(not(equalTo(tcp22.getPort()))));
+ LOG.info("Created container {}", container.toString());
- assertThat(inspectContainerResponse.getNetworkSettings().getPorts()
- .getBindings().get(tcp23)[0].getHostPort(), is(not(equalTo(tcp23.getPort()))));
+ assertThat(container.getId(), not(isEmptyString()));
- }
+ try {
+ dockerClient.startContainerCmd(container.getId()).exec();
+ fail("expected InternalServerErrorException");
+ } catch (InternalServerErrorException e) {
- @Test
- public void startContainerWithConflictingPortBindings()
- throws DockerException {
+ }
- ExposedPort tcp22 = ExposedPort.tcp(22);
- ExposedPort tcp23 = ExposedPort.tcp(23);
+ }
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true")
- .withExposedPorts(tcp22, tcp23).exec();
+ @Test
+ public void startContainerWithLinkingDeprecated() throws DockerException {
- LOG.info("Created container {}", container.toString());
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container1").exec();
- assertThat(container.getId(), not(isEmptyString()));
+ LOG.info("Created container1 {}", container1.toString());
+ assertThat(container1.getId(), not(isEmptyString()));
- Ports portBindings = new Ports();
- portBindings.bind(tcp22, Ports.Binding(11022));
- portBindings.bind(tcp23, Ports.Binding(11022));
+ dockerClient.startContainerCmd(container1.getId()).exec();
- try {
- dockerClient.startContainerCmd(container.getId())
- .withPortBindings(portBindings).exec();
- fail("expected InternalServerErrorException");
- } catch (InternalServerErrorException e) {
+ 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)));
+ }
- @Test
- public void startContainerWithLinkingDeprecated() throws DockerException {
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container2").withLinks(new Link("container1", "container1Link")).exec();
- CreateContainerResponse container1 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName("container1").exec();
+ LOG.info("Created container2 {}", container2.toString());
+ assertThat(container2.getId(), not(isEmptyString()));
- LOG.info("Created container1 {}", container1.toString());
- assertThat(container1.getId(), not(isEmptyString()));
+ dockerClient.startContainerCmd(container2.getId()).exec();
- dockerClient.startContainerCmd(container1.getId()).exec();
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+ LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString());
- InspectContainerResponse inspectContainerResponse1 = dockerClient
- .inspectContainerCmd(container1.getId()).exec();
- LOG.info("Container1 Inspect: {}", inspectContainerResponse1.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()));
+ assertThat(inspectContainerResponse2.getState(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
- 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)));
- }
+ @Test
+ public void startContainerWithLinking() throws DockerException {
- CreateContainerResponse container2 = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999")
- .withName("container2").exec();
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container1").exec();
- LOG.info("Created container2 {}", container2.toString());
- assertThat(container2.getId(), not(isEmptyString()));
+ LOG.info("Created container1 {}", container1.toString());
+ assertThat(container1.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container2.getId())
- .withLinks(new Link("container1", "container1Link")).exec();
+ dockerClient.startContainerCmd(container1.getId()).exec();
- InspectContainerResponse inspectContainerResponse2 = dockerClient
- .inspectContainerCmd(container2.getId()).exec();
- LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString());
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
+ LOG.info("Container1 Inspect: {}", inspectContainerResponse1.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()));
- assertThat(inspectContainerResponse2.getState(), is(notNullValue()));
- assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
+ 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));
- }
-
- @Test
- public void startContainerWithLinking() 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()));
-
- dockerClient.startContainerCmd(container2.getId()).exec();
-
- 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()));
- assertThat(inspectContainerResponse2.getState(), is(notNullValue()));
- assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
-
- }
-
- @Test
- public void startContainer() throws DockerException {
-
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd(new String[] { "top" })
- .exec();
+ if (!inspectContainerResponse1.getState().isRunning()) {
+ assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0)));
+ }
- LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName("container2").withLinks(new Link("container1", "container1Link")).exec();
- dockerClient.startContainerCmd(container.getId()).exec();
+ LOG.info("Created container2 {}", container2.toString());
+ assertThat(container2.getId(), not(isEmptyString()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
- LOG.info("Container Inspect: {}", inspectContainerResponse.toString());
+ dockerClient.startContainerCmd(container2.getId()).exec();
- assertThat(inspectContainerResponse.getConfig(), is(notNullValue()));
- assertThat(inspectContainerResponse.getId(), not(isEmptyString()));
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+ LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString());
- assertThat(inspectContainerResponse.getId(),
- startsWith(container.getId()));
+ 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()));
+ assertThat(inspectContainerResponse2.getState(), is(notNullValue()));
+ assertThat(inspectContainerResponse2.getState().isRunning(), is(true));
- assertThat(inspectContainerResponse.getImageId(), not(isEmptyString()));
- assertThat(inspectContainerResponse.getState(), is(notNullValue()));
+ }
- assertThat(inspectContainerResponse.getState().isRunning(), is(true));
+ @Test
+ public void startContainer() throws DockerException {
- if (!inspectContainerResponse.getState().isRunning()) {
- assertThat(inspectContainerResponse.getState().getExitCode(),
- is(equalTo(0)));
- }
- }
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] { "top" })
+ .exec();
- @Test
- public void testStartNonExistingContainer() throws DockerException {
- try {
- dockerClient.startContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
- }
+ LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- /**
- * 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 startContainerWithNetworkMode() throws DockerException {
+ dockerClient.startContainerCmd(container.getId()).exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("true").exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+ LOG.info("Container Inspect: {}", inspectContainerResponse.toString());
- LOG.info("Created container {}", container.toString());
+ assertThat(inspectContainerResponse.getConfig(), is(notNullValue()));
+ assertThat(inspectContainerResponse.getId(), not(isEmptyString()));
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse.getId(), startsWith(container.getId()));
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getImageId(), not(isEmptyString()));
+ assertThat(inspectContainerResponse.getState(), is(notNullValue()));
- dockerClient.startContainerCmd(container.getId())
- .withNetworkMode("host").exec();
+ assertThat(inspectContainerResponse.getState().isRunning(), is(true));
- inspectContainerResponse = dockerClient.inspectContainerCmd(
- container.getId()).exec();
+ if (!inspectContainerResponse.getState().isRunning()) {
+ assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(0)));
+ }
+ }
- assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(),
- is(equalTo("host")));
- }
+ @Test
+ public void testStartNonExistingContainer() throws DockerException {
+ try {
+ dockerClient.startContainerCmd("non-existing").exec();
+ fail("expected NotFoundException");
+ } catch (NotFoundException e) {
+ }
+ }
- @Test
- public void startContainerWithCapAddAndCapDrop() throws DockerException {
+ /**
+ * 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 startContainerWithNetworkMode() throws DockerException {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true")
+ .withNetworkMode("host").exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).withCapAdd(NET_ADMIN)
- .withCapDrop(MKNOD).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getState().isRunning(), is(true));
+ inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getCapAdd()), contains(NET_ADMIN));
+ assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host")));
+ }
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getCapDrop()), contains(MKNOD));
- }
+ @Test
+ public void startContainerWithCapAddAndCapDrop() throws DockerException {
- @Test
- public void startContainerWithDevices() throws DockerException {
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withCapAdd(NET_ADMIN).withCapDrop(MKNOD).exec();
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container {}", container.toString());
- LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- assertThat(container.getId(), not(isEmptyString()));
+ dockerClient.startContainerCmd(container.getId()).exec();
- dockerClient.startContainerCmd(container.getId())
- .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))
- .exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().isRunning(), is(true));
- assertThat(inspectContainerResponse.getState().isRunning(), is(true));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN));
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getDevices()), contains(new Device("rwm", "/dev/nulo",
- "/dev/zero")));
- }
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD));
+ }
- @Test
- public void startContainerWithExtraHosts() throws DockerException {
+ @Test
+ public void startContainerWithDevices() throws DockerException {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId())
- .withExtraHosts("dockerhost:127.0.0.1").exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- assertThat(inspectContainerResponse.getState().isRunning(), is(true));
+ assertThat(inspectContainerResponse.getState().isRunning(), is(true));
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getExtraHosts()), contains("dockerhost:127.0.0.1"));
- }
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm",
+ "/dev/nulo", "/dev/zero")));
+ }
- @Test
- public void startContainerWithRestartPolicy() throws DockerException {
+ @Test
+ public void startContainerWithExtraHosts() throws DockerException {
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withExtraHosts("dockerhost:127.0.0.1").exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5);
+ dockerClient.startContainerCmd(container.getId()).exec();
- dockerClient.startContainerCmd(container.getId())
- .withRestartPolicy(restartPolicy).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().isRunning(), is(true));
- assertThat(inspectContainerResponse.getState().isRunning(), is(true));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()),
+ contains("dockerhost:127.0.0.1"));
+ }
- assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(),
- is(equalTo(restartPolicy)));
- }
+ @Test
+ public void startContainerWithRestartPolicy() throws DockerException {
- @Test
- public void existingHostConfigIsPreservedByBlankStartCmd()
- throws DockerException {
+ RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5);
- String dnsServer = "8.8.8.8";
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withRestartPolicy(restartPolicy).exec();
- // prepare a container with custom DNS
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withDns(dnsServer)
- .withCmd("true").exec();
+ LOG.info("Created container {}", container.toString());
- LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
- assertThat(container.getId(), not(isEmptyString()));
+ dockerClient.startContainerCmd(container.getId()).exec();
- // start container _without_any_customization_ (important!)
- dockerClient.startContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().isRunning(), is(true));
- // The DNS setting survived.
- assertThat(inspectContainerResponse.getHostConfig().getDns(),
- is(notNullValue()));
- assertThat(Arrays.asList(inspectContainerResponse.getHostConfig()
- .getDns()), contains(dnsServer));
- }
+ assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy)));
+ }
- @Test
- public void existingHostConfigIsResetByConfiguredStartCmd()
- throws DockerException {
- // As of version 1.3.2, Docker assumes that you either configure a
- // container
- // when creating it or when starting it, but not mixing both.
- // See https://github.com/docker-java/docker-java/pull/111
- // If this test starts to fail, this behavior changed and a review of
- // implementation
- // and documentation might be needed.
+ @Test
+ public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerException {
- String dnsServer = "8.8.8.8";
+ String dnsServer = "8.8.8.8";
- // prepare a container with custom DNS
- CreateContainerResponse container = dockerClient
- .createContainerCmd("busybox").withDns(dnsServer)
- .withCmd("true").exec();
+ // prepare a container with custom DNS
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withDns(dnsServer)
+ .withCmd("true").exec();
- LOG.info("Created container {}", container.toString());
+ LOG.info("Created container {}", container.toString());
- assertThat(container.getId(), not(isEmptyString()));
+ assertThat(container.getId(), not(isEmptyString()));
- // modify another setting in start command. Leave DNS unchanged.
- dockerClient.startContainerCmd(container.getId())
- .withPublishAllPorts(true).exec();
+ // start container _without_any_customization_ (important!)
+ dockerClient.startContainerCmd(container.getId()).exec();
- InspectContainerResponse inspectContainerResponse = dockerClient
- .inspectContainerCmd(container.getId()).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- // although start did not modify DNS Settings, they were reset to their
- // default.
- assertThat(inspectContainerResponse.getHostConfig().getDns(),
- is(nullValue(String[].class)));
- }
+ // The DNS setting survived.
+ assertThat(inspectContainerResponse.getHostConfig().getDns(), is(notNullValue()));
+ assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), contains(dnsServer));
+ }
- @Test
- public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception {
- ObjectMapper objectMapper = new ObjectMapper();
- StartContainerCmd command = dockerClient.startContainerCmd("");
- assertThat(objectMapper.writeValueAsString(command), is("{}"));
- }
+ @Test
+ public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception {
+ ObjectMapper objectMapper = new ObjectMapper();
+ StartContainerCmd command = dockerClient.startContainerCmd("");
+ assertThat(objectMapper.writeValueAsString(command), is("{}"));
+ }
}
From 8cefba38e675fcdac985081e777450b7f545566c Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 16 Jun 2015 23:10:30 +0200
Subject: [PATCH 0104/1272] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b71f4e928..b76a052d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
Latest SNAPSHOT
---
+* [#248](https://github.com/docker-java/docker-java/pull/233) Removed deprecated start options
+* [#247](https://github.com/docker-java/docker-java/pull/247) Add Domainname attribute on create command
+* [#245](https://github.com/docker-java/docker-java/pull/245) Added ReadonlyRootfs option
* [#233](https://github.com/docker-java/docker-java/pull/233) Labels are array of Strings (fixes #232)
* [#189](https://github.com/docker-java/docker-java/pull/189) Add docker stats support
From f557ea4fa810c1b3c630aa4b184de4f5629f53ce Mon Sep 17 00:00:00 2001
From: Chris Pheby
Date: Tue, 16 Jun 2015 22:12:26 +0100
Subject: [PATCH 0105/1272] Fixing execution on Windows platforms
---
.../dockerjava/core/command/FrameReader.java | 33 ++++++++++++-------
1 file changed, 22 insertions(+), 11 deletions(-)
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 c39791460..bb36c1764 100644
--- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java
+++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java
@@ -38,23 +38,34 @@ private static StreamType streamType(byte streamType) {
*/
public Frame readFrame() throws IOException {
byte[] header = new byte[HEADER_SIZE];
- int headerSize = inputStream.read(header);
- if (headerSize == -1) {
- return null;
- }
+ int actualHeaderSize = 0;
- if (headerSize != HEADER_SIZE) {
- throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize));
- }
+ do {
+ int headerCount = inputStream.read(header, actualHeaderSize, HEADER_SIZE - actualHeaderSize);
+
+ if (headerCount == -1) {
+ return null;
+ }
+ actualHeaderSize += headerCount;
+ } while (actualHeaderSize < HEADER_SIZE);
int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff);
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));
- }
+ int actualPayloadSize = 0;
+
+ do {
+ int count = inputStream.read(payload, actualPayloadSize, payloadSize - actualPayloadSize);
+
+ if (count == -1) {
+ if (actualPayloadSize != payloadSize) {
+ throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize));
+ }
+ break;
+ }
+ actualPayloadSize += count;
+ } while (actualPayloadSize < payloadSize);
return new Frame(streamType(header[0]), payload);
}
From 6d98872847e3f33b534bbc94e6264aad31aaedbf Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Jun 2015 00:32:06 +0300
Subject: [PATCH 0106/1272] Update CreateContainer with 1.19 changes
---
.../api/command/CreateContainerCmd.java | 40 +++++++++++++
.../core/command/CreateContainerCmdImpl.java | 56 +++++++++++++++++++
2 files changed, 96 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index 3b558b6d9..136b5aecc 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -41,6 +41,26 @@ public static interface Exec extends DockerCmdExec
Date: Sat, 20 Jun 2015 19:35:39 -0700
Subject: [PATCH 0107/1272] Adding Node type for Swarm support:
---
.../github/dockerjava/api/model/Event.java | 9 +++++
.../com/github/dockerjava/api/model/Node.java | 37 +++++++++++++++++++
2 files changed, 46 insertions(+)
create mode 100644 src/main/java/com/github/dockerjava/api/model/Node.java
diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java
index cb961f97d..b68d5b9a6 100644
--- a/src/main/java/com/github/dockerjava/api/model/Event.java
+++ b/src/main/java/com/github/dockerjava/api/model/Event.java
@@ -1,10 +1,12 @@
package com.github.dockerjava.api.model;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.apache.commons.lang.builder.ToStringBuilder;
/**
* Representation of a Docker event.
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class Event {
private String status;
@@ -14,6 +16,9 @@ public class Event {
private long time;
+ @JsonIgnoreProperties
+ private Node node;
+
/**
* Default constructor for the deserialization.
*/
@@ -71,6 +76,10 @@ public long getTime() {
return time;
}
+ public Node getNode() {
+ return node;
+ }
+
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
diff --git a/src/main/java/com/github/dockerjava/api/model/Node.java b/src/main/java/com/github/dockerjava/api/model/Node.java
new file mode 100644
index 000000000..4fcf04e69
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Node.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * A node as returned by the /events API, for instance, when Swarm is used.
+ */
+public class Node {
+
+ @JsonProperty("Name")
+ private String name;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("Addr")
+ private String addr;
+
+ @JsonProperty("Ip")
+ private String ip;
+
+ public String getName() {
+ return name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getAddr() {
+ return addr;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+}
From 10e246728806f9363a6fe663748b60a52992f925 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Wed, 17 Jun 2015 08:33:38 +0200
Subject: [PATCH 0108/1272] 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 0109/1272] 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 0110/1272] 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