From 912b2f7013b96158ca1695b9a82e68aff9a6e97b Mon Sep 17 00:00:00 2001
From: Ritesh Patel
Date: Wed, 1 Apr 2015 17:32:56 -0700
Subject: [PATCH 0001/1262] 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 9e275eb354..723c1bad33 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 8b9880747e..294d50994d 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 0000000000..610c0f8311
--- /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 0000000000..a605d4267a
--- /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 0000000000..ff1d6dc95d
--- /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 534c58ebf6..db64d28436 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 0000000000..33fcf63710
--- /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 bc3afecad6..10c0391881 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 0000000000..97b9a27540
--- /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 1e61b9a7dd..b04ff63ba1 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 869a12fcf7..fb764474f2 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 0000000000..c5e5753738
--- /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 6ab93b4337e9e489d92abc9cd25f782d0b17c870 Mon Sep 17 00:00:00 2001
From: Chun Chen
Date: Mon, 13 Apr 2015 12:58:55 +0800
Subject: [PATCH 0002/1262] 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 d7c8a3245e..0c2df94ad3 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 259310698d..9190eefd26 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 20e47df9a0..18c7f0f098 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 0003/1262] 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 957c157c6c..1dae4be518 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 0004/1262] [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 1dae4be518..95938ea662 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 0005/1262] [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 95938ea662..1279f9c113 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 0006/1262] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b38c17d14c..b7a3864691 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 0007/1262] 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 0000000000..bf77a1334f
--- /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 0000000000..eb11c55364
--- /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 0000000000..22a76de122
--- /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 0000000000..dc2d4c8fc5
--- /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 0008/1262] 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 74512b3901..05e1085505 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 0009/1262] 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 22a76de122..3dae2dd519 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 0010/1262] 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 3dae2dd519..ac356da30c 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 0011/1262] 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 bf77a1334f..3860a5dba8 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 0012/1262] 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 ac356da30c..c39791460b 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 0013/1262] 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 dc2d4c8fc5..2b5e2b644e 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 0014/1262] 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 a2a6dc85f2..708e3139a5 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 5afd0dbb84..18b089d4d5 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 0015/1262] 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 b15d5ca866..dcb1256b0a 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 f652c57001..53337129de 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 0016/1262] * 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 24c7aa5cf2..862259a8e1 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 05491ec6fe..7e0b57b0e1 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 534c58ebf6..7e96225f86 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 0017/1262] 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 53337129de..752f0aefc9 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 0018/1262] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b7a3864691..6ee13f6afa 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 0019/1262] 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 155b36bedb..4aa7d5ac7b 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 0020/1262] 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 c86e13c544..f956568999 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 a1f53f57b9..a893e7f38f 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 eb0b8fd433..0071bff97e 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 3ec5e24c71..131a9a56f1 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 0000000000..717385d9e4
--- /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 69753d6a8c..b85536e101 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 0000000000..223f518cf1
--- /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 8fdf199753..7419e5dc99 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 752f0aefc9..4feadc6b44 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 f7cbe20c33..9a30716535 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 0021/1262] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ee13f6afa..ea8bdf048b 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 0022/1262] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea8bdf048b..33607c66c8 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 0023/1262] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index b7e9c6217e..bbafd8a6a2 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 0024/1262] Updated to jersey 2.17.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 1279f9c113..010165a8bd 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 0025/1262] 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 3860a5dba8..175b568305 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 0026/1262] 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 010165a8bd..1279f9c113 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 0027/1262] 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 0000000000..d6a034f6d8
--- /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 0000000000..61a5fb88bf
--- /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 0000000000..c4d74fc555
--- /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 0028/1262] 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 61a5fb88bf..936cd8b4b7 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 0029/1262] 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 d6a034f6d8..599c884803 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 0030/1262] 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 599c884803..4970a29310 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 0031/1262] 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 b5ea85ed26..3bdfb006cb 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 0032/1262] 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 4970a29310..b3bdf4ea64 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 936cd8b4b7..4654d83dde 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 0000000000..5377ac8a61
--- /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 c4d74fc555..8d9b553e1f 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 0033/1262] 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 b3bdf4ea64..500a6263b4 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 0034/1262] 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 500a6263b4..2d7ca7c8d7 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 0035/1262] 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 ec013d424d..925946db4d 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 c39617ddeb..4b5fc4c322 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 80e16c6d95..9ed38beb75 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 0000000000..4a3a0b507c
--- /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 0000000000..b8975224fe
--- /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 0000000000..dfc330d9eb
--- /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 4654d83dde..3aee3cb45e 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 0000000000..cdd3bba799
--- /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 0036/1262] 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 3aee3cb45e..e8e6bcc652 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 0037/1262] 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 2d7ca7c8d7..840f63da4d 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 e8e6bcc652..0cf08e9531 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 0038/1262] 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 674cb66de6..cb961f97da 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 0039/1262] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 33607c66c8..e6fca225d0 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 0040/1262] 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 dfc330d9eb..b7d86de073 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 0041/1262] 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 b7d86de073..dfc330d9eb 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 0042/1262] 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 18fd340733..9973e6252e 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 0000000000..d5fac09c1b
--- /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 4feadc6b44..c37f484840 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 0043/1262] 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 0000000000..882b3b0124
--- /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 0000000000..96e5df7266
--- /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 0000000000..b465b2aacc
--- /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 0044/1262] 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 0000000000..500919fdce
--- /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 0000000000..2e294b1460
--- /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 0000000000..ea31d6f338
--- /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 0000000000..c4383ef14c
--- /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 0045/1262] 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 62ebc11815..e23ddc9e8d 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 223f518cf1..a898ed57f5 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 0046/1262] 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 2deddca099..f1270f4e67 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 0047/1262] 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 f07fa1b25c..297adc7669 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 0000000000..3fc910217d
--- /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 aa88287b4f..33e0f2a477 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 046565d3f9..dbccda5fcf 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 21d938ffdd..f5b25f2b3d 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 0048/1262] 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 f5b25f2b3d..802299a7c2 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 0049/1262] 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 0cf08e9531..0c22fc085a 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 0050/1262] 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 dbccda5fcf..ef02428573 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 bd8a56d2d7..c9bd51b902 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 0051/1262] 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 78d26feada..32ab45f2af 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 0052/1262] 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 dfc330d9eb..7d4f9d4ef8 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 0053/1262] 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 32ab45f2af..924fdaedd4 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 0054/1262] 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 dcb1256b0a..ce8c6b88f9 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 0055/1262] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e6fca225d0..3d3cb24d78 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 0056/1262] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index bbafd8a6a2..6516793d26 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 0057/1262] 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 c37f484840..c652f51d72 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 7d4f9d4ef8..07bca25b5e 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 0058/1262] 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 6516793d26..9584fdcb6e 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 1279f9c113..d9aa194da0 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 0059/1262] [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 d9aa194da0..0b28d5dd67 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 0060/1262] [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 0b28d5dd67..f8eb34ced0 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 0061/1262] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d3cb24d78..ea3118178e 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 0062/1262] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 9584fdcb6e..4c77e896c6 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 0063/1262] 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 924fdaedd4..db14ab21b4 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 0064/1262] 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 b465b2aacc..b6a33b7224 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 0065/1262] 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 bc3afecad6..3636bfd064 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 0000000000..651db983df
--- /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 0000000000..7ba9d8abdb
--- /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 0000000000..fbde136ffa
--- /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 0000000000..c3c1415f1a
--- /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 f92949294b..569283ce70 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 0066/1262] 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 abdec8f584..0fb72d452f 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 05e1085505..c966ef9530 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 0067/1262] 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 1e61b9a7dd..802166a001 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 840f63da4d..53131c611c 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 0c22fc085a..24c8335596 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 8d9b553e1f..9aa6b98472 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 0068/1262] 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 9e275eb354..1cd3e07606 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 18b8669ea8..0000000000
--- 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 cfdb23a642..c3016a7ff3 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 0000000000..c636c06cf1
--- /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 7e96225f86..599db377a3 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 ac55de7144..07180bdf97 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 db14ab21b4..37c048fa1e 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 0000000000..5f68ab09b6
--- /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 bf40dbfc0f..752ff34231 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 569283ce70..ab3e5c30ba 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 0069/1262] 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 9a30716535..045c008e1d 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 0070/1262] 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 db14ab21b4..a601ea90c0 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 97b9a27540..c0c6f36c1b 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 c5e5753738..1e6baffd21 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 0071/1262] 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 80c22cd698..373680471e 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 0072/1262] 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 1e6baffd21..b82f2f75c6 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 0073/1262] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4c77e896c6..7948c67766 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 0074/1262] 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 fb63f2ff08..bf96b9fc14 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 0075/1262] 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 569283ce70..46600a1601 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 0076/1262] 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 f8eb34ced0..ee80a9c9e8 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 bdb0ee75a6..bea30de0ef 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 0077/1262] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea3118178e..b71f4e928a 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 0078/1262] 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 e76598e3ee..aeddfd0bdb 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 dba35fb99d..27fca12f81 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 0079/1262] 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 70108ae68b..6408399155 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 0080/1262] 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 b7469a43d9..58f85e7ea7 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 0081/1262] 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 58f85e7ea7..9e375f24a5 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 0082/1262] 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 651db983df..d785bff7cb 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 0083/1262] 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 9e375f24a5..1e77e5b26f 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 d785bff7cb..63fea0954f 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 0084/1262] 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 297adc7669..0afd5171df 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 0085/1262] 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 9973e6252e..6b8cdcd45d 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 0086/1262] 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 1e77e5b26f..8a5d5d8792 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 0087/1262] 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 46600a1601..0d61c8f590 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 0088/1262] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 7948c67766..a4c18a0ce7 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 0089/1262] 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 708e3139a5..fa8f40f339 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 18b089d4d5..4b3f064e29 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 0090/1262] 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 4b3f064e29..cc082b61fa 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 0091/1262] 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 fa8f40f339..be6e83adf7 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 4b3f064e29..cc082b61fa 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 0092/1262] 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 be6e83adf7..3b558b6d94 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 0093/1262] 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 aeddfd0bdb..2195e1ecaf 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 27fca12f81..6fe60734d0 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 6408399155..d690f4e139 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 0094/1262] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b71f4e928a..b76a052d8c 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 0095/1262] 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 c39791460b..bb36c1764b 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 0096/1262] 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 3b558b6d94..136b5aecc0 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 0097/1262] 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 cb961f97da..b68d5b9a6e 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 0000000000..4fcf04e691
--- /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 0098/1262] 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 82f727355f..ef16085bba 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 0000000000..f4f519d3e8
--- /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 b719c227cf..0000000000
--- 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 0000000000..4745fae186
--- /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 0fb72d452f..ffb282095e 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 fdab3700e1..17ec372483 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 c966ef9530..2eff3c217a 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 d06d098358..0547cc616f 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 4503e4f17b..b9bdb7edc5 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 0000000000..cc6474d096
--- /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 0000000000..24d83b1295
--- /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 0000000000..c885758899
--- /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 0000000000..c98cddf4c0
--- /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 fc38ae7d92..749f615001 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 07180bdf97..d1de2e60f8 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 d405a80269..bd518ddb7e 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 c10f00e577..678a9ef49c 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 de4bb3f0c9..29f331a2f4 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 aa60ef60a4..98b93fd486 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 7d031bddd2..a738ef976a 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 9749a21da4..908b2522d8 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 0000000000..f8baeef987
--- /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 0000000000..cddfe49ede
--- /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 0000000000..0d380b5db4
--- /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 73990bf515..0000000000
--- 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 373680471e..9eda0cbc51 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 0000000000..dec4a3b3b4
--- /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 c9bd51b902..a94209fea5 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 c652f51d72..94d4cff62a 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 34a74ad806..ecb7ab66cd 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 80619efeb5..a62a5bd9a5 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 24c8335596..6f847ebede 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 94a27b1d33..7b43e13121 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 e809e25e31..845f8f9c16 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 0099/1262] 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 f4f519d3e8..2954b92427 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 eb11c55364..0040c1bc8b 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 cc6474d096..220cd80ef1 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 24d83b1295..5339b3ed06 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 c98cddf4c0..f56db8db43 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 bb36c1764b..69114dae85 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 9eda0cbc51..ec70de4c7c 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 dec4a3b3b4..c4147f1a52 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 ecb7ab66cd..baaeb8ca38 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 7b43e13121..18c001c5ff 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 845f8f9c16..5ccb010385 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 0000000000..90cca5e64f
--- /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 0000000000..88b444bf0e
--- /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 0100/1262] 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 1e04bcb3b0..2696c5bc1d 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 bed2a375e5..6a84fdee3d 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 723c1bad33..2e0543ae96 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 85efc34988..538698bb6e 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 673bf2ccce..48bb2dd903 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 366484e53b..cda5602ed7 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 affa4ce9b4..78345a68ba 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 10f328cdc3..67e6f18bf8 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 d521bae2d6..fa0aa459fe 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 5d48d2163f..b097d6523f 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 0fb72d452f..c45a73247f 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 3c5922583b..c84fcb3b9e 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 925946db4d..5dd1cc1771 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 ac0a7bb5e5..2c24a0f42b 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 21d99045d0..ed70284604 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 5e85d99840..eb67dfbd98 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 d268247159..a25535d5be 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 89c31666fa..79236b8904 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 8cf13e7bbf..635395ed04 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 294d50994d..fc750a7438 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 18b8669ea8..867f186cd0 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 cfdb23a642..5a7c2e275f 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 c1f32e2935..ffeef01536 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 7ccb90cffb..339e2c9a0a 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 d340fe2686..10e3597e66 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 f67fe4aeab..e0d0878474 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