From f5d2b9e927b34feba634de1ba8a37f2cbed57129 Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Tue, 9 Dec 2014 17:32:27 +0100 Subject: [PATCH 0001/1399] Tests for starting a Container with existing configuration This illustrates an issue with current docker-java: you cannot send a StartContainerCmd without payload. --- .../command/StartContainerCmdImplTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) 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 fedbc5fa1..98704fd33 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -2,6 +2,7 @@ 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 org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; @@ -386,4 +387,55 @@ public void startContainerWithRestartPolicy() throws DockerException { is(equalTo(restartPolicy))); } + @Test + public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerException { + + String dnsServer = "8.8.8.8"; + + // prepare a container with custom DNS + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withDns(dnsServer) + .withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + // start container _without_any_customization_ (important!) + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container + .getId()).exec(); + + // The DNS setting survived. + assertThat(inspectContainerResponse.getHostConfig().getDns(), is(notNullValue())); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(dnsServer)); + } + + @Test + public void existingHostConfigIsResetByConfiguredStartCmd() throws DockerException { + + String dnsServer = "8.8.8.8"; + + // prepare a container with custom DNS + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withDns(dnsServer) + .withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + // modify another setting in start command. Leave DNS unchanged. + dockerClient.startContainerCmd(container.getId()).withPublishAllPorts(true).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))); + } } From 72d90218926c76c68817ef432ac1bc90cb23119a Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Tue, 9 Dec 2014 18:37:58 +0100 Subject: [PATCH 0002/1399] Do not serialize unconfigured values in StartContainerCmd Any payload sent with the StartContainerCmd will cause the target container to lose its customization. So in order to just start a preconfigured container you must be able to send an empty "{}" message to the /containers/{id}/start endpoint. This is accomplished by all configuration defaulting to null in combination with @JsonInclude(NON_EMPTY). --- .../api/command/StartContainerCmd.java | 8 +++--- .../core/command/StartContainerCmdImpl.java | 27 +++++++++++-------- 2 files changed, 20 insertions(+), 15 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 59aab1ed3..ef96267f7 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -24,9 +24,9 @@ public interface StartContainerCmd extends DockerCmd { public Ports getPortBindings(); - public boolean isPublishAllPorts(); + public Boolean isPublishAllPorts(); - public boolean isPrivileged(); + public Boolean isPrivileged(); public String[] getDns(); @@ -70,9 +70,9 @@ public interface StartContainerCmd extends DockerCmd { */ public StartContainerCmd withPortBindings(PortBinding... portBindings); - public StartContainerCmd withPrivileged(boolean privileged); + public StartContainerCmd withPrivileged(Boolean privileged); - public StartContainerCmd withPublishAllPorts(boolean publishAllPorts); + public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts); /** * Set custom DNS servers 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 60d728f0f..63ff4ff0e 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,8 +1,11 @@ package com.github.dockerjava.core.command; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; + import org.apache.commons.lang.builder.ToStringBuilder; 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; @@ -22,15 +25,17 @@ /** * Start a container */ +@JsonInclude(NON_EMPTY) public class StartContainerCmdImpl extends AbstrDockerCmd implements StartContainerCmd { + @JsonIgnore private String containerId; @JsonProperty("Binds") - private Binds binds = new Binds(); + private Binds binds; @JsonProperty("Links") - private Links links = new Links(); + private Links links; @JsonProperty("LxcConf") private LxcConf[] lxcConf; @@ -39,10 +44,10 @@ public class StartContainerCmdImpl extends AbstrDockerCmd Date: Thu, 11 Dec 2014 19:15:39 +0100 Subject: [PATCH 0003/1399] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d189f89c..2f61e1de0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Change Log === +docker-java-0.10.5-SNAPSHOT +--- + + * [#111](https://github.com/docker-java/docker-java/pull/111) Allow to send empty messages in StartContainerCmd + docker-java-0.10.4 --- From 4c960a9a52af5f2b0351986a3c29eb9b7f8a142c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 11 Dec 2014 19:19:47 +0100 Subject: [PATCH 0004/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f61e1de0..3f2722676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ docker-java-0.10.5-SNAPSHOT docker-java-0.10.4 --- - * [#108](https://github.com/docker-java/docker-java/pull/108) Support tag in push image command + * [#108](https://github.com/docker-java/docker-java/pull/109) Support tag in push image command * [#106](https://github.com/docker-java/docker-java/pull/106) Allow to manage Linux capabilities in CreateContainerCmd * [#105](https://github.com/docker-java/docker-java/pull/105) Allow to pass HostConfig when creating a container * [#103](https://github.com/docker-java/docker-java/pull/103) Make GoLangMatchFileFilter work on Windows From 5a7014fda2672274764d9e4511bb73021783a4ce Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 11 Dec 2014 19:20:01 +0100 Subject: [PATCH 0005/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f2722676..9b99ef861 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ docker-java-0.10.5-SNAPSHOT docker-java-0.10.4 --- - * [#108](https://github.com/docker-java/docker-java/pull/109) Support tag in push image command + * [#109](https://github.com/docker-java/docker-java/pull/109) Support tag in push image command * [#106](https://github.com/docker-java/docker-java/pull/106) Allow to manage Linux capabilities in CreateContainerCmd * [#105](https://github.com/docker-java/docker-java/pull/105) Allow to pass HostConfig when creating a container * [#103](https://github.com/docker-java/docker-java/pull/103) Make GoLangMatchFileFilter work on Windows From 341558275b3952baaa5fc777032f9ddb86df159b Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Fri, 12 Dec 2014 13:17:57 +0100 Subject: [PATCH 0006/1399] Test for serialization of an unconfigured StartContainerCmd, documentation --- .../com/github/dockerjava/api/DockerClient.java | 14 ++++++++++++++ .../core/command/StartContainerCmdImplTest.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 52323942f..4052e87b9 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -79,6 +79,20 @@ public CreateImageCmd createImageCmd(String repository, 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 InspectContainerCmd inspectContainerCmd(String containerId); 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 98704fd33..486f03b31 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -15,10 +15,12 @@ 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.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 org.testng.ITestResult; @@ -416,6 +418,11 @@ public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerExceptio @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. String dnsServer = "8.8.8.8"; @@ -438,4 +445,11 @@ public void existingHostConfigIsResetByConfiguredStartCmd() throws DockerExcepti // although start did not modify DNS Settings, they were reset to their default. assertThat(inspectContainerResponse.getHostConfig().getDns(), is(nullValue(String[].class))); } + + @Test + public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + StartContainerCmd command = dockerClient.startContainerCmd(""); + assertThat(objectMapper.writeValueAsString(command), is("{}")); + } } From f592918fd86192a13b0efef9fee8914545bce826 Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Fri, 12 Dec 2014 13:47:44 +0100 Subject: [PATCH 0007/1399] Test for StartContainerCmd.withVolumesFrom() --- .../dockerjava/api/model/VolumeBind.java | 5 +++ .../client/AbstractDockerClientTest.java | 26 +++++++++++ .../command/StartContainerCmdImplTest.java | 43 ++++++++++++++++--- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java index d662f2b8f..41028b6dc 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java @@ -16,4 +16,9 @@ public String getContainerPath() { public String getHostPath() { return hostPath; } + + @Override + public String toString() { + return hostPath + ":" + containerPath; + } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 4418a8d5f..3ed64d9a7 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -1,10 +1,18 @@ package com.github.dockerjava.client; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; + 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.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.google.common.base.Joiner; + import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.slf4j.Logger; @@ -18,6 +26,8 @@ import java.lang.reflect.Method; import java.net.DatagramSocket; import java.net.ServerSocket; +import java.util.ArrayList; +import java.util.List; public abstract class AbstractDockerClientTest extends Assert { @@ -158,4 +168,20 @@ public static boolean available(int port) { return false; } + /** + * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) + * has {@link VolumeBind}s for the given {@link Volume}s + */ + 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())); + } + assertThat(volumes, contains(expectedVolumes)); + } + } 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 486f03b31..de744b59a 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -84,18 +84,49 @@ public void startContainerWithVolumes() throws DockerException { inspectContainerResponse = dockerClient.inspectContainerCmd(container .getId()).exec(); - VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); - List volumes = new ArrayList(); - for(VolumeBind bind :volumeBinds){ - volumes.add(bind.getContainerPath()); - } - assertThat(volumes, contains(volume1.getPath(), volume2.getPath())); + assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(volume1, volume2)); } + @Test + public void startContainerWithVolumesFrom() throws DockerException { + + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); + + String container1Name = UUID.randomUUID().toString(); + + CreateContainerResponse container1 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name).exec(); + LOG.info("Created container1 {}", container1.toString()); + + dockerClient.startContainerCmd(container1.getId()).withBinds( + new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Started container1 {}", container1.toString()); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( + container1.getId()).exec(); + + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + + + CreateContainerResponse container2 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container2 {}", container2.toString()); + + dockerClient.startContainerCmd(container2.getId()).withVolumesFrom(container1Name).exec(); + LOG.info("Started container2 {}", container2.toString()); + + InspectContainerResponse inspectContainerResponse2 = dockerClient + .inspectContainerCmd(container2.getId()).exec(); + + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } + @Test public void startContainerWithDns() throws DockerException { From 91a36fedecf13e20d46bdfdd747a10322d8f4005 Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 17 Dec 2014 17:36:27 +0100 Subject: [PATCH 0008/1399] Fix CreateContainerCmdImpl.withVolumesFrom() Another method that did not work until Docker Remote API 1.15, see CreateContainerCmd.withDns(). To fix it, the parameter had to be moved to nested HostConfig. --- .../core/command/CreateContainerCmdImpl.java | 5 +- .../command/CreateContainerCmdImplTest.java | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 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 8a6509bc6..8a4607c26 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -41,7 +41,6 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd Date: Wed, 17 Dec 2014 18:23:59 +0100 Subject: [PATCH 0009/1399] Change serialization of RestartPolicy.noRestart() The Docker CLI uses "" as the name for the --restart no policy. --- .../dockerjava/api/model/RestartPolicy.java | 2 +- .../model/RestartPolicy_SerializingTest.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 936a5b819..0ce3b0ed4 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -23,7 +23,7 @@ public class RestartPolicy { private int maximumRetryCount = 0; @JsonProperty("Name") - private String name = "no"; + private String name = ""; public RestartPolicy() { } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java new file mode 100644 index 000000000..7b13a3958 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Compares serialization results of various {@link RestartPolicy}s with + * what Docker (as of 1.3.3) actually sends when executing + * docker run --restart xxx. + */ +public class RestartPolicy_SerializingTest { + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test // --restart no + public void noRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); + } + + @Test // --restart always + public void alwaysRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); + } + + @Test // --restart on-failure + public void onFailureRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); + } + + @Test // --restart on-failure:2 + public void onFailureRestartWithCount() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); + assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); + } + +} From fc6429be2dd8b0248819bf3fa741dc2487b7bd5a Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 17 Dec 2014 18:52:59 +0100 Subject: [PATCH 0010/1399] Parser and toString for RestartPolicy --- .../dockerjava/api/model/RestartPolicy.java | 74 +++++++++++++++++-- .../api/model/RestartPolicy_ParsingTest.java | 40 ++++++++++ .../api/model/RestartPolicy_toStringTest.java | 25 +++++++ 3 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 0ce3b0ed4..5cdcb70bc 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -9,10 +9,17 @@ /** * Container restart policy * - * no – Do not restart the container if it dies. (default) - * on-failure – Restart the container if it exits with a non-zero exit code. - * Can also accept an optional maximum restart count (e.g. on-failure:5). - * always – Always restart the container no matter what exit code is returned. + *

+ *
no
+ *
Do not restart the container if it dies. (default)
+ * + *
on-failure
+ *
Restart the container if it exits with a non-zero exit code. + * Can also accept an optional maximum restart count (e.g. on-failure:5).
+ * + *
always
+ *
Always restart the container no matter what exit code is returned.
+ *
* * @author marcus * @@ -33,15 +40,27 @@ private RestartPolicy(int maximumRetryCount, String name) { this.maximumRetryCount = maximumRetryCount; this.name = name; } - + + /** + * Do not restart the container if it dies. (default) + */ public static RestartPolicy noRestart() { return new RestartPolicy(); } - + + /** + * Always restart the container no matter what exit code is returned. + */ public static RestartPolicy alwaysRestart() { return new RestartPolicy(0, "always"); } - + + /** + * Restart the container if it exits with a non-zero exit code. + * + * @param maximumRetryCount the maximum number of restarts. + * Set to 0 for unlimited retries. + */ public static RestartPolicy onFailureRestart(int maximumRetryCount) { return new RestartPolicy(maximumRetryCount, "on-failure"); } @@ -54,6 +73,47 @@ public String getName() { return name; } + /** + * Parses a textual restart polixy specification (as used by the Docker CLI) + * to a {@link RestartPolicy}. + * + * @param serialized the specification, e.g. on-failure:2 + * @return a {@link RestartPolicy} matching the specification + * @throws IllegalArgumentException if the specification cannot be parsed + */ + public static RestartPolicy parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split(":"); + String name = parts[0]; + if ("no".equals(name)) + return noRestart(); + if ("always".equals(name)) + return alwaysRestart(); + if ("on-failure".equals(name)) { + int count = 0; + if (parts.length == 2) { + count = Integer.parseInt(parts[1]); + } + return onFailureRestart(count); + } + throw new IllegalArgumentException(); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link RestartPolicy}. + * The format is name[:count], like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link RestartPolicy} + */ + @Override + public String toString() { + String result = name.isEmpty() ? "no" : name; + return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; + } + @Override public boolean equals(Object obj) { if (obj instanceof RestartPolicy) { diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java new file mode 100644 index 000000000..04823db24 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +public class RestartPolicy_ParsingTest { + + @Test + public void noRestart() throws Exception { + assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); + } + + @Test + public void alwaysRestart() throws Exception { + assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); + } + + @Test + public void onFailureRestart() throws Exception { + assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); + } + + @Test + public void onFailureRestartWithCount() throws Exception { + assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") + public void illegalSyntax() throws Exception { + RestartPolicy.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") + public void illegalRetryCount() throws Exception { + RestartPolicy.parse("on-failure:X"); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java new file mode 100644 index 000000000..a52441d63 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class RestartPolicy_toStringTest { + + @DataProvider(name = "input") + public Object[][] restartPolicies() { + return new Object[][] { + { "no" }, + { "always" }, + { "on-failure" }, + { "on-failure:2" } + }; + } + + @Test(dataProvider = "input") + public void serializationWithoutCount(String policy) throws Exception { + assertEquals(RestartPolicy.parse(policy).toString(), policy); + } + +} From 0502d10c0b5545bb37cb4aba1a164be5fe0abe71 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 17 Dec 2014 20:57:32 +0100 Subject: [PATCH 0011/1399] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b99ef861..2370e11ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,9 @@ Change Log docker-java-0.10.5-SNAPSHOT --- - + + * [#115](https://github.com/docker-java/docker-java/pull/115) Polish RestartPolicy + * [#114](https://github.com/docker-java/docker-java/pull/114) Fix CreateContainerCmdImpl.withVolumesFrom() * [#111](https://github.com/docker-java/docker-java/pull/111) Allow to send empty messages in StartContainerCmd docker-java-0.10.4 From 9b45d934c3bed4b14fad54f3ef3c79685ada88e5 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Tue, 23 Dec 2014 12:11:59 +0000 Subject: [PATCH 0012/1399] Use chunked encoding when passing the docker image. If you don't do this, you very often run out of heap space, as the webclient will create a buffer for the entire image file (possibly many gigabytes) before sending it. Signed-off-by: Nigel Magnay --- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 71d3f902c..85c5f18c2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -8,6 +8,8 @@ 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; @@ -39,6 +41,10 @@ protected InputStream execute(BuildImageCmd command) { webResource = webResource.queryParam("q", "true"); } + + webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); + webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024*1024); + LOGGER.debug("POST: {}", webResource); return webResource .request() From f86abdbf9240279c3e7c113edecdb2190394c433 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 23 Dec 2014 20:17:33 +0100 Subject: [PATCH 0013/1399] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2370e11ec..55f09fc26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ Change Log docker-java-0.10.5-SNAPSHOT --- - + + * [#118](https://github.com/docker-java/docker-java/pull/118) Use chunked encoding when passing the docker image * [#115](https://github.com/docker-java/docker-java/pull/115) Polish RestartPolicy * [#114](https://github.com/docker-java/docker-java/pull/114) Fix CreateContainerCmdImpl.withVolumesFrom() * [#111](https://github.com/docker-java/docker-java/pull/111) Allow to send empty messages in StartContainerCmd From 20a72fc146d61ea9de9f03471fc3380acc127188 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 19 Dec 2014 10:21:36 +0000 Subject: [PATCH 0014/1399] Currently, the certificates present for SSL access must all be accessible on the local disk. This is inconvenient for some clients who may already have a pre-baked keystore in hand. Create different options for retrieving the neccessary SSLContext, so that the two different options can be used. Signed-off-by: Nigel Magnay --- .../dockerjava/core/KeystoreSSLConfig.java | 133 ++++++++++++++++++ .../core/LocalDirectorySSLConfig.java | 101 +++++++++++++ .../com/github/dockerjava/core/SSLConfig.java | 22 +++ 3 files changed, 256 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java create mode 100644 src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java create mode 100644 src/main/java/com/github/dockerjava/core/SSLConfig.java diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java new file mode 100644 index 000000000..269b87658 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -0,0 +1,133 @@ +package com.github.dockerjava.core; + +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.Serializable; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * An SSL Config that is based on an pre-existing or pre-loaded KeyStore. + */ +public class KeystoreSSLConfig implements SSLConfig, Serializable { + + private final KeyStore keystore; + private final String keystorePassword; + + /** + * @param keystore a KeyStore + * @param keystorePassword key password + */ + public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { + this.keystorePassword = keystorePassword; + Preconditions.checkNotNull(keystore); + this.keystore = keystore; + } + + /** + * + * @param pfxFile a PKCS12 file + * @param password Password for the keystore + * @throws KeyStoreException + * @throws IOException + * @throws CertificateException + * @throws NoSuchAlgorithmException + */ + public KeystoreSSLConfig(File pfxFile, String password) + throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { + Preconditions.checkNotNull(pfxFile); + Preconditions.checkNotNull(password); + keystore = KeyStore.getInstance("pkcs12"); + keystore.load(new FileInputStream(pfxFile), password.toCharArray()); + keystorePassword = password; + } + + + /** + * Get the SSL Context out of the keystore. + * @return java SSLContext + * @throws KeyManagementException + * @throws UnrecoverableKeyException + * @throws NoSuchAlgorithmException + * @throws KeyStoreException + */ + @Override + public SSLContext getSSLContext() + throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, + KeyStoreException { + + final SSLContext context = SSLContext.getInstance("TLS"); + + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + + if (httpProtocols != null) + System.setProperty("https.protocols", httpProtocols); + + final KeyManagerFactory + keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(keystore, keystorePassword.toCharArray()); + context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{ + new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + + @Override + public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { + + } + + @Override + public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { + + } + } + }, new SecureRandom()); + + return context; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + KeystoreSSLConfig that = (KeystoreSSLConfig) o; + + return keystore.equals(that.keystore); + + } + + @Override + public int hashCode() { + return keystore.hashCode(); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("keystore", keystore) + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java new file mode 100644 index 000000000..ef57a0de3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -0,0 +1,101 @@ +package com.github.dockerjava.core; + +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; + +import com.github.dockerjava.api.DockerClientException; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.glassfish.jersey.SslConfigurator; + +import java.io.Serializable; +import java.security.KeyStore; +import java.security.Security; + +import javax.net.ssl.SSLContext; + +/** + * SSL Config from local files. + */ +public class LocalDirectorySSLConfig implements SSLConfig, Serializable { + + private final String dockerCertPath; + + public LocalDirectorySSLConfig(String dockerCertPath) { + Preconditions.checkNotNull(dockerCertPath); + this.dockerCertPath = dockerCertPath; + } + + public String getDockerCertPath() { + return dockerCertPath; + } + + @Override + public SSLContext getSSLContext() { + + boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); + + if (certificatesExist) { + + try { + + Security.addProvider(new BouncyCastleProvider()); + + KeyStore keyStore = CertificateUtils.createKeyStore(dockerCertPath); + KeyStore trustStore = CertificateUtils.createTrustStore(dockerCertPath); + + // properties acrobatics not needed for java > 1.6 + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + SslConfigurator sslConfig = SslConfigurator.newInstance(true); + if (httpProtocols != null) { + System.setProperty("https.protocols", httpProtocols); + } + + sslConfig.keyStore(keyStore); + sslConfig.keyStorePassword("docker"); + sslConfig.trustStore(trustStore); + + return sslConfig.createSSLContext(); + + + } catch (Exception e) { + throw new DockerClientException(e.getMessage(), e); + } + + } + + return null; + + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LocalDirectorySSLConfig that = (LocalDirectorySSLConfig) o; + + if (!dockerCertPath.equals(that.dockerCertPath)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + return dockerCertPath.hashCode(); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("dockerCertPath", dockerCertPath) + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/SSLConfig.java b/src/main/java/com/github/dockerjava/core/SSLConfig.java new file mode 100644 index 000000000..21024c4f6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/SSLConfig.java @@ -0,0 +1,22 @@ +package com.github.dockerjava.core; + +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; + +import javax.net.ssl.SSLContext; + +/** + * Get an SSL Config. Allows for various different implementations. + */ +public interface SSLConfig { + + /** + * Get the SSL Context, from wherever it comes (file, keystore). + * @return an SSL context. + */ + SSLContext getSSLContext() + throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, + KeyStoreException; +} From 138b11ef91c0414c889a2bff28733c3f8ef89fec Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 19 Dec 2014 10:22:24 +0000 Subject: [PATCH 0015/1399] Change the client configuration so that it can optionally take an SSLConfig. Signed-off-by: Nigel Magnay --- .../dockerjava/core/DockerClientConfig.java | 36 +++++++++------- .../jaxrs/DockerCmdExecFactoryImpl.java | 41 ++++--------------- .../core/DockerClientConfigTest.java | 6 +-- .../dockerjava/core/DockerClientImplTest.java | 2 +- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index ff1329c69..db27940a4 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -6,11 +6,12 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.io.Serializable; import java.net.URI; import java.util.Map; import java.util.Properties; -public class DockerClientConfig { +public class DockerClientConfig implements Serializable { private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; @@ -41,21 +42,22 @@ public class DockerClientConfig { .build(); private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; private final URI uri; - private final String version, username, password, email, serverAddress, dockerCertPath, dockerCfgPath; + private final String version, username, password, email, serverAddress, dockerCfgPath; private final Integer readTimeout; private final boolean loggingFilterEnabled; + private final SSLConfig sslConfig; - DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCertPath, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled) { + DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, SSLConfig sslConfig) { this.uri = uri; this.version = version; this.username = username; this.password = password; this.email = email; this.serverAddress = serverAddress; - this.dockerCertPath = dockerCertPath; this.dockerCfgPath = dockerCfgPath; this.readTimeout = readTimeout; this.loggingFilterEnabled = loggingFilterEnabled; + this.sslConfig = sslConfig; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -212,15 +214,15 @@ public boolean isLoggingFilterEnabled() { return loggingFilterEnabled; } - public String getDockerCertPath() { - return dockerCertPath; + public SSLConfig getSslConfig() { + return sslConfig; } public String getDockerCfgPath() { return dockerCfgPath; } - @Override + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; @@ -228,7 +230,7 @@ public boolean equals(Object o) { DockerClientConfig that = (DockerClientConfig) o; if (loggingFilterEnabled != that.loggingFilterEnabled) return false; - if (dockerCertPath != null ? !dockerCertPath.equals(that.dockerCertPath) : that.dockerCertPath != null) + if (sslConfig != null ? !sslConfig.equals(that.sslConfig) : that.sslConfig != null) return false; if (dockerCfgPath != null ? !dockerCfgPath.equals(that.dockerCfgPath) : that.dockerCfgPath != null) return false; @@ -252,8 +254,8 @@ public int hashCode() { result = 31 * result + (password != null ? password.hashCode() : 0); result = 31 * result + (email != null ? email.hashCode() : 0); result = 31 * result + (serverAddress != null ? serverAddress.hashCode() : 0); - result = 31 * result + (dockerCertPath != null ? dockerCertPath.hashCode() : 0); result = 31 * result + (dockerCfgPath != null ? dockerCfgPath.hashCode() : 0); + result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); result = 31 * result + (readTimeout != null ? readTimeout.hashCode() : 0); result = 31 * result + (loggingFilterEnabled ? 1 : 0); return result; @@ -268,8 +270,8 @@ public String toString() { ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress + '\'' + - ", dockerCertPath='" + dockerCertPath + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + + ", sslConfig='" + sslConfig + '\'' + ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + '}'; @@ -277,9 +279,10 @@ public String toString() { public static class DockerClientConfigBuilder { private URI uri; - private String version, username, password, email, serverAddress, dockerCertPath, dockerCfgPath; + private String version, username, password, email, serverAddress, dockerCfgPath; private Integer readTimeout; private boolean loggingFilterEnabled; + private SSLConfig sslConfig; /** * This will set all fields in the builder to those contained in the Properties object. The Properties object @@ -342,7 +345,7 @@ public final DockerClientConfigBuilder withLoggingFilter(boolean loggingFilterEn } public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { - this.dockerCertPath = dockerCertPath; + this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); return this; } @@ -352,6 +355,11 @@ public final DockerClientConfigBuilder withDockerCfgPath(String dockerCfgPath) { } + public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { + this.sslConfig = config; + return this; + } + public DockerClientConfig build() { return new DockerClientConfig( uri, @@ -360,10 +368,10 @@ public DockerClientConfig build() { password, email, serverAddress, - dockerCertPath, dockerCfgPath, readTimeout, - loggingFilterEnabled + loggingFilterEnabled, + sslConfig ); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 862824fcc..64222a972 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -52,43 +52,16 @@ public void init(DockerClientConfig dockerClientConfig) { ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); - String dockerCertPath = dockerClientConfig.getDockerCertPath(); - - if (dockerCertPath != null) { - boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); - - if (certificatesExist) { - - try { - - Security.addProvider(new BouncyCastleProvider()); - - KeyStore keyStore = CertificateUtils.createKeyStore(dockerCertPath); - KeyStore trustStore = CertificateUtils.createTrustStore(dockerCertPath); - - // properties acrobatics not needed for java > 1.6 - String httpProtocols = System.getProperty("https.protocols"); - System.setProperty("https.protocols", "TLSv1"); - SslConfigurator sslConfig = SslConfigurator.newInstance(true); - if (httpProtocols != null) System.setProperty("https.protocols", httpProtocols); - - sslConfig.keyStore(keyStore); - sslConfig.keyStorePassword("docker"); - sslConfig.trustStore(trustStore); - - SSLContext sslContext = sslConfig.createSSLContext(); - - - clientBuilder.sslContext(sslContext); - - } catch (Exception e) { - throw new DockerClientException(e.getMessage(), e); - } - - } + try { + SSLContext ssl = dockerClientConfig.getSslConfig().getSSLContext(); + if (ssl != null) + clientBuilder.sslContext(ssl); + } catch(Exception ex) { + throw new DockerClientException("Error in SSL Configuration", ex); } + client = clientBuilder.build(); WebTarget webResource = client.target(dockerClientConfig.getUri()); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 06bb1ea12..7b5e4e1f2 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,12 +16,12 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flim", "flam", 877, false); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, new LocalDirectorySSLConfig("flim")); } @Test public void string() throws Exception { - assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCertPath='flim', dockerCfgPath='flam', readTimeout=877, loggingFilterEnabled=false}", + assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false}", EXAMPLE_CONFIG.toString()); } @@ -104,8 +104,8 @@ public void defaults() throws Exception { assertEquals(config.getServerAddress(), AuthConfig.DEFAULT_SERVER_ADDRESS); assertEquals(config.getVersion(), null); assertEquals(config.isLoggingFilterEnabled(), true); - assertEquals(config.getDockerCertPath(), "someHomeDir/.docker"); assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); + assertEquals( ((LocalDirectorySSLConfig)config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); } @Test diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index c31db1ba9..a91fa109e 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null, 0, false); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config From f0e78bdafd77ccf2fa6d6235e8743601261d01a2 Mon Sep 17 00:00:00 2001 From: Ted Crossman Date: Wed, 7 Jan 2015 07:38:29 -0800 Subject: [PATCH 0016/1399] Add support for deleting temporary temp files DockerCmd now extends java.io.Closeable. This allows us to cleanup the temporary tar file created when DockerClient.buildImageCmd(File) is invoked. Code would look like: BuildImageCmd cmd = dockerClient.buildCmd(myDir); try { // .. // cmd.exec(); // ... } finally { cmd.close(); } --- .../dockerjava/api/command/DockerCmd.java | 4 +++- .../core/command/AbstrDockerCmd.java | 7 +++++- .../core/command/BuildImageCmdImpl.java | 22 +++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) 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 4c30382b4..89c31666f 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -1,6 +1,8 @@ package com.github.dockerjava.api.command; -public interface DockerCmd { +import java.io.Closeable; + +public interface DockerCmd extends Closeable { public RES_T exec(); diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 00c89159e..54312c50c 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import java.io.IOException; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,4 +27,7 @@ public RES_T exec() throws DockerException { LOGGER.debug("Cmd: {}", this); return execution.exec((CMD_T)this); } -} \ No newline at end of file + + @Override + public void close() throws IOException {} +} 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 a62b75c06..a9c0a44b9 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -40,6 +40,7 @@ public class BuildImageCmdImpl extends AbstrDockerCmd Date: Wed, 7 Jan 2015 22:01:15 +0100 Subject: [PATCH 0017/1399] call close() after command execution --- .../com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 34414d73e..727055f96 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -45,13 +45,21 @@ public RES_T exec(CMD_T command) { RES_T result; try { result = execute(command); + } catch (ProcessingException e) { if(e.getCause() instanceof DockerException) { throw (DockerException)e.getCause(); } else { throw e; } + } finally { + try { + command.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } + return result; } From 56508c293bcbee51c601f4f7588f62d2cb7a7e08 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 7 Jan 2015 22:01:46 +0100 Subject: [PATCH 0018/1399] close InputStream --- .../com/github/dockerjava/core/command/BuildImageCmdImpl.java | 2 ++ 1 file changed, 2 insertions(+) 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 a9c0a44b9..9e8b5a146 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -142,6 +142,8 @@ public void close() throws IOException { if (tarFile != null) { FileUtils.deleteQuietly(tarFile); } + + tarInputStream.close(); } @Override From 4c12ec69ccff6bf688f1fbff16f1ff5fc9f8aa33 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 7 Jan 2015 22:06:25 +0100 Subject: [PATCH 0019/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55f09fc26..73aaeb8a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Change Log docker-java-0.10.5-SNAPSHOT --- - + * [#120](https://github.com/docker-java/docker-java/pull/120) Command resource cleanup after command execution * [#118](https://github.com/docker-java/docker-java/pull/118) Use chunked encoding when passing the docker image * [#115](https://github.com/docker-java/docker-java/pull/115) Polish RestartPolicy * [#114](https://github.com/docker-java/docker-java/pull/114) Fix CreateContainerCmdImpl.withVolumesFrom() From bb70d0955e682c6c2fcd9b96b5f32af9e0ead7da Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 7 Jan 2015 22:19:38 +0100 Subject: [PATCH 0020/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73aaeb8a3..0fe228884 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,10 @@ Change Log docker-java-0.10.5-SNAPSHOT --- + * [#120](https://github.com/docker-java/docker-java/pull/120) Command resource cleanup after command execution * [#118](https://github.com/docker-java/docker-java/pull/118) Use chunked encoding when passing the docker image + * [#116](https://github.com/docker-java/docker-java/pull/116) Allow SSL configuration from pre-existing keystore to be used * [#115](https://github.com/docker-java/docker-java/pull/115) Polish RestartPolicy * [#114](https://github.com/docker-java/docker-java/pull/114) Fix CreateContainerCmdImpl.withVolumesFrom() * [#111](https://github.com/docker-java/docker-java/pull/111) Allow to send empty messages in StartContainerCmd From 99b3367e99c50b22e709eaa83a3f30f96f2928be Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 9 Jan 2015 19:55:30 +0100 Subject: [PATCH 0021/1399] Fix issue#119 --- .../dockerjava/core/DockerClientConfig.java | 50 ++++- .../dockerjava/core/DockerClientImpl.java | 202 ++++++++++-------- .../core/command/PullImageCmdImpl.java | 15 +- 3 files changed, 160 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index db27940a4..8506d437a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,5 +1,9 @@ package com.github.dockerjava.core; +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.core.NameParser.HostnameReposName; +import com.github.dockerjava.core.NameParser.ReposTag; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; @@ -12,7 +16,10 @@ import java.util.Properties; public class DockerClientConfig implements Serializable { - private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + + private static final long serialVersionUID = -4307357472441531489L; + + private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; private static final String DOCKER_IO_VERSION_PROPERTY = "docker.io.version"; @@ -221,6 +228,47 @@ public SSLConfig getSslConfig() { public String getDockerCfgPath() { return dockerCfgPath; } + + private AuthConfig getAuthConfig() { + AuthConfig authConfig = null; + if(getUsername() != null) { + authConfig = new AuthConfig(); + authConfig.setUsername(getUsername()); + authConfig.setPassword(getPassword()); + authConfig.setEmail(getEmail()); + authConfig.setServerAddress(getServerAddress()); + } + return authConfig; + } + + public AuthConfig effectiveAuthConfig(String imageName) { + AuthConfig authConfig = null; + + String dockerCfgFile = getDockerCfgPath(); + + if (dockerCfgFile != null && imageName != null) { + AuthConfigFile authConfigFile; + try { + authConfigFile = AuthConfigFile.loadConfig(new File( + dockerCfgFile)); + } catch (IOException e) { + throw new DockerClientException( + "Failed to parse dockerCfgFile", e); + } + ReposTag reposTag = NameParser.parseRepositoryTag(imageName); + HostnameReposName hostnameReposName = NameParser + .resolveRepositoryName(reposTag.repos); + + authConfig = authConfigFile + .resolveAuthConfig(hostnameReposName.hostname); + } + + AuthConfig _authConfig = getAuthConfig(); + + if(_authConfig != null) authConfig = _authConfig; + + return authConfig; + } @Override public boolean equals(Object o) { diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 1a2a58c0b..09fafd9e2 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -18,14 +18,14 @@ /** * @author Konstantin Pelykh (kpelykh@gmail.com) - * + * * @see https://github.com/docker/docker/blob/master/api/client/commands.go */ public class DockerClientImpl implements Closeable, DockerClient { - private final DockerClientConfig dockerClientConfig; + private final DockerClientConfig dockerClientConfig; - private DockerCmdExecFactory dockerCmdExecFactory; + private DockerCmdExecFactory dockerCmdExecFactory; private DockerClientImpl() { this(DockerClientConfig.createDefaultConfigBuilder().build()); @@ -35,53 +35,57 @@ private DockerClientImpl(String serverUrl) { this(configWithServerUrl(serverUrl)); } - private DockerClientImpl(DockerClientConfig dockerClientConfig) { - Preconditions.checkNotNull(dockerClientConfig, "config was not specified"); - this.dockerClientConfig = dockerClientConfig; - } + private DockerClientImpl(DockerClientConfig dockerClientConfig) { + Preconditions.checkNotNull(dockerClientConfig, + "config was not specified"); + this.dockerClientConfig = dockerClientConfig; + } - private static DockerClientConfig configWithServerUrl(String serverUrl) { + private static DockerClientConfig configWithServerUrl(String serverUrl) { return DockerClientConfig.createDefaultConfigBuilder() - .withUri(serverUrl) - .build(); + .withUri(serverUrl).build(); } - public static DockerClientImpl getInstance() { - return new DockerClientImpl(); - } + public static DockerClientImpl getInstance() { + return new DockerClientImpl(); + } - public static DockerClientImpl getInstance(DockerClientConfig dockerClientConfig) { - return new DockerClientImpl(dockerClientConfig); - } + public static DockerClientImpl getInstance( + DockerClientConfig dockerClientConfig) { + return new DockerClientImpl(dockerClientConfig); + } - public static DockerClientImpl getInstance(String serverUrl) { - return new DockerClientImpl(serverUrl); - } + public static DockerClientImpl getInstance(String serverUrl) { + return new DockerClientImpl(serverUrl); + } - public DockerClientImpl withDockerCmdExecFactory( - DockerCmdExecFactory dockerCmdExecFactory) { - Preconditions.checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + public DockerClientImpl withDockerCmdExecFactory( + DockerCmdExecFactory dockerCmdExecFactory) { + Preconditions.checkNotNull(dockerCmdExecFactory, + "dockerCmdExecFactory was not specified"); this.dockerCmdExecFactory = dockerCmdExecFactory; this.dockerCmdExecFactory.init(dockerClientConfig); return this; } private DockerCmdExecFactory getDockerCmdExecFactory() { - Preconditions.checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + Preconditions.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()); + @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; } @@ -95,7 +99,8 @@ public AuthConfig authConfig() { */ @Override public AuthCmd authCmd() { - return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), authConfig()); + return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), + authConfig()); } @Override @@ -105,68 +110,59 @@ public InfoCmd infoCmd() { @Override public PingCmd pingCmd() { - return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec()); + return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec()); } @Override public VersionCmd versionCmd() { - return new VersionCmdImpl(getDockerCmdExecFactory().createVersionCmdExec()); + return new VersionCmdImpl(getDockerCmdExecFactory() + .createVersionCmdExec()); } /** * * IMAGE API * */ - @Override public PullImageCmd pullImageCmd(String repository) { - return new PullImageCmdImpl(getDockerCmdExecFactory().createPullImageCmdExec(), repository); + return new PullImageCmdImpl(getDockerCmdExecFactory() + .createPullImageCmdExec(), repository).withAuthConfig(dockerClientConfig.effectiveAuthConfig(repository)); } @Override public PushImageCmd pushImageCmd(String name) { - PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory().createPushImageCmdExec(), - name); - String dockerCfgFile = dockerClientConfig.getDockerCfgPath(); - if (dockerCfgFile != null) { - AuthConfigFile authConfigFile; - try { - authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); - } catch (IOException e) { - throw new DockerClientException("Failed to parse dockerCfgFile", e); - } - ReposTag reposTag = NameParser.parseRepositoryTag(name); - HostnameReposName hostnameReposName = NameParser.resolveRepositoryName(reposTag.repos); - AuthConfig authConfig = authConfigFile.resolveAuthConfig(hostnameReposName.hostname); - if (authConfig != null) { - cmd.withAuthConfig(authConfig); - } - } - return cmd; + return new PushImageCmdImpl(getDockerCmdExecFactory() + .createPushImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); } @Override - public CreateImageCmd createImageCmd(String repository, InputStream imageStream) { - return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream); + 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); + return new SearchImagesCmdImpl(getDockerCmdExecFactory() + .createSearchImagesCmdExec(), term); } @Override public RemoveImageCmd removeImageCmd(String imageId) { - return new RemoveImageCmdImpl(getDockerCmdExecFactory().createRemoveImageCmdExec(), imageId); + return new RemoveImageCmdImpl(getDockerCmdExecFactory() + .createRemoveImageCmdExec(), imageId); } @Override public ListImagesCmd listImagesCmd() { - return new ListImagesCmdImpl(getDockerCmdExecFactory().createListImagesCmdExec()); + return new ListImagesCmdImpl(getDockerCmdExecFactory() + .createListImagesCmdExec()); } @Override public InspectImageCmd inspectImageCmd(String imageId) { - return new InspectImageCmdImpl(getDockerCmdExecFactory().createInspectImageCmdExec(), imageId); + return new InspectImageCmdImpl(getDockerCmdExecFactory() + .createInspectImageCmdExec(), imageId); } /** @@ -175,112 +171,134 @@ public InspectImageCmd inspectImageCmd(String imageId) { @Override public ListContainersCmd listContainersCmd() { - return new ListContainersCmdImpl(getDockerCmdExecFactory().createListContainersCmdExec()); + return new ListContainersCmdImpl(getDockerCmdExecFactory() + .createListContainersCmdExec()); } @Override public CreateContainerCmd createContainerCmd(String image) { - return new CreateContainerCmdImpl(getDockerCmdExecFactory().createCreateContainerCmdExec(), image); + return new CreateContainerCmdImpl(getDockerCmdExecFactory() + .createCreateContainerCmdExec(), image); } @Override public StartContainerCmd startContainerCmd(String containerId) { - return new StartContainerCmdImpl(getDockerCmdExecFactory().createStartContainerCmdExec(), containerId); + return new StartContainerCmdImpl(getDockerCmdExecFactory() + .createStartContainerCmdExec(), containerId); } @Override public InspectContainerCmd inspectContainerCmd(String containerId) { - return new InspectContainerCmdImpl(getDockerCmdExecFactory().createInspectContainerCmdExec(), containerId); + return new InspectContainerCmdImpl(getDockerCmdExecFactory() + .createInspectContainerCmdExec(), containerId); } @Override public RemoveContainerCmd removeContainerCmd(String containerId) { - return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId); + return new RemoveContainerCmdImpl(getDockerCmdExecFactory() + .createRemoveContainerCmdExec(), containerId); } @Override public WaitContainerCmd waitContainerCmd(String containerId) { - return new WaitContainerCmdImpl(getDockerCmdExecFactory().createWaitContainerCmdExec(), containerId); + return new WaitContainerCmdImpl(getDockerCmdExecFactory() + .createWaitContainerCmdExec(), containerId); } @Override public AttachContainerCmd attachContainerCmd(String containerId) { - return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); + return new AttachContainerCmdImpl(getDockerCmdExecFactory() + .createAttachContainerCmdExec(), containerId); } @Override public LogContainerCmd logContainerCmd(String containerId) { - return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); + return new LogContainerCmdImpl(getDockerCmdExecFactory() + .createLogContainerCmdExec(), containerId); } @Override - public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) { - return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(), containerId, resource); + 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); + return new ContainerDiffCmdImpl(getDockerCmdExecFactory() + .createContainerDiffCmdExec(), containerId); } @Override public StopContainerCmd stopContainerCmd(String containerId) { - return new StopContainerCmdImpl(getDockerCmdExecFactory().createStopContainerCmdExec(), containerId); + return new StopContainerCmdImpl(getDockerCmdExecFactory() + .createStopContainerCmdExec(), containerId); } @Override public KillContainerCmd killContainerCmd(String containerId) { - return new KillContainerCmdImpl(getDockerCmdExecFactory().createKillContainerCmdExec(), containerId); + return new KillContainerCmdImpl(getDockerCmdExecFactory() + .createKillContainerCmdExec(), containerId); } @Override public RestartContainerCmd restartContainerCmd(String containerId) { - return new RestartContainerCmdImpl(getDockerCmdExecFactory().createRestartContainerCmdExec(), containerId); + return new RestartContainerCmdImpl(getDockerCmdExecFactory() + .createRestartContainerCmdExec(), containerId); } @Override public CommitCmd commitCmd(String containerId) { - return new CommitCmdImpl(getDockerCmdExecFactory().createCommitCmdExec(), containerId); + return new CommitCmdImpl(getDockerCmdExecFactory() + .createCommitCmdExec(), containerId); } @Override public BuildImageCmd buildImageCmd(File dockerFolder) { - return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), dockerFolder); + return new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec(), dockerFolder); } @Override public BuildImageCmd buildImageCmd(InputStream tarInputStream) { - return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), tarInputStream); + return new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec(), tarInputStream); } @Override public TopContainerCmd topContainerCmd(String containerId) { - return new TopContainerCmdImpl(getDockerCmdExecFactory().createTopContainerCmdExec(), 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); + return new TagImageCmdImpl(getDockerCmdExecFactory() + .createTagImageCmdExec(), imageId, repository, tag); } @Override public PauseContainerCmd pauseContainerCmd(String containerId) { - return new PauseContainerCmdImpl(getDockerCmdExecFactory().createPauseContainerCmdExec(), containerId); + return new PauseContainerCmdImpl(getDockerCmdExecFactory() + .createPauseContainerCmdExec(), containerId); } @Override public UnpauseContainerCmd unpauseContainerCmd(String containerId) { - return new UnpauseContainerCmdImpl(getDockerCmdExecFactory().createUnpauseContainerCmdExec(), containerId); + return new UnpauseContainerCmdImpl(getDockerCmdExecFactory() + .createUnpauseContainerCmdExec(), containerId); } - @Override - public EventsCmd eventsCmd(EventCallback eventCallback) { - return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback); - } + @Override + public EventsCmd eventsCmd(EventCallback eventCallback) { + return new EventsCmdImpl(getDockerCmdExecFactory() + .createEventsCmdExec(), eventCallback); + } - @Override - public void close() throws IOException { - getDockerCmdExecFactory().close(); - } + @Override + public void close() throws IOException { + getDockerCmdExecFactory().close(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index ed045878d..b2e62434a 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.model.AuthConfig; import com.google.common.base.Preconditions; import java.io.InputStream; @@ -11,10 +10,9 @@ * Pull image from repository. * */ -public class PullImageCmdImpl extends AbstrDockerCmd implements PullImageCmd { +public class PullImageCmdImpl extends AbstrAuthCfgDockerCmd implements PullImageCmd { private String repository, tag, registry; - private AuthConfig authConfig; public PullImageCmdImpl(PullImageCmd.Exec exec, String repository) { super(exec); @@ -36,10 +34,6 @@ public String getRegistry() { return registry; } - public AuthConfig getAuthConfig() { - return authConfig; - } - @Override public PullImageCmd withRepository(String repository) { Preconditions.checkNotNull(repository, "repository was not specified"); @@ -61,13 +55,6 @@ public PullImageCmd withRegistry(String registry) { return this; } - @Override - public PullImageCmd withAuthConfig(AuthConfig authConfig) { - Preconditions.checkNotNull(authConfig, "authConfig was not specified"); - this.authConfig = authConfig; - return this; - } - @Override public String toString() { return new StringBuilder("pull ") From b637b59d103659d4d5b09d8c57d14c6031aa4c8a Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 9 Jan 2015 20:35:33 +0100 Subject: [PATCH 0022/1399] Fix Issue#130 --- .../api/command/CreateContainerCmd.java | 7 ++++++- .../core/command/CreateContainerCmdImpl.java | 12 ++++++++++++ .../command/CreateContainerCmdImplTest.java | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 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 1cf3098e8..2eeda23e2 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -120,7 +120,12 @@ public interface CreateContainerCmd extends DockerCmd{ * prevents the container from changing the owner of any files. */ public CreateContainerCmd withCapDrop(Capability... capDrop); - + + + public String[] getEntrypoint(); + + public CreateContainerCmd withEntrypoint(String... entrypoint); + /** * @throws NotFoundException No such container * @throws ConflictException Named container already exists 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 8a4607c26..b8cde7fe0 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -39,6 +39,7 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd Date: Fri, 9 Jan 2015 22:08:28 +0000 Subject: [PATCH 0023/1399] Implementing of Exec-start and Exec-create. --- .../github/dockerjava/api/DockerClient.java | 37 ++-------- .../api/command/DockerCmdExecFactory.java | 4 ++ .../dockerjava/api/command/ExecCreateCmd.java | 19 +++++ .../api/command/ExecCreateCmdResponce.java | 15 ++++ .../dockerjava/api/command/ExecStartCmd.java | 24 +++++++ .../dockerjava/core/DockerClientImpl.java | 10 +++ .../core/command/ExecCreateCmdImpl.java | 69 +++++++++++++++++++ .../core/command/ExecStartCmdImpl.java | 49 +++++++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 15 ++-- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 30 ++++++++ .../dockerjava/jaxrs/ExecStartCmdExec.java | 31 +++++++++ .../jaxrs/StartContainerCmdExec.java | 3 +- .../core/TestDockerCmdExecFactory.java | 49 ++++--------- .../command/StartContainerCmdImplTest.java | 2 +- 14 files changed, 281 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 4052e87b9..2c829679d 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -2,38 +2,7 @@ import java.io.*; -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.EventCallback; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -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.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -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.command.*; import com.github.dockerjava.api.model.AuthConfig; // https://godoc.org/github.com/fsouza/go-dockerclient @@ -95,6 +64,8 @@ public CreateImageCmd createImageCmd(String repository, */ public StartContainerCmd startContainerCmd(String containerId); + public ExecCreateCmd execCmd(String containerId); + public InspectContainerCmd inspectContainerCmd(String containerId); public RemoveContainerCmd removeContainerCmd(String containerId); @@ -103,6 +74,8 @@ public CreateImageCmd createImageCmd(String repository, public AttachContainerCmd attachContainerCmd(String containerId); + public ExecStartCmd execStartCmd(String containerId); + public LogContainerCmd logContainerCmd(String containerId); public CopyFileFromContainerCmd copyFileFromContainerCmd( 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 24c0a4650..df26743e1 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -15,6 +15,8 @@ public interface DockerCmdExecFactory extends Closeable { public PingCmd.Exec createPingCmdExec(); + public ExecCreateCmd.Exec createExecCmdExec(); + public VersionCmd.Exec createVersionCmdExec(); public PullImageCmd.Exec createPullImageCmdExec(); @@ -45,6 +47,8 @@ public interface DockerCmdExecFactory extends Closeable { public AttachContainerCmd.Exec createAttachContainerCmdExec(); + public ExecStartCmd.Exec createExecStartCmdExec(); + public LogContainerCmd.Exec createLogContainerCmdExec(); public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java new file mode 100644 index 000000000..e6146b5fe --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.api.command; + +public interface ExecCreateCmd extends DockerCmd { + + public String getContainerId(); + + public ExecCreateCmd withCmd(String... cmd); + + public ExecCreateCmd attachStdin(boolean attachStdin); + + public ExecCreateCmd attachStdout(boolean attachStdout); + + public ExecCreateCmd attachStderr(boolean attachStderr); + + public ExecCreateCmd tty(boolean tty); + + public static interface Exec extends DockerCmdExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java new file mode 100644 index 000000000..57197ca89 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java @@ -0,0 +1,15 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ExecCreateCmdResponce { + + @JsonProperty("Id") + private String id; + + public String getId() { + return id; + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java new file mode 100644 index 000000000..262dc0f42 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.NotFoundException; + +import java.io.InputStream; + +public interface ExecStartCmd extends DockerCmd{ + + public String getContainerId(); + + public boolean isDetach(); + + public boolean isTty(); + + public ExecStartCmd withContainerId(String containerId); + + /** + * @throws com.github.dockerjava.api.NotFoundException No such container + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec {} +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 1a2a58c0b..ba5c08bcb 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -193,6 +193,11 @@ public InspectContainerCmd inspectContainerCmd(String containerId) { return new InspectContainerCmdImpl(getDockerCmdExecFactory().createInspectContainerCmdExec(), containerId); } + @Override + public ExecCreateCmd execCmd(String containerId) { + return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); + } + @Override public RemoveContainerCmd removeContainerCmd(String containerId) { return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId); @@ -208,6 +213,11 @@ public AttachContainerCmd attachContainerCmd(String containerId) { return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); } + @Override + public ExecStartCmd execStartCmd(String containerId) { + return new ExecStartCmdImpl(getDockerCmdExecFactory().createExecStartCmdExec(), containerId); + } + @Override public LogContainerCmd logContainerCmd(String containerId) { return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java new file mode 100644 index 000000000..315980a38 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -0,0 +1,69 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponce; + +public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { + + private String containerId; + + @JsonProperty("AttachStdin") + private boolean attachStdin; + + @JsonProperty("AttachStdout") + private boolean attachStdout; + + @JsonProperty("AttachStderr") + private boolean attachStderr; + + @JsonProperty("Tty") + private boolean tty; + + @JsonProperty("Cmd") + private String[] cmd; + + public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { + super(exec); + this.containerId = containerId; + } + + public ExecCreateCmd attachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + public ExecCreateCmd attachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + public ExecCreateCmd tty(boolean tty) { + this.tty = tty; + return this; + } + + public ExecCreateCmd attachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + public ExecCreateCmd withCmd(String... cmd) { + this.cmd = cmd; + return this; + } + + @Override + public String getContainerId() { + return containerId; + } + + /** + * @throws NotFoundException No such container + */ + @Override + public ExecCreateCmdResponce exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java new file mode 100644 index 000000000..edc163623 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -0,0 +1,49 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.google.common.base.Preconditions; + +import java.io.InputStream; + +public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { + + private String containerId; + + private boolean detach, tty; + + public ExecStartCmdImpl(ExecStartCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public boolean isDetach() { + return detach; + } + + @Override + public boolean isTty() { + return tty; + } + + @Override + public ExecStartCmdImpl withContainerId(String containerId) { + Preconditions.checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + /** + * @throws com.github.dockerjava.api.NotFoundException No such container + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 64222a972..525e4a586 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -3,15 +3,12 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.command.*; -import com.github.dockerjava.core.CertificateUtils; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.jaxrs.util.JsonClientFilter; import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; import com.google.common.base.Preconditions; -import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.glassfish.jersey.CommonProperties; -import org.glassfish.jersey.SslConfigurator; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; @@ -20,8 +17,6 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import java.io.IOException; -import java.security.KeyStore; -import java.security.Security; import java.util.logging.Logger; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -154,6 +149,11 @@ public InspectContainerCmd.Exec createInspectContainerCmdExec() { return new InspectContainerCmdExec(getBaseResource()); } + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { return new RemoveContainerCmdExec(getBaseResource()); @@ -169,6 +169,11 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource()); } + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return new LogContainerCmdExec(getBaseResource()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java new file mode 100644 index 000000000..a424e7ca5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponce; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(VersionCmdExec.class); + + public ExecCreateCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected ExecCreateCmdResponce execute(ExecCreateCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponce.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java new file mode 100644 index 000000000..d5f7c4781 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ExecStartCmd; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.InputStream; + +import static javax.ws.rs.client.Entity.entity; + +public class ExecStartCmdExec extends AbstrDockerCmdExec implements ExecStartCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); + + public ExecStartCmdExec(WebTarget baseResource) { + super(baseResource); + } + + + @Override + protected InputStream execute(ExecStartCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 8a2c09a44..0e7697e4e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -20,8 +20,7 @@ public StartContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(StartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/start") - .resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", command.getContainerId()); LOGGER.trace("POST: {}", webResource); webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)); diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 3a5857c9b..c63667a0d 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -6,41 +6,8 @@ import java.util.ArrayList; import java.util.List; -import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CommitCmd; -import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -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.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -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.core.DockerClientConfig; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations @@ -154,7 +121,12 @@ public PingCmd.Exec createPingCmdExec() { return delegate.createPingCmdExec(); } - @Override + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return delegate.createExecCmdExec(); + } + + @Override public VersionCmd.Exec createVersionCmdExec() { return delegate.createVersionCmdExec(); } @@ -209,7 +181,12 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return delegate.createAttachContainerCmdExec(); } - @Override + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return delegate.createExecStartCmdExec(); + } + + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } 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 de744b59a..10b656e66 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -200,7 +200,7 @@ public void startContainerWithPortBindings() throws DockerException { dockerClient.startContainerCmd(container.getId()).withPortBindings(portBindings).exec(); inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + .getId()).exec(); assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); From e8d9896a2f54fa5758fdcae7af54baf553dcef89 Mon Sep 17 00:00:00 2001 From: Andrey Klimachev Date: Sat, 10 Jan 2015 11:10:56 +0000 Subject: [PATCH 0024/1399] Adding tests for Exec-start and Exec-create. --- .../github/dockerjava/api/DockerClient.java | 2 +- .../dockerjava/api/command/ExecCreateCmd.java | 4 +- ...sponce.java => ExecCreateCmdResponse.java} | 2 +- .../dockerjava/api/command/ExecStartCmd.java | 2 - .../dockerjava/core/DockerClientImpl.java | 2 +- .../core/command/ExecCreateCmdImpl.java | 6 +- .../core/command/ExecStartCmdImpl.java | 12 +--- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 8 +-- .../core/command/ExecCreateCmdImplTest.java | 59 ++++++++++++++++++ .../core/command/ExecStartCmdImplTest.java | 62 +++++++++++++++++++ 10 files changed, 136 insertions(+), 23 deletions(-) rename src/main/java/com/github/dockerjava/api/command/{ExecCreateCmdResponce.java => ExecCreateCmdResponse.java} (89%) create mode 100644 src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 2c829679d..53b212605 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -64,7 +64,7 @@ public CreateImageCmd createImageCmd(String repository, */ public StartContainerCmd startContainerCmd(String containerId); - public ExecCreateCmd execCmd(String containerId); + public ExecCreateCmd execCreateCmd(String containerId); public InspectContainerCmd inspectContainerCmd(String containerId); 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 e6146b5fe..e71fb04e3 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.command; -public interface ExecCreateCmd extends DockerCmd { +public interface ExecCreateCmd extends DockerCmd { public String getContainerId(); @@ -14,6 +14,6 @@ public interface ExecCreateCmd extends DockerCmd { public ExecCreateCmd tty(boolean tty); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java similarity index 89% rename from src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java rename to src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java index 57197ca89..391625cfa 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponce.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties(ignoreUnknown = true) -public class ExecCreateCmdResponce { +public class ExecCreateCmdResponse { @JsonProperty("Id") private String id; 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 262dc0f42..8f6fff7bb 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -12,8 +12,6 @@ public interface ExecStartCmd extends DockerCmd{ public boolean isTty(); - public ExecStartCmd withContainerId(String containerId); - /** * @throws com.github.dockerjava.api.NotFoundException No such container */ diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index ba5c08bcb..1a06c2d55 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -194,7 +194,7 @@ public InspectContainerCmd inspectContainerCmd(String containerId) { } @Override - public ExecCreateCmd execCmd(String containerId) { + public ExecCreateCmd execCreateCmd(String containerId) { return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 315980a38..22ff63945 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -3,9 +3,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecCreateCmdResponce; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; -public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { +public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { private String containerId; @@ -63,7 +63,7 @@ public String getContainerId() { * @throws NotFoundException No such container */ @Override - public ExecCreateCmdResponce exec() throws NotFoundException { + public ExecCreateCmdResponse exec() throws NotFoundException { return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index edc163623..b3c37dc51 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -6,7 +6,7 @@ import java.io.InputStream; -public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { +public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { private String containerId; @@ -14,7 +14,8 @@ public class ExecStartCmdImpl extends AbstrDockerCmd public ExecStartCmdImpl(ExecStartCmd.Exec exec, String containerId) { super(exec); - withContainerId(containerId); + Preconditions.checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; } @Override @@ -32,13 +33,6 @@ public boolean isTty() { return tty; } - @Override - public ExecStartCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - /** * @throws com.github.dockerjava.api.NotFoundException No such container */ diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index a424e7ca5..69346efd5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -1,7 +1,7 @@ package com.github.dockerjava.jaxrs; import com.github.dockerjava.api.command.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecCreateCmdResponce; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,7 +10,7 @@ import static javax.ws.rs.client.Entity.entity; -public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { +public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { private static final Logger LOGGER = LoggerFactory .getLogger(VersionCmdExec.class); @@ -20,11 +20,11 @@ public ExecCreateCmdExec(WebTarget baseResource) { } @Override - protected ExecCreateCmdResponce execute(ExecCreateCmd command) { + protected ExecCreateCmdResponse execute(ExecCreateCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", command.getContainerId()); LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponce.class); + return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); } } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java new file mode 100644 index 000000000..75751710d --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +@Test(groups = "integration") +public class ExecCreateCmdImplTest 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 execCreateTest() { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("env") + .withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.waitContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch file.log").exec(); + + assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java new file mode 100644 index 000000000..4b9ab8812 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +public class ExecStartCmdImplTest 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 execStartTest() throws Exception { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("env") + .withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.waitContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); + + dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "file.log").exec(); + assertTrue(response.available() > 0, "The file was not copied from the container."); + } +} From 5a6c46d297bc5a0c04b70893a44dd64904548fdb Mon Sep 17 00:00:00 2001 From: Andrey Klimachev Date: Sat, 10 Jan 2015 11:56:11 +0000 Subject: [PATCH 0025/1399] Fixing tests for Exec-start and Exec-create. --- .../dockerjava/core/command/ExecCreateCmdImplTest.java | 6 ++---- .../dockerjava/core/command/ExecStartCmdImplTest.java | 10 ++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java index 75751710d..338763e6c 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -41,7 +41,7 @@ public void execCreateTest() { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("env") + .createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); @@ -50,9 +50,7 @@ public void execCreateTest() { dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); - - ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch file.log").exec(); + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); } 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 4b9ab8812..044d13458 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -15,6 +15,7 @@ import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +@Test(groups = "integration") public class ExecStartCmdImplTest extends AbstractDockerClientTest { @BeforeTest public void beforeTest() throws DockerException { @@ -41,7 +42,7 @@ public void execStartTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("env") + .createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); @@ -50,13 +51,10 @@ public void execStartTest() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); - - ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); - + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).attachStdout(true).withCmd("touch","file.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "file.log").exec(); + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/file.log").exec(); assertTrue(response.available() > 0, "The file was not copied from the container."); } } From c6507bd47bdbe8ec37fd3821f0f20a43e78f672e Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Mon, 12 Jan 2015 00:28:17 +0100 Subject: [PATCH 0026/1399] support DOCKER_TLS_VERIFY to detect ssl --- README.md | 6 ++-- .../dockerjava/core/DockerClientConfig.java | 3 +- .../core/DockerClientConfigTest.java | 34 ++++++++++++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7380f1db3..ec3a92a45 100644 --- a/README.md +++ b/README.md @@ -122,10 +122,10 @@ In your application, e.g. ##### System Environment export DOCKER_URL=http://localhost:2376 - -Note: we also auto-detect defaults. If you use `DOCKER_HOST` we use that value, and if `DOCKER_CERT_PATH` is set, we switch to SSL. -##### File System +Note: we also auto-detect defaults. If you use `DOCKER_HOST` we use that value, and if `DOCKER_CERT_PATH` or `DOCKER_TLS_VERIFY=1` is set, we switch to SSL. + +##### File System In `$HOME/.docker.io.properties` diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 8506d437a..c90c62cb1 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -21,6 +21,7 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; + private static final String DOCKER_VERIFY_TLS_PROPERTY = "DOCKER_TLS_VERIFY"; private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; private static final String DOCKER_IO_VERSION_PROPERTY = "docker.io.version"; private static final String DOCKER_IO_USERNAME_PROPERTY = "docker.io.username"; @@ -142,7 +143,7 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, private static String protocol(Map env) { // if this is set, we assume we need SSL - return env.containsKey(DOCKER_CERT_PATH_PROPERTY) ? "https" : "http"; + return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" : "http"; } /** diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 7b5e4e1f2..e452e300d 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -45,7 +45,7 @@ public void environmentDockerHost() throws Exception { } @Test - public void environmentDockerHostHttpsAutoDetect() throws Exception { + public void environmentDockerHostHttpsAutoDetectByCertPath() throws Exception { // given docker host in env Map env = new HashMap(System.getenv()); @@ -60,6 +60,38 @@ public void environmentDockerHostHttpsAutoDetect() throws Exception { assertEquals(config.getUri(), URI.create("https://bar:8768")); } + @Test + public void environmentDockerHostHttpsAutoDetectByTlsVerify() throws Exception { + + // given docker host in env + Map env = new HashMap(System.getenv()); + env.put("DOCKER_HOST", "tcp://bar:8768"); + // and it looks to be SSL enabled + env.put("DOCKER_TLS_VERIFY", "1"); + + // when you build a config + DockerClientConfig config = buildConfig(env, new Properties()); + + // then the URL is that value with "tcp" changed to "https" + assertEquals(config.getUri(), URI.create("https://bar:8768")); + } + + @Test + public void environmentDockerHostWithInvalidTlsVerify() throws Exception { + + // given docker host in env + Map env = new HashMap(System.getenv()); + env.put("DOCKER_HOST", "tcp://bar:8768"); + // and it looks to be SSL enabled + env.put("DOCKER_TLS_VERIFY", "any value different from '1'"); + + // when you build a config + DockerClientConfig config = buildConfig(env, new Properties()); + + // then the URL is that value with "tcp" changed to "https" + assertEquals(config.getUri(), URI.create("http://bar:8768")); + } + @Test public void environment() throws Exception { From 26cd47c01ef57a4ee903c07cc13890c4b640bf5e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 12 Jan 2015 21:09:53 +0100 Subject: [PATCH 0027/1399] Polish exec create and start commands --- .../api/command/AttachContainerCmd.java | 2 + .../dockerjava/api/command/ExecCreateCmd.java | 32 +++++++--- .../dockerjava/api/command/ExecStartCmd.java | 33 +++++++---- .../core/command/AttachContainerCmdImpl.java | 5 ++ .../core/command/ExecCreateCmdImpl.java | 59 ++++++++++++++++--- .../core/command/ExecStartCmdImpl.java | 44 +++++++++++--- .../dockerjava/jaxrs/ExecStartCmdExec.java | 2 +- .../core/command/ExecStartCmdImplTest.java | 2 +- 8 files changed, 146 insertions(+), 33 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 8abbef72b..aeee749e3 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -51,6 +51,8 @@ public interface AttachContainerCmd extends DockerCmd{ public AttachContainerCmd withStdErr(boolean stderr); public AttachContainerCmd withLogs(boolean logs); + + public AttachContainerCmd withLogs(); /** * @throws NotFoundException No such container 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 e71fb04e3..c1f32e293 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -3,16 +3,34 @@ public interface ExecCreateCmd extends DockerCmd { public String getContainerId(); + + public ExecCreateCmd withContainerId(String containerId); public ExecCreateCmd withCmd(String... cmd); - public ExecCreateCmd attachStdin(boolean attachStdin); - - public ExecCreateCmd attachStdout(boolean attachStdout); - - public ExecCreateCmd attachStderr(boolean attachStderr); - - public ExecCreateCmd tty(boolean tty); + 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 8f6fff7bb..bcc7a072e 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -4,19 +4,32 @@ import java.io.InputStream; -public interface ExecStartCmd extends DockerCmd{ +public interface ExecStartCmd extends DockerCmd { - public String getContainerId(); + public String getExecId(); - public boolean isDetach(); + public ExecStartCmd withExecId(String execId); - public boolean isTty(); + public boolean hasDetachEnabled(); - /** - * @throws com.github.dockerjava.api.NotFoundException No such container - */ - @Override - public InputStream exec() throws NotFoundException; + public ExecStartCmd withDetach(boolean detach); + + public ExecStartCmd withDetach(); - public static interface Exec extends DockerCmdExec {} + public boolean hasTtyEnabled(); + + public ExecStartCmd withTty(boolean tty); + + public ExecStartCmd withTty(); + + /** + * @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/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index d52ceabe5..930fbdfdd 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -116,6 +116,11 @@ public AttachContainerCmd withLogs(boolean logs) { return this; } + @Override + public AttachContainerCmd withLogs() { + return withLogs(true); + } + /** * @throws NotFoundException No such container */ diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 22ff63945..5b76941ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.google.common.base.Preconditions; public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { @@ -26,28 +27,50 @@ public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecStartCmd { - private String containerId; + private String execId; private boolean detach, tty; public ExecStartCmdImpl(ExecStartCmd.Exec exec, String containerId) { super(exec); Preconditions.checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.execId = containerId; } @Override - public String getContainerId() { - return containerId; + public String getExecId() { + return execId; } + + @Override + public ExecStartCmd withExecId(String execId) { + Preconditions.checkNotNull(execId, "execId was not specified"); + this.execId = execId; + return this; + } @Override - public boolean isDetach() { + public boolean hasDetachEnabled() { return detach; } @Override - public boolean isTty() { + public boolean hasTtyEnabled() { return tty; } + @Override + public ExecStartCmd withDetach(boolean detach) { + this.detach = detach; + return this; + } + + @Override + public ExecStartCmd withTty(boolean tty) { + this.tty = tty; + return null; + } + + @Override + public ExecStartCmd withDetach() { + return withDetach(true); + } + + @Override + public ExecStartCmd withTty() { + return withTty(true); + } + /** - * @throws com.github.dockerjava.api.NotFoundException No such container + * @throws com.github.dockerjava.api.NotFoundException No such exec instance */ @Override public InputStream exec() throws NotFoundException { return super.exec(); } + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index d5f7c4781..ae4c71816 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -22,7 +22,7 @@ public ExecStartCmdExec(WebTarget baseResource) { @Override protected InputStream execute(ExecStartCmd command) { - WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); LOGGER.trace("POST: {}", webResource); 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 044d13458..a8c3fe8a1 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -51,7 +51,7 @@ public void execStartTest() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).attachStdout(true).withCmd("touch","file.log").exec(); + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true).withCmd("touch","file.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/file.log").exec(); From 2561436cc70439ef992a1ab25bd4cccafb93626b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 12 Jan 2015 22:36:55 +0100 Subject: [PATCH 0028/1399] Fix issue##122 --- .../java/com/github/dockerjava/api/model/ExposedPorts.java | 4 ++++ src/main/java/com/github/dockerjava/api/model/Volumes.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java index 924d1300e..983ad3c36 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java @@ -29,6 +29,10 @@ public class ExposedPorts { public ExposedPorts(ExposedPort... exposedPorts) { this.exposedPorts = exposedPorts; } + + public ExposedPorts(List exposedPorts) { + this.exposedPorts = exposedPorts.toArray(new ExposedPort[exposedPorts.size()]); + } public ExposedPort[] getExposedPorts() { return exposedPorts; 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 d06c0c0fe..b8a9315bc 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -29,6 +29,10 @@ public class Volumes { public Volumes(Volume... volumes) { this.volumes = volumes; } + + public Volumes(List volumes) { + this.volumes = volumes.toArray(new Volume[volumes.size()]); + } public Volume[] getVolumes() { return volumes; From c0c44ee313ec827fbf33dd53d25a66a0629c3935 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 14 Jan 2015 20:39:41 +0100 Subject: [PATCH 0029/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fe228884..102e4a7fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Change Log docker-java-0.10.5-SNAPSHOT --- + * [#121](https://github.com/docker-java/docker-java/pull/121) Implemented support for commands: Exec-start, Exec-create * [#120](https://github.com/docker-java/docker-java/pull/120) Command resource cleanup after command execution * [#118](https://github.com/docker-java/docker-java/pull/118) Use chunked encoding when passing the docker image * [#116](https://github.com/docker-java/docker-java/pull/116) Allow SSL configuration from pre-existing keystore to be used From 327e5d19188f978b78ece3ab313b9a25c338ea21 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 14 Jan 2015 20:53:50 +0100 Subject: [PATCH 0030/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 102e4a7fe..f225212d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Change Log docker-java-0.10.5-SNAPSHOT --- - + * [#123](https://github.com/docker-java/docker-java/pull/123) support DOCKER_TLS_VERIFY to detect ssl * [#121](https://github.com/docker-java/docker-java/pull/121) Implemented support for commands: Exec-start, Exec-create * [#120](https://github.com/docker-java/docker-java/pull/120) Command resource cleanup after command execution * [#118](https://github.com/docker-java/docker-java/pull/118) Use chunked encoding when passing the docker image From 421a8731a43ababce1fe6ff5f42d8d16cbd25687 Mon Sep 17 00:00:00 2001 From: Andrey Klimachev Date: Thu, 15 Jan 2015 10:35:21 +0000 Subject: [PATCH 0031/1399] Fixed NPE on ExecStartCmdImpl. --- .../com/github/dockerjava/core/command/ExecStartCmdImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 6090172ff..0340a7ac2 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -49,7 +49,7 @@ public ExecStartCmd withDetach(boolean detach) { @Override public ExecStartCmd withTty(boolean tty) { this.tty = tty; - return null; + return this; } @Override From 04eaf1f518680b16b16cb33e80d24664f6846330 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Fri, 16 Jan 2015 21:45:40 +0100 Subject: [PATCH 0032/1399] apply a rebased and squashed unixsocket-branch with a working ssl config. other changes: - make all unit tests succeed on Windows - only create a container when needed - read the complete response when copying a file from a container --- pom.xml | 19 + .../dockerjava/api/command/EventCallback.java | 1 + .../dockerjava/api/model/AuthConfig.java | 2 +- .../dockerjava/core/DockerClientConfig.java | 47 ++- .../dockerjava/core/DockerClientImpl.java | 5 +- .../core/LocalDirectorySSLConfig.java | 14 +- .../com/github/dockerjava/core/SSLConfig.java | 5 +- .../dockerjava/jaxrs/ApacheUnixSocket.java | 327 ++++++++++++++++++ .../jaxrs/ContainerDiffCmdExec.java | 3 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 41 ++- .../dockerjava/jaxrs/EventsCmdExec.java | 2 +- .../jaxrs/RemoveContainerCmdExec.java | 4 +- .../dockerjava/jaxrs/RemoveImageCmdExec.java | 2 +- .../jaxrs/UnixConnectionSocketFactory.java | 85 +++++ .../util/ResponseStatusExceptionFilter.java | 5 +- .../client/AbstractDockerClientTest.java | 6 +- .../core/DockerClientConfigTest.java | 4 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- .../dockerjava/core/GoLangFileMatchTest.java | 3 +- .../CopyFileFromContainerCmdImplTest.java | 22 +- .../core/command/EventsCmdImplTest.java | 17 +- .../core/command/ExecStartCmdImplTest.java | 19 +- .../core/command/InfoCmdImplTest.java | 6 +- .../core/command/PullImageCmdImplTest.java | 4 +- .../core/command/PushImageCmdImplTest.java | 1 - 25 files changed, 581 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java diff --git a/pom.xml b/pom.xml index 0b85dc426..1e6a477e9 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,13 @@ + + + jcenter + http://jcenter.bintray.com + + + UTF-8 UTF-8 @@ -64,6 +71,7 @@ 0.3 18.0 1.51 + 2014-11-16T14-41-27 1.0.1 @@ -93,12 +101,23 @@ + + org.glassfish.jersey.connectors + jersey-apache-connector + ${jersey.version} + org.glassfish.jersey.core jersey-client ${jersey.version} + + de.gesellix + unix-socket-factory + ${unix-socket-factory.version} + + org.apache.commons commons-compress 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 45ac34dc8..18b8669ea 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventCallback.java +++ b/src/main/java/com/github/dockerjava/api/command/EventCallback.java @@ -9,4 +9,5 @@ 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/model/AuthConfig.java b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java index 87307bb5d..42c49bce0 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -8,7 +8,7 @@ public class AuthConfig { /** * For backwards compatibility. Make sure you update the properties if you change this. * - * @see /docker.io.properties + * @see "/docker.io.properties" */ public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/"; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index c90c62cb1..21e5778fd 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -33,6 +33,9 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; + // connection pooling properties + private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; + private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; /** * A map from the environment name to the interval name. */ @@ -49,13 +52,18 @@ public class DockerClientConfig implements Serializable { .put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY) .build(); private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; - private final URI uri; + private URI uri; private final String version, username, password, email, serverAddress, dockerCfgPath; private final Integer readTimeout; private final boolean loggingFilterEnabled; private final SSLConfig sslConfig; + + private final int maxTotalConnections; + private final int maxPerRouteConnections; - DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, SSLConfig sslConfig) { + DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, + String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, SSLConfig sslConfig, + int maxTotalConns, int maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -66,6 +74,8 @@ public class DockerClientConfig implements Serializable { this.readTimeout = readTimeout; this.loggingFilterEnabled = loggingFilterEnabled; this.sslConfig = sslConfig; + this.maxTotalConnections = maxTotalConns; + this.maxPerRouteConnections = maxPerRouteConns; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -194,6 +204,10 @@ public URI getUri() { return uri; } + public void setUri(URI uri) { + this.uri = uri; + } + public String getVersion() { return version; } @@ -329,7 +343,7 @@ public String toString() { public static class DockerClientConfigBuilder { private URI uri; private String version, username, password, email, serverAddress, dockerCfgPath; - private Integer readTimeout; + private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; private boolean loggingFilterEnabled; private SSLConfig sslConfig; @@ -349,7 +363,10 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) - .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)); + .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) + .withMaxPerRouteConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY, "2"))) + .withMaxTotalConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY, "20"))) + ; } public final DockerClientConfigBuilder withUri(String uri) { @@ -387,6 +404,16 @@ public final DockerClientConfigBuilder withReadTimeout(Integer readTimeout) { this.readTimeout = readTimeout; return this; } + + public final DockerClientConfigBuilder withMaxTotalConnections(Integer maxTotalConnections) { + this.maxTotalConnections = maxTotalConnections; + return this; + } + + public final DockerClientConfigBuilder withMaxPerRouteConnections(Integer maxPerRouteConnections) { + this.maxPerRouteConnections = maxPerRouteConnections; + return this; + } public final DockerClientConfigBuilder withLoggingFilter(boolean loggingFilterEnabled) { this.loggingFilterEnabled = loggingFilterEnabled; @@ -420,8 +447,18 @@ public DockerClientConfig build() { dockerCfgPath, readTimeout, loggingFilterEnabled, - sslConfig + sslConfig, + maxTotalConnections, + maxPerRouteConnections ); } } + + public int getMaxTotalConnections() { + return maxTotalConnections; + } + + public int getMaxPerRoutConnections() { + return maxPerRouteConnections; + } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index cee364e00..6b829abda 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -8,18 +8,15 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.core.NameParser.HostnameReposName; -import com.github.dockerjava.core.NameParser.ReposTag; import com.github.dockerjava.core.command.*; import com.google.common.base.Preconditions; /** * @author Konstantin Pelykh (kpelykh@gmail.com) * - * @see https://github.com/docker/docker/blob/master/api/client/commands.go + * @see "https://github.com/docker/docker/blob/master/api/client/commands.go" */ public class DockerClientImpl implements Closeable, DockerClient { diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index ef57a0de3..6415d0c18 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,19 +1,16 @@ package com.github.dockerjava.core; +import com.github.dockerjava.api.DockerClientException; import com.google.common.base.Objects; import com.google.common.base.Preconditions; - -import com.github.dockerjava.api.DockerClientException; - import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.glassfish.jersey.SslConfigurator; +import javax.net.ssl.SSLContext; import java.io.Serializable; import java.security.KeyStore; import java.security.Security; -import javax.net.ssl.SSLContext; - /** * SSL Config from local files. */ @@ -41,9 +38,6 @@ public SSLContext getSSLContext() { Security.addProvider(new BouncyCastleProvider()); - KeyStore keyStore = CertificateUtils.createKeyStore(dockerCertPath); - KeyStore trustStore = CertificateUtils.createTrustStore(dockerCertPath); - // properties acrobatics not needed for java > 1.6 String httpProtocols = System.getProperty("https.protocols"); System.setProperty("https.protocols", "TLSv1"); @@ -52,9 +46,9 @@ public SSLContext getSSLContext() { System.setProperty("https.protocols", httpProtocols); } - sslConfig.keyStore(keyStore); + sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath)); sslConfig.keyStorePassword("docker"); - sslConfig.trustStore(trustStore); + sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath)); return sslConfig.createSSLContext(); diff --git a/src/main/java/com/github/dockerjava/core/SSLConfig.java b/src/main/java/com/github/dockerjava/core/SSLConfig.java index 21024c4f6..ab6394890 100644 --- a/src/main/java/com/github/dockerjava/core/SSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/SSLConfig.java @@ -1,9 +1,6 @@ package com.github.dockerjava.core; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; +import java.security.*; import javax.net.ssl.SSLContext; diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java new file mode 100644 index 000000000..a4adb1bb7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -0,0 +1,327 @@ +package com.github.dockerjava.jaxrs; +/* + * Copyright (c) 2014 Spotify AB. + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + + + +import com.google.common.collect.Queues; + +import org.newsclub.net.unix.AFUNIXSocket; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.nio.channels.SocketChannel; +import java.util.Queue; + +/** + * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options + * until the socket is connected. This is necessary because the Apache HTTP client attempts to + * set options prior to connecting the socket, which doesn't work for Unix sockets since options + * are being set on the underlying file descriptor. Until the socket is connected, the file + * descriptor doesn't exist. + * + * This class also noop's any calls to setReuseAddress, which is called by the Apache client but + * isn't supported by AFUnixSocket. + */ +public class ApacheUnixSocket extends Socket { + + private final AFUNIXSocket inner; + + private final Queue optionsToSet = Queues.newArrayDeque(); + + public ApacheUnixSocket() throws IOException { + this.inner = AFUNIXSocket.newInstance(); + } + + @Override + public void connect(final SocketAddress endpoint) throws IOException { + inner.connect(endpoint); + setAllSocketOptions(); + } + + @Override + public void connect(final SocketAddress endpoint, final int timeout) throws IOException { + inner.connect(endpoint, timeout); + setAllSocketOptions(); + } + + @Override + public void bind(final SocketAddress bindpoint) throws IOException { + inner.bind(bindpoint); + setAllSocketOptions(); + } + + @Override + public InetAddress getInetAddress() { + return inner.getInetAddress(); + } + + @Override + public InetAddress getLocalAddress() { + return inner.getLocalAddress(); + } + + @Override + public int getPort() { + return inner.getPort(); + } + + @Override + public int getLocalPort() { + return inner.getLocalPort(); + } + + @Override + public SocketAddress getRemoteSocketAddress() { + return inner.getRemoteSocketAddress(); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return inner.getLocalSocketAddress(); + } + + @Override + public SocketChannel getChannel() { + return inner.getChannel(); + } + + @Override + public InputStream getInputStream() throws IOException { + return inner.getInputStream(); + } + + @Override + public OutputStream getOutputStream() throws IOException { + return inner.getOutputStream(); + } + + private void setSocketOption(final SocketOptionSetter s) throws SocketException { + if (inner.isConnected()) { + s.run(); + } else { + if (!optionsToSet.offer(s)) { + throw new SocketException("Failed to queue option"); + } + } + } + + private void setAllSocketOptions() throws SocketException { + for (SocketOptionSetter s : optionsToSet) { + s.run(); + } + } + + @Override + public void setTcpNoDelay(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTcpNoDelay(on); + } + }); + } + + @Override + public boolean getTcpNoDelay() throws SocketException { + return inner.getTcpNoDelay(); + } + + @Override + public void setSoLinger(final boolean on, final int linger) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoLinger(on, linger); + } + }); + } + + @Override + public int getSoLinger() throws SocketException { + return inner.getSoLinger(); + } + + @Override + public void sendUrgentData(final int data) throws IOException { + inner.sendUrgentData(data); + } + + @Override + public void setOOBInline(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setOOBInline(on); + } + }); + } + + @Override + public boolean getOOBInline() throws SocketException { + return inner.getOOBInline(); + } + + @Override + public synchronized void setSoTimeout(final int timeout) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoTimeout(timeout); + } + }); + } + + @Override + public synchronized int getSoTimeout() throws SocketException { + return inner.getSoTimeout(); + } + + @Override + public synchronized void setSendBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSendBufferSize(size); + } + }); + } + + @Override + public synchronized int getSendBufferSize() throws SocketException { + return inner.getSendBufferSize(); + } + + @Override + public synchronized void setReceiveBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setReceiveBufferSize(size); + } + }); + } + + @Override + public synchronized int getReceiveBufferSize() throws SocketException { + return inner.getReceiveBufferSize(); + } + + @Override + public void setKeepAlive(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setKeepAlive(on); + } + }); + } + + @Override + public boolean getKeepAlive() throws SocketException { + return inner.getKeepAlive(); + } + + @Override + public void setTrafficClass(final int tc) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTrafficClass(tc); + } + }); + } + + @Override + public int getTrafficClass() throws SocketException { + return inner.getTrafficClass(); + } + + @Override + public void setReuseAddress(final boolean on) throws SocketException { + // not supported: Apache client tries to set it, but we want to just ignore it + } + + @Override + public boolean getReuseAddress() throws SocketException { + return inner.getReuseAddress(); + } + + @Override + public synchronized void close() throws IOException { + inner.close(); + } + + @Override + public void shutdownInput() throws IOException { + inner.shutdownInput(); + } + + @Override + public void shutdownOutput() throws IOException { + inner.shutdownOutput(); + } + + @Override + public String toString() { + return inner.toString(); + } + + @Override + public boolean isConnected() { + return inner.isConnected(); + } + + @Override + public boolean isBound() { + return inner.isBound(); + } + + @Override + public boolean isClosed() { + return inner.isClosed(); + } + + @Override + public boolean isInputShutdown() { + return inner.isInputShutdown(); + } + + @Override + public boolean isOutputShutdown() { + return inner.isOutputShutdown(); + } + + @Override + public void setPerformancePreferences(final int connectionTime, final int latency, + final int bandwidth) { + inner.setPerformancePreferences(connectionTime, latency, bandwidth); + } + + interface SocketOptionSetter { + void run() throws SocketException; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java index 0a657ed90..2b7059b33 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java @@ -26,7 +26,8 @@ protected List execute(ContainerDiffCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", command.getContainerId()); LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { + return webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { }); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 525e4a586..c91b0d565 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -8,7 +8,14 @@ import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; import com.google.common.base.Preconditions; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +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.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; @@ -17,6 +24,7 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import java.io.IOException; +import java.net.URI; import java.util.logging.Logger; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -30,6 +38,7 @@ public void init(DockerClientConfig dockerClientConfig) { Preconditions.checkNotNull(dockerClientConfig, "config was not specified"); ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new ApacheConnectorProvider()); clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); clientConfig.register(ResponseStatusExceptionFilter.class); @@ -45,20 +54,31 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); } - ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); + URI originalUri = dockerClientConfig.getUri(); + SSLContext sslContext; try { - SSLContext ssl = dockerClientConfig.getSslConfig().getSSLContext(); - - if (ssl != null) - clientBuilder.sslContext(ssl); + sslContext = dockerClientConfig.getSslConfig().getSSLContext(); } catch(Exception ex) { throw new DockerClientException("Error in SSL Configuration", ex); } + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(originalUri, sslContext)); + connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); + connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); + clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); + + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); + + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } client = clientBuilder.build(); + if (originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); + } WebTarget webResource = client.target(dockerClientConfig.getUri()); if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { @@ -66,9 +86,18 @@ public void init(DockerClientConfig dockerClientConfig) { } else { baseResource = webResource.path("v" + dockerClientConfig.getVersion()); } - } + private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, SSLContext sslContext) { + RegistryBuilder registryBuilder = RegistryBuilder.create(); + registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory()); + if (sslContext != null) { + registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); + } + registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri)); + return registryBuilder.build(); + } + protected WebTarget getBaseResource() { Preconditions.checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); return baseResource; diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 545d7db98..ffd757e93 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -67,7 +67,7 @@ public Void call() throws Exception { response = webTarget.request().get(Response.class); InputStream inputStream = response.readEntity(InputStream.class); JsonParser jp = JSON_FACTORY.createParser(inputStream); - while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) { + while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) { eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); numEvents++; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index 7f45bdda2..7a479ce2f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -23,8 +23,8 @@ protected Void execute(RemoveContainerCmd command) { .queryParam("force", command.hasForceEnabled() ? "1" : "0"); LOGGER.trace("DELETE: {}", webResource); - String response = webResource.request().accept(MediaType.APPLICATION_JSON).delete(String.class); - LOGGER.trace("Response: {}", response); + /*String response = */webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); +// LOGGER.trace("Response: {}", response); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 54fb327b4..6bfeecd71 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -23,7 +23,7 @@ protected Void execute(RemoveImageCmd command) { .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); LOGGER.trace("DELETE: {}", webResource); - webResource.request().delete(Response.class); + webResource.request().delete().close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java new file mode 100644 index 000000000..4b6cfbba3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java @@ -0,0 +1,85 @@ +package com.github.dockerjava.jaxrs; +/* + * Copyright (c) 2014 Spotify AB. + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + + + +import org.apache.http.HttpHost; +import org.apache.http.annotation.Immutable; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.protocol.HttpContext; +import org.newsclub.net.unix.AFUNIXSocketAddress; + +import java.io.File; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URI; + +/** + * Provides a ConnectionSocketFactory for connecting Apache HTTP clients to Unix sockets. + */ +@Immutable +public class UnixConnectionSocketFactory implements ConnectionSocketFactory { + + private File socketFile; + + public UnixConnectionSocketFactory(final URI socketUri) { + super(); + + final String filename = socketUri.toString() + .replaceAll("^unix:///", "unix://localhost/") + .replaceAll("^unix://localhost", ""); + + this.socketFile = new File(filename); + } + + public static URI sanitizeUri(final URI uri) { + if (uri.getScheme().equals("unix")) { + return URI.create("unix://localhost:80"); + } else { + return uri; + } + } + + @Override + public Socket createSocket(final HttpContext context) throws IOException { + return new ApacheUnixSocket(); + } + + @Override + public Socket connectSocket(final int connectTimeout, + final Socket socket, + final HttpHost host, + final InetSocketAddress remoteAddress, + final InetSocketAddress localAddress, + final HttpContext context) throws IOException { + try { + socket.connect(new AFUNIXSocketAddress(socketFile), connectTimeout); + } catch (SocketTimeoutException e) { + throw new ConnectTimeoutException(e, null, remoteAddress.getAddress()); + } + + return socket; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java index 61d97f93b..42158e01f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java @@ -2,6 +2,7 @@ import java.io.EOFException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.Charset; import javax.ws.rs.client.ClientRequestContext; @@ -63,7 +64,9 @@ public String getBodyAsMessage(ClientResponseContext responseContext) if (contentLength != -1) { byte[] buffer = new byte[contentLength]; try { - IOUtils.readFully(responseContext.getEntityStream(), buffer); + InputStream entityStream = responseContext.getEntityStream(); + IOUtils.readFully(entityStream, buffer); + entityStream.close(); } catch (EOFException e) { 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 3ed64d9a7..71bfb9304 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -33,7 +33,6 @@ public abstract class AbstractDockerClientTest extends Assert { public static final Logger LOG = LoggerFactory .getLogger(AbstractDockerClientTest.class); - public static final String DOCKER_JAVA = "dockerjava"; protected DockerClient dockerClient; @@ -120,7 +119,8 @@ protected String asString(InputStream response) { logwriter.write(line + (itr.hasNext() ? "\n" : "")); //LOG.info("line: "+line); } - + response.close(); + return logwriter.toString(); } catch (IOException e) { throw new RuntimeException(e); @@ -150,7 +150,7 @@ public static boolean available(int port) { ds = new DatagramSocket(port); ds.setReuseAddress(true); return true; - } catch (IOException e) { + } catch (IOException ignored) { } finally { if (ds != null) { ds.close(); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index e452e300d..3a61d034d 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,7 +16,7 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, new LocalDirectorySSLConfig("flim")); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, new LocalDirectorySSLConfig("flim"), 20, 2); } @Test @@ -36,6 +36,8 @@ public void environmentDockerHost() throws Exception { // given docker host in env Map env = new HashMap(); env.put("DOCKER_HOST", "tcp://baz:8768"); + // and it looks to be SSL disabled + env.remove("DOCKER_CERT_PATH"); // when you build a config DockerClientConfig config = buildConfig(env, new Properties()); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index a91fa109e..1f5604fe8 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, null); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, null, 20, 2); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index b556a7e5e..215926a56 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -3,7 +3,6 @@ */ package com.github.dockerjava.core; -import java.io.File; import java.io.IOException; import junit.framework.Assert; @@ -19,7 +18,7 @@ public void testMatch(MatchTestCase testCase) throws IOException { String pattern = testCase.pattern; String s = testCase.s; if (GoLangFileMatch.IS_WINDOWS) { - if (pattern.indexOf('\\') > 0) { + if (pattern.indexOf('\\') >= 0) { // no escape allowed on windows. return; } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java index 945b61983..193b787ce 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -41,7 +41,7 @@ public void copyFromContainer() throws Exception { // TODO extract this into a shared method CreateContainerResponse container = dockerClient.createContainerCmd("busybox") .withName("docker-java-itest-copyFromContainer") - .withCmd("touch", "/test") + .withCmd("touch", "/copyFromContainer") .exec(); LOG.info("Created container: {}", container); @@ -49,16 +49,22 @@ public void copyFromContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/test").exec(); - assertTrue(response.available() > 0, "The file was not copied from the container."); + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/copyFromContainer").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); } @Test public void copyFromNonExistingContainer() throws Exception { - try { - dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } + try { + dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } } } 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 6935227bc..329f60b7b 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -19,6 +19,7 @@ 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 EventsCmdImplTest extends AbstractDockerClientTest { @@ -67,8 +68,7 @@ public void testEventStreamTimeBound() throws InterruptedException, IOException boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); executorService.shutdown(); - - + assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); } @@ -78,7 +78,7 @@ public void testEventStreaming() throws InterruptedException, IOException { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallback eventCallback = new EventCallbackTest(countDownLatch); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(getEpochTime()); ExecutorService executorService = eventsCmd.exec(); @@ -87,6 +87,7 @@ public void testEventStreaming() throws InterruptedException, IOException { boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); executorService.shutdown(); + eventCallback.close(); assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); } @@ -105,11 +106,16 @@ private int generateEvents() { private class EventCallbackTest implements EventCallback { private final CountDownLatch countDownLatch; + private final AtomicBoolean isReceiving = new AtomicBoolean(true); public EventCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } + public void close() { + isReceiving.set(false); + } + @Override public void onEvent(Event event) { LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); @@ -125,5 +131,10 @@ public void onException(Throwable throwable) { public void onCompletion(int numEvents) { LOG.info("Number of events received: {}", numEvents); } + + @Override + public boolean isReceiving() { + return isReceiving.get(); + } } } 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 a8c3fe8a1..497c44c1e 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -42,19 +42,26 @@ public void execStartTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("top") + .createContainerCmd("busybox") + .withCmd("top") .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","file.log").exec(); + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true) + .withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/file.log").exec(); - assertTrue(response.available() > 0, "The file was not copied from the container."); + 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/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index 37214418c..a0a272f2c 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -45,6 +45,7 @@ public void afterMethod(ITestResult result) { public void info() throws DockerException { // Make sure that there is at least one container for the assertion // TODO extract this into a shared method + if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { CreateContainerResponse container = dockerClient.createContainerCmd("busybox") .withName("docker-java-itest-info") .withCmd("touch", "/test") @@ -54,8 +55,9 @@ public void info() throws DockerException { assertThat(container.getId(), not(isEmptyOrNullString())); dockerClient.startContainerCmd(container.getId()).exec(); + } - Info dockerInfo = dockerClient.infoCmd().exec(); + Info dockerInfo = dockerClient.infoCmd().exec(); LOG.info(dockerInfo.toString()); assertTrue(dockerInfo.toString().contains("containers")); @@ -68,6 +70,4 @@ public void info() throws DockerException { assertTrue(dockerInfo.getNGoroutines() > 0); assertTrue(dockerInfo.isMemoryLimit()); } - - } diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 394e86bd4..31a101f1c 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -109,7 +109,9 @@ public void testPullImage() throws DockerException, IOException { public void testPullNonExistingImage() throws DockerException, IOException { // does not throw an exception - dockerClient.pullImageCmd("nonexisting/foo").exec(); + InputStream is = dockerClient.pullImageCmd("nonexisting/foo").exec(); + // stream needs to be fully read in order to close the underlying connection + this.asString(is); try { dockerClient.pullImageCmd("non-existing/foo").exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index 2e2c9134d..f409aebf7 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -71,6 +71,5 @@ public void pushExistentImage() throws Exception { assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); } - } From bce65f09fe9ee9b6904c9687df17bdbc1c42bd5d Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Sat, 17 Jan 2015 21:27:34 +0100 Subject: [PATCH 0033/1399] add Dockerfile with minimal build environment --- .dockerignore | 1 + Dockerfile | 18 ++++++++++++++++++ .../core/command/EventsCmdImplTest.java | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..1de565933 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +target \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..eea3db562 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM java:7 +MAINTAINER https://github.com/docker-java/docker-java + +ENV HOME /root +ENV M2_HOME /opt/apache-maven-3.0.5 + +RUN wget http://www.eu.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz -O /tmp/apache-maven-3.0.5-bin.tar.gz \ + && cd /tmp \ + && tar xzf apache-maven-3.0.5-bin.tar.gz \ + && mkdir -p /opt \ + && mv apache-maven-3.0.5 /opt \ + && rm apache-maven-3.0.5-bin.tar.gz + +WORKDIR /project +ADD . /project/ + +#ENTRYPOINT $M2_HOME/bin/mvn +CMD $M2_HOME/bin/mvn verify 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 329f60b7b..941657a19 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -60,7 +60,7 @@ public void testEventStreamTimeBound() throws InterruptedException, IOException String endTime = getEpochTime(); CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); - EventCallback eventCallback = new EventCallbackTest(countDownLatch); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(startTime).withUntil(endTime); ExecutorService executorService = eventsCmd.exec(); @@ -68,6 +68,7 @@ public void testEventStreamTimeBound() throws InterruptedException, IOException boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); executorService.shutdown(); + eventCallback.close(); assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); } From 0319b14b2eabf88de3be5e7333f96c728d83ad50 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Sun, 18 Jan 2015 12:30:15 +0100 Subject: [PATCH 0034/1399] fix client config test to handle different develeoper environments --- .dockerignore | 3 ++- .../core/DockerClientConfigTest.java | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.dockerignore b/.dockerignore index 1de565933..a96e5522b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,2 @@ -target \ No newline at end of file +.git/ +target/ diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 3a61d034d..4611f4307 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -84,7 +84,9 @@ public void environmentDockerHostWithInvalidTlsVerify() throws Exception { // given docker host in env Map env = new HashMap(System.getenv()); env.put("DOCKER_HOST", "tcp://bar:8768"); - // and it looks to be SSL enabled + // and it looks to be SSL disabled + env.remove("DOCKER_CERT_PATH"); + // and it has an invalid TLS_VERIFY value env.put("DOCKER_TLS_VERIFY", "any value different from '1'"); // when you build a config @@ -94,6 +96,24 @@ public void environmentDockerHostWithInvalidTlsVerify() throws Exception { assertEquals(config.getUri(), URI.create("http://bar:8768")); } + @Test + public void environmentDockerHostWithInvalidTlsVerifyButWithCertPath() throws Exception { + + // given docker host in env + Map env = new HashMap(System.getenv()); + env.put("DOCKER_HOST", "tcp://bar:8768"); + // and it looks to be SSL enabled + env.put("DOCKER_CERT_PATH", "any value"); + // and it has an invalid TLS_VERIFY value + env.put("DOCKER_TLS_VERIFY", "any value different from '1'"); + + // when you build a config + DockerClientConfig config = buildConfig(env, new Properties()); + + // then the URL is that value with "tcp" changed to "https" + assertEquals(config.getUri(), URI.create("https://bar:8768")); + } + @Test public void environment() throws Exception { From f4ddcb35662c9e3d1c9acc6406dec305c369f9c7 Mon Sep 17 00:00:00 2001 From: Tobias Gesellchen Date: Sun, 18 Jan 2015 12:35:14 +0100 Subject: [PATCH 0035/1399] explicitly declare the Exception as ignored --- .../github/dockerjava/core/command/PullImageCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 31a101f1c..43291f07c 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -116,7 +116,7 @@ public void testPullNonExistingImage() throws DockerException, IOException { try { dockerClient.pullImageCmd("non-existing/foo").exec(); fail("expected InternalServerErrorException"); - } catch (InternalServerErrorException e) { + } catch (InternalServerErrorException ignored) { } } From 4f969dcff36635b242fdec38a2bb398ea7c68bac Mon Sep 17 00:00:00 2001 From: Roman Timushev Date: Mon, 19 Jan 2015 10:52:11 +0300 Subject: [PATCH 0036/1399] Allow unauthorized pullImageCmd --- .../com/github/dockerjava/core/DockerClientImpl.java | 2 +- .../core/command/AbstrAuthCfgDockerCmd.java | 11 ++++++++++- .../dockerjava/core/command/PullImageCmdImpl.java | 5 +++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index cee364e00..9581a5b8d 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -125,7 +125,7 @@ public VersionCmd versionCmd() { @Override public PullImageCmd pullImageCmd(String repository) { return new PullImageCmdImpl(getDockerCmdExecFactory() - .createPullImageCmdExec(), repository).withAuthConfig(dockerClientConfig.effectiveAuthConfig(repository)); + .createPullImageCmdExec(), dockerClientConfig.effectiveAuthConfig(repository), repository); } @Override diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 72aa94d8f..96e92da4b 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -15,6 +15,11 @@ public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { + public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { + super(execution); + withOptionalAuthConfig(authConfig); + } + public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { super(execution); } @@ -25,9 +30,13 @@ public AuthConfig getAuthConfig() { return authConfig; } - @SuppressWarnings("unchecked") public T withAuthConfig(AuthConfig authConfig) { Preconditions.checkNotNull(authConfig, "authConfig was not specified"); + return withOptionalAuthConfig(authConfig); + } + + @SuppressWarnings("unchecked") + private T withOptionalAuthConfig(AuthConfig authConfig) { this.authConfig = authConfig; return (T)this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index b2e62434a..bcd3613b4 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; import com.google.common.base.Preconditions; import java.io.InputStream; @@ -14,8 +15,8 @@ public class PullImageCmdImpl extends AbstrAuthCfgDockerCmd Date: Tue, 20 Jan 2015 22:13:22 +0100 Subject: [PATCH 0037/1399] Fix misleading variable name in Exec-start --- .../com/github/dockerjava/core/command/ExecStartCmdImpl.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 0340a7ac2..3b21f9b2f 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -12,10 +12,9 @@ public class ExecStartCmdImpl extends AbstrDockerCmd private boolean detach, tty; - public ExecStartCmdImpl(ExecStartCmd.Exec exec, String containerId) { + public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { super(exec); - Preconditions.checkNotNull(containerId, "containerId was not specified"); - this.execId = containerId; + withExecId(execId); } @Override From 60fb248a7acc4e6bedbe56503d5ae142862b68f5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 20 Jan 2015 22:23:21 +0100 Subject: [PATCH 0038/1399] Support wildcards in Dockerfile. Fix issue#129 --- .../core/command/BuildImageCmdImpl.java | 79 +++++++++++++------ .../core/command/BuildImageCmdImplTest.java | 32 +++++--- .../testAddFilesViaWildcard/Dockerfile | 9 +++ .../folder1/testrun.sh | 5 ++ .../folder2/testinclude1.sh | 3 + .../ignore/testinclude2.sh | 3 + 6 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 src/test/resources/testAddFilesViaWildcard/Dockerfile create mode 100755 src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh create mode 100755 src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh create mode 100755 src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh 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 9e8b5a146..ec3406b17 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -31,7 +31,8 @@ * Build an image from Dockerfile. * */ -public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { +public class BuildImageCmdImpl extends + AbstrDockerCmd implements BuildImageCmd { private static final Pattern ADD_OR_COPY_PATTERN = Pattern .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); @@ -62,8 +63,8 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { super(exec); Preconditions.checkNotNull(tarInputStream, "tarInputStream is null"); withTarInputStream(tarInputStream); - } - + } + @Override public InputStream getTarInputStream() { return tarInputStream; @@ -75,7 +76,7 @@ public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { this.tarInputStream = tarInputStream; return this; } - + @Override public BuildImageCmdImpl withTag(String tag) { Preconditions.checkNotNull(tag, "Tag is null"); @@ -113,7 +114,7 @@ public BuildImageCmdImpl withNoCache(boolean noCache) { this.noCache = noCache; return this; } - + @Override public BuildImageCmdImpl withRemove() { return withRemove(true); @@ -124,7 +125,7 @@ public BuildImageCmdImpl withRemove(boolean rm) { this.remove = rm; return this; } - + @Override public BuildImageCmdImpl withQuiet() { return withQuiet(true); @@ -142,7 +143,7 @@ public void close() throws IOException { if (tarFile != null) { FileUtils.deleteQuietly(tarFile); } - + tarInputStream.close(); } @@ -152,8 +153,7 @@ public String toString() { .append(tag != null ? "-t " + tag + " " : "") .append(noCache ? "--nocache=true " : "") .append(quiet ? "--quiet=true " : "") - .append(!remove ? "--rm=false " : "") - .toString(); + .append(!remove ? "--rm=false " : "").toString(); } protected File buildDockerFolderTar(File dockerFolder) { @@ -182,8 +182,9 @@ protected File buildDockerFolderTar(File dockerFolder) { File dockerIgnoreFile = new File(dockerFolder, ".dockerignore"); if (dockerIgnoreFile.exists()) { int lineNumber = 0; - List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); - for (String pattern: dockerIgnoreFileContent) { + List dockerIgnoreFileContent = FileUtils + .readLines(dockerIgnoreFile); + for (String pattern : dockerIgnoreFileContent) { lineNumber++; pattern = pattern.trim(); if (pattern.isEmpty()) { @@ -191,14 +192,20 @@ protected File buildDockerFolderTar(File dockerFolder) { } pattern = FilenameUtils.normalize(pattern); try { - // validate pattern and make sure we aren't excluding Dockerfile + // validate pattern and make sure we aren't excluding + // Dockerfile if (GoLangFileMatch.match(pattern, "Dockerfile")) { throw new DockerClientException( - String.format("Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + String.format( + "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", + pattern, lineNumber)); } ignores.add(pattern); } catch (GoLangFileMatchException e) { - throw new DockerClientException(String.format("Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + throw new DockerClientException( + String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", + pattern, lineNumber)); } } } @@ -254,19 +261,26 @@ protected File buildDockerFolderTar(File dockerFolder) { src, dockerFolder)); } - if (!src.exists()) { - throw new DockerClientException(String.format( - "Source file %s doesn't exist", src)); - } + // 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); + new GoLangMatchFileFilter(src, ignores), + TrueFileFilter.INSTANCE); filesToAdd.addAll(files); - } else if (!GoLangFileMatch.match(ignores, CompressArchiveUtil.relativize(dockerFolder, src))){ + } else if (!src.exists()) { + filesToAdd.addAll(resolveWildcards(src, ignores)); + } else if (!GoLangFileMatch.match(ignores, + CompressArchiveUtil.relativize(dockerFolder, + src))) { filesToAdd.add(src); } else { - throw new DockerClientException(String.format( - "Source file %s is excluded by .dockerignore file", src)); + throw new DockerClientException( + String.format( + "Source file %s is excluded by .dockerignore file", + src)); } } } @@ -281,6 +295,27 @@ protected File buildDockerFolderTar(File dockerFolder) { } } + private Collection resolveWildcards(File file, List ignores) { + List filesToAdd = new ArrayList(); + + File parent = file.getParentFile(); + if (parent != null) { + if (parent.isDirectory()) { + Collection files = FileUtils.listFiles(parent, + new GoLangMatchFileFilter(parent, ignores), + TrueFileFilter.INSTANCE); + filesToAdd.addAll(files); + } else { + filesToAdd.addAll(resolveWildcards(parent, ignores)); + } + } else { + throw new DockerClientException(String.format( + "Source file %s doesn't exist", file)); + } + + return filesToAdd; + } + private String filterForEnvironmentVars(String extractedResource, Map environmentMap) { 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 7ae29e534..3692f56d1 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -78,7 +78,8 @@ public void testNginxDockerfileBuilder() { public void testDockerBuilderAddUrl() { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddUrl").getFile()); - dockerfileBuild(baseDir, "Docker"); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Docker")); } @Test @@ -86,7 +87,18 @@ public void testDockerBuilderAddFileInSubfolder() throws DockerException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddFileInSubfolder").getFile()); - dockerfileBuild(baseDir, "Successfully executed testrun.sh"); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testrun.sh")); + } + + @Test + public void testDockerBuilderAddFilesViaWildcard() throws DockerException, + IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("testAddFilesViaWildcard").getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testinclude1.sh")); + assertThat(response, not(containsString("Successfully executed testinclude2.sh"))); } @Test @@ -94,11 +106,12 @@ public void testDockerBuilderAddFolder() throws DockerException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddFolder").getFile()); - dockerfileBuild(baseDir, "Successfully executed testAddFolder.sh"); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testAddFolder.sh")); } - private String dockerfileBuild(File baseDir, String expectedText) { + private String dockerfileBuild(File baseDir) { // Build image InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); @@ -123,9 +136,9 @@ private String dockerfileBuild(File baseDir, String expectedText) { InputStream logResponse = logContainer(container .getId()); - assertThat(asString(logResponse), containsString(expectedText)); + //assertThat(asString(logResponse), containsString(expectedText)); - return container.getId(); + return asString(logResponse); } @@ -152,7 +165,8 @@ public void testDockerIgnore() throws DockerException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testDockerignore").getFile()); - dockerfileBuild(baseDir, "/tmp/a/a /tmp/a/c /tmp/a/d"); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d")); } @Test @@ -201,7 +215,7 @@ public void testNetCatDockerfileBuilder() throws InterruptedException { public void testAddAndCopySubstitution () throws DockerException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testENVSubstitution").getFile()); - dockerfileBuild(baseDir, "testENVSubstitution successfully completed"); - + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("testENVSubstitution successfully completed")); } } diff --git a/src/test/resources/testAddFilesViaWildcard/Dockerfile b/src/test/resources/testAddFilesViaWildcard/Dockerfile new file mode 100644 index 000000000..a9a9ad2b9 --- /dev/null +++ b/src/test/resources/testAddFilesViaWildcard/Dockerfile @@ -0,0 +1,9 @@ +FROM ubuntu:latest + +# Copy testrun.sh files into the container + +ADD ./folder*/* /tmp/ + +RUN cp /tmp/*.sh /usr/local/bin/ && chmod +x /usr/local/bin/*.sh + +CMD ["testrun.sh"] diff --git a/src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh b/src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh new file mode 100755 index 000000000..fcfb1ee9b --- /dev/null +++ b/src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +/usr/local/bin/testinclude1.sh +/usr/local/bin/testinclude2.sh + diff --git a/src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh b/src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh new file mode 100755 index 000000000..7953ce670 --- /dev/null +++ b/src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Successfully executed testinclude1.sh" diff --git a/src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh b/src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh new file mode 100755 index 000000000..259944b2e --- /dev/null +++ b/src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Successfully executed testinclude2.sh" From 4c69b518f455d346e40631cef53be5893ed639ae Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 21 Jan 2015 21:12:12 +0100 Subject: [PATCH 0039/1399] some cleanup --- Dockerfile | 18 ------------------ pom.xml | 11 ++--------- 2 files changed, 2 insertions(+), 27 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index eea3db562..000000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM java:7 -MAINTAINER https://github.com/docker-java/docker-java - -ENV HOME /root -ENV M2_HOME /opt/apache-maven-3.0.5 - -RUN wget http://www.eu.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz -O /tmp/apache-maven-3.0.5-bin.tar.gz \ - && cd /tmp \ - && tar xzf apache-maven-3.0.5-bin.tar.gz \ - && mkdir -p /opt \ - && mv apache-maven-3.0.5 /opt \ - && rm apache-maven-3.0.5-bin.tar.gz - -WORKDIR /project -ADD . /project/ - -#ENTRYPOINT $M2_HOME/bin/mvn -CMD $M2_HOME/bin/mvn verify diff --git a/pom.xml b/pom.xml index 1e6a477e9..ce566d4d5 100644 --- a/pom.xml +++ b/pom.xml @@ -39,20 +39,13 @@ - - - jcenter - http://jcenter.bintray.com - - - UTF-8 UTF-8 true false - 1.6 - 1.6 + 1.7 + 1.7 1.6.1 From 55e42ad2e21ed2cb198a913a7f95ed05dc6e8f98 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Jan 2015 21:16:55 +0100 Subject: [PATCH 0040/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f225212d1..4baf40e17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log docker-java-0.10.5-SNAPSHOT --- + * [#125](https://github.com/docker-java/docker-java/pull/125) Unixsocket support * [#123](https://github.com/docker-java/docker-java/pull/123) support DOCKER_TLS_VERIFY to detect ssl * [#121](https://github.com/docker-java/docker-java/pull/121) Implemented support for commands: Exec-start, Exec-create * [#120](https://github.com/docker-java/docker-java/pull/120) Command resource cleanup after command execution From f71c2d9eaf988201e61b4b497b8bff7b2c505df7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 21 Jan 2015 21:20:38 +0100 Subject: [PATCH 0041/1399] [maven-release-plugin] prepare release docker-java-0.10.5 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ce566d4d5..f1987efa1 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 0.10.5-SNAPSHOT + 0.10.5 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-0.10.5 From e2e30cd2d88eca44f9bfccbebf0ae9f12a7fee76 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 21 Jan 2015 21:21:23 +0100 Subject: [PATCH 0042/1399] [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 f1987efa1..4a9af78d9 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 0.10.5 + 0.10.6-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-0.10.5 + HEAD From e022c44fc615c2a0f2e9747db744b1c9bd6113fb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Jan 2015 21:25:47 +0100 Subject: [PATCH 0043/1399] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ec3a92a45..53d470218 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Run build without integration tests: com.github.docker-java docker-java - 0.10.4 + 0.10.5 ### Latest SNAPSHOT version @@ -69,7 +69,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 0.10.5-SNAPSHOT + 0.10.6-SNAPSHOT ## Documentation From de1611efa0935ea3a23fe8f56fcba48e5e00015f Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Jan 2015 21:27:23 +0100 Subject: [PATCH 0044/1399] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 53d470218..63c8d64b9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Java API client for [Docker](http://docs.docker.io/ "Docker") -Supports a subset of the Docker Client API v1.15, Docker Server version 1.3.2 +Supports a subset of the Docker Client API v1.16, Docker Server version 1.4.1 The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! @@ -13,7 +13,7 @@ Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/ ###### Prerequisites: -* Java 1.6 +* Java 1.7 * Maven 3.0.5 * Docker daemon running @@ -81,7 +81,7 @@ For code examples, please look at the [Wiki](https://github.com/docker-java/dock There are a couple of configuration items, all of which have sensible defaults: * `url` The Docker URL, e.g. `https://localhost:2376`. -* `version` The API version, e.g. `1.15`. +* `version` The API version, e.g. `1.16`. * `username` Your registry username (required to push containers). * `password` Your registry password. * `email` Your registry email. @@ -94,7 +94,7 @@ There are three ways to configure, in descending order of precedence: In your application, e.g. DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() - .withVersion("1.15") + .withVersion("1.16") .withUri("https://my-docker-host.tld:2376") .withUsername("dockeruser") .withPassword("ilovedocker") @@ -107,7 +107,7 @@ In your application, e.g. #### Properties docker.io.url=https://localhost:2376 - docker.io.version=1.15 + docker.io.version=1.16 docker.io.username=dockeruser docker.io.password=ilovedocker docker.io.email=dockeruser@github.com From 2f9b736398dd650c4a1feb7d2dbedd5fa1387970 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Jan 2015 21:31:38 +0100 Subject: [PATCH 0045/1399] Update CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4baf40e17..d5cc18801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ Change Log === -docker-java-0.10.5-SNAPSHOT +docker-java-0.10.6-SNAPSHOT +--- + +docker-java-0.10.5 --- * [#125](https://github.com/docker-java/docker-java/pull/125) Unixsocket support * [#123](https://github.com/docker-java/docker-java/pull/123) support DOCKER_TLS_VERIFY to detect ssl From 06c3ffe7d9769087b607fe7186e975a4df66d4b8 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Jan 2015 23:19:55 +0100 Subject: [PATCH 0046/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5cc18801..0b0d2c6c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log docker-java-0.10.6-SNAPSHOT --- + * [#128](https://github.com/docker-java/docker-java/pull/128) Allow unauthorized pullImageCmd docker-java-0.10.5 --- From 0a3a28ea767c79a86bc41e0a26d8f2e389795528 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 21 Jan 2015 23:33:15 +0100 Subject: [PATCH 0047/1399] Fix compile error --- .../github/dockerjava/core/command/PullImageCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 43291f07c..861c10783 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -49,7 +49,7 @@ public void afterMethod(ITestResult result) { @Test public void nullAuthConfig() throws Exception { - PullImageCmdImpl pullImageCmd = new PullImageCmdImpl(NOP_EXEC, ""); + PullImageCmdImpl pullImageCmd = new PullImageCmdImpl(NOP_EXEC, null, ""); try { pullImageCmd.withAuthConfig(null); fail(); From ad7881a05de88dea57c9e3b752728b354236a4fd Mon Sep 17 00:00:00 2001 From: Aslak Knutsen Date: Tue, 27 Jan 2015 13:05:10 +0100 Subject: [PATCH 0048/1399] Remove Google Guava as dependency --- pom.xml | 7 - .../com/github/dockerjava/Preconditions.java | 145 +++++++++ .../api/command/TopContainerResponse.java | 9 +- .../github/dockerjava/api/model/Device.java | 9 +- .../dockerjava/api/model/RestartPolicy.java | 5 +- .../dockerjava/core/DockerClientConfig.java | 45 +-- .../dockerjava/core/DockerClientImpl.java | 79 ++++- .../dockerjava/core/KeystoreSSLConfig.java | 15 +- .../core/LocalDirectorySSLConfig.java | 24 +- .../core/command/AbstrAuthCfgDockerCmd.java | 11 +- .../core/command/AbstrDockerCmd.java | 5 +- .../core/command/AttachContainerCmdImpl.java | 6 +- .../core/command/BuildImageCmdImpl.java | 19 +- .../core/command/CommitCmdImpl.java | 36 +-- .../core/command/ContainerDiffCmdImpl.java | 6 +- .../command/CopyFileFromContainerCmdImpl.java | 10 +- .../core/command/CreateContainerCmdImpl.java | 10 +- .../core/command/CreateImageCmdImpl.java | 11 +- .../core/command/ExecCreateCmdImpl.java | 5 +- .../core/command/ExecStartCmdImpl.java | 9 +- .../core/command/InspectContainerCmdImpl.java | 6 +- .../core/command/InspectImageCmdImpl.java | 5 +- .../core/command/KillContainerCmdImpl.java | 7 +- .../core/command/ListContainersCmdImpl.java | 10 +- .../core/command/ListImagesCmdImpl.java | 6 +- .../core/command/LogContainerCmdImpl.java | 6 +- .../core/command/PauseContainerCmdImpl.java | 6 +- .../core/command/PullImageCmdImpl.java | 13 +- .../core/command/PushImageCmdImpl.java | 8 +- .../core/command/RemoveContainerCmdImpl.java | 6 +- .../core/command/RemoveImageCmdImpl.java | 6 +- .../core/command/RestartContainerCmdImpl.java | 9 +- .../core/command/SearchImagesCmdImpl.java | 6 +- .../core/command/StartContainerCmdImpl.java | 33 +- .../core/command/StopContainerCmdImpl.java | 9 +- .../core/command/TagImageCmdImpl.java | 9 +- .../core/command/TopContainerCmdImpl.java | 8 +- .../core/command/UnpauseContainerCmdImpl.java | 6 +- .../core/command/WaitContainerCmdImpl.java | 5 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 7 +- .../dockerjava/jaxrs/ApacheUnixSocket.java | 9 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 72 +++-- .../dockerjava/jaxrs/EventsCmdExec.java | 19 +- .../dockerjava/jaxrs/ListImagesCmdExec.java | 5 +- .../jaxrs/util/SelectiveLoggingFilter.java | 17 +- .../dockerjava/jaxrs/util/guava/Guava.java | 45 +++ .../jaxrs/util/guava/PercentEscaper.java | 245 ++++++++++++++ .../jaxrs/util/guava/UnicodeEscaper.java | 304 ++++++++++++++++++ 48 files changed, 1108 insertions(+), 245 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/Preconditions.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java diff --git a/pom.xml b/pom.xml index 4a9af78d9..b8f45ccdb 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,6 @@ 1.7.5 1.3.9 0.3 - 18.0 1.51 2014-11-16T14-41-27 @@ -150,12 +149,6 @@ ${slf4j-api.version} - - com.google.guava - guava - ${guava.version} - - org.bouncycastle bcpkix-jdk15on diff --git a/src/main/java/com/github/dockerjava/Preconditions.java b/src/main/java/com/github/dockerjava/Preconditions.java new file mode 100644 index 000000000..183e640b7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/Preconditions.java @@ -0,0 +1,145 @@ +/* Copyright (C) 2008 The Guava Authors + * + * 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; + + +public final class Preconditions { + private Preconditions() {} + + /** + * Ensures the truth of an expression involving one or more parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessageTemplate a template for the exception message should the check fail. The + * message is formed by replacing each {@code %s} placeholder in the template with an + * argument. These are matched by position - the first {@code %s} gets {@code + * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message + * in square braces. Unmatched placeholders will be left as-is. + * @param errorMessageArgs the arguments to be substituted into the message template. Arguments + * are converted to strings using {@link String#valueOf(Object)}. + * @throws IllegalArgumentException if {@code expression} is false + * @throws NullPointerException if the check fails and either {@code errorMessageTemplate} or + * {@code errorMessageArgs} is null (don't let this happen) + */ + public static void checkArgument(boolean expression, + String errorMessageTemplate, + Object... errorMessageArgs) { + if (!expression) { + throw new IllegalArgumentException(Preconditions.format(errorMessageTemplate, errorMessageArgs)); + } + } + + /** + * Ensures that an object reference passed as a parameter to the calling method is not null. + * + * @param reference an object reference + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference, Object errorMessage) { + if (reference == null) { + throw new NullPointerException(String.valueOf(errorMessage)); + } + return reference; + } + + /** + * Ensures the truth of an expression involving one or more parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @throws IllegalArgumentException if {@code expression} is false + */ + public static void checkArgument(boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalArgumentException(String.valueOf(errorMessage)); + } + } + + /** + * Ensures that an object reference passed as a parameter to the calling method is not null. + * + * @param reference an object reference + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference) { + if (reference == null) { + throw new NullPointerException(); + } + return reference; + } + + /** + * Ensures the truth of an expression involving the state of the calling instance, but not + * involving any parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will be converted to a + * string using {@link String#valueOf(Object)} + * @throws IllegalStateException if {@code expression} is false + */ + public static void checkState(boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalStateException(String.valueOf(errorMessage)); + } + } + + /** + * Substitutes each {@code %s} in {@code template} with an argument. These are matched by + * position: the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than + * placeholders, the unmatched arguments will be appended to the end of the formatted message in + * square braces. + * + * @param template a non-null string containing 0 or more {@code %s} placeholders. + * @param args the arguments to be substituted into the message template. Arguments are converted + * to strings using {@link String#valueOf(Object)}. Arguments can be null. + */ + // Note that this is somewhat-improperly used from Verify.java as well. + public static String format(String template, Object... args) { + template = String.valueOf(template); // null -> "null" + + // start substituting the arguments into the '%s' placeholders + StringBuilder builder = new StringBuilder(template.length() + 16 * args.length); + int templateStart = 0; + int i = 0; + while (i < args.length) { + int placeholderStart = template.indexOf("%s", templateStart); + if (placeholderStart == -1) { + break; + } + builder.append(template.substring(templateStart, placeholderStart)); + builder.append(args[i++]); + templateStart = placeholderStart + 2; + } + builder.append(template.substring(templateStart)); + + // if we run out of placeholders, append the extra args in square braces + if (i < args.length) { + builder.append(" ["); + builder.append(args[i++]); + while (i < args.length) { + builder.append(", "); + builder.append(args[i++]); + } + builder.append(']'); + } + + return builder.toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index e479b2698..099da368f 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -1,8 +1,9 @@ package com.github.dockerjava.api.command; +import static com.github.dockerjava.jaxrs.util.guava.Guava.join; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Joiner; /** * @@ -28,17 +29,15 @@ public String[][] getProcesses() { @Override public String toString() { - Joiner joiner = Joiner.on("; ").skipNulls(); - StringBuffer buffer = new StringBuffer(); buffer.append("["); for(String[] fields: processes) { - buffer.append("[" + joiner.join(fields) + "]"); + buffer.append("[" + join(fields, "; ", true) + "]"); } buffer.append("]"); return "TopContainerResponse{" + - "titles=" + joiner.join(titles) + + "titles=" + join(titles, "; ", true) + ", processes=" + buffer.toString() + '}'; } diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index b0b325157..76b0ddbf9 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.model; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; public class Device { @@ -22,10 +23,10 @@ public Device() { public Device(String cGroupPermissions, String pathInContainer, String pathOnHost) { - Preconditions.checkNotNull(cGroupPermissions, + checkNotNull(cGroupPermissions, "cGroupPermissions is null"); - Preconditions.checkNotNull(pathInContainer, "pathInContainer is null"); - Preconditions.checkNotNull(pathOnHost, "pathOnHost is null"); + checkNotNull(pathInContainer, "pathInContainer is null"); + checkNotNull(pathOnHost, "pathOnHost is null"); this.cGroupPermissions = cGroupPermissions; this.pathInContainer = pathInContainer; this.pathOnHost = pathOnHost; diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 5cdcb70bc..e08dd1384 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.model; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; /** * Container restart policy @@ -36,7 +37,7 @@ public RestartPolicy() { } private RestartPolicy(int maximumRetryCount, String name) { - Preconditions.checkNotNull(name, "name is null"); + checkNotNull(name, "name is null"); this.maximumRetryCount = maximumRetryCount; this.name = name; } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 21e5778fd..9a7a2e9fa 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,20 +1,22 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.core.NameParser.HostnameReposName; -import com.github.dockerjava.core.NameParser.ReposTag; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; import java.net.URI; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Properties; +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.core.NameParser.HostnameReposName; +import com.github.dockerjava.core.NameParser.ReposTag; + public class DockerClientConfig implements Serializable { private static final long serialVersionUID = -4307357472441531489L; @@ -39,18 +41,23 @@ public class DockerClientConfig implements Serializable { /** * A map from the environment name to the interval name. */ - private static final Map ENV_NAME_TO_IO_NAME = ImmutableMap.builder() - .put("DOCKER_URL", DOCKER_IO_URL_PROPERTY) - .put("DOCKER_VERSION", DOCKER_IO_VERSION_PROPERTY) - .put("DOCKER_USERNAME", DOCKER_IO_USERNAME_PROPERTY) - .put("DOCKER_PASSWORD", DOCKER_IO_PASSWORD_PROPERTY) - .put("DOCKER_EMAIL", DOCKER_IO_EMAIL_PROPERTY) - .put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY) - .put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY) - .put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY) - .put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY) - .put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY) - .build(); + // Immutable ish + private static final Map ENV_NAME_TO_IO_NAME; + static { + Map m = new HashMap(); + m.put("DOCKER_URL", DOCKER_IO_URL_PROPERTY); + m.put("DOCKER_VERSION", DOCKER_IO_VERSION_PROPERTY); + m.put("DOCKER_USERNAME", DOCKER_IO_USERNAME_PROPERTY); + m.put("DOCKER_PASSWORD", DOCKER_IO_PASSWORD_PROPERTY); + m.put("DOCKER_EMAIL", DOCKER_IO_EMAIL_PROPERTY); + m.put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY); + m.put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY); + m.put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY); + m.put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY); + m.put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY); + ENV_NAME_TO_IO_NAME = Collections.unmodifiableMap(m); + } + private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; private URI uri; private final String version, username, password, email, serverAddress, dockerCfgPath; @@ -370,7 +377,7 @@ public DockerClientConfigBuilder withProperties(Properties p) { } public final DockerClientConfigBuilder withUri(String uri) { - Preconditions.checkNotNull(uri, "uri was not specified"); + checkNotNull(uri, "uri was not specified"); this.uri = URI.create(uri); return this; } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 556c7f91e..f1175921c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.Closeable; import java.io.File; @@ -8,10 +8,75 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.*; +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.EventCallback; +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.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.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +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.core.command.*; -import com.google.common.base.Preconditions; +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.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.SearchImagesCmdImpl; +import com.github.dockerjava.core.command.StartContainerCmdImpl; +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) @@ -33,7 +98,7 @@ private DockerClientImpl(String serverUrl) { } private DockerClientImpl(DockerClientConfig dockerClientConfig) { - Preconditions.checkNotNull(dockerClientConfig, + checkNotNull(dockerClientConfig, "config was not specified"); this.dockerClientConfig = dockerClientConfig; } @@ -58,7 +123,7 @@ public static DockerClientImpl getInstance(String serverUrl) { public DockerClientImpl withDockerCmdExecFactory( DockerCmdExecFactory dockerCmdExecFactory) { - Preconditions.checkNotNull(dockerCmdExecFactory, + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); this.dockerCmdExecFactory = dockerCmdExecFactory; this.dockerCmdExecFactory.init(dockerClientConfig); @@ -66,7 +131,7 @@ public DockerClientImpl withDockerCmdExecFactory( } private DockerCmdExecFactory getDockerCmdExecFactory() { - Preconditions.checkNotNull(dockerCmdExecFactory, + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); return dockerCmdExecFactory; } diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index 269b87658..fe5e65099 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; @@ -35,7 +34,7 @@ public class KeystoreSSLConfig implements SSLConfig, Serializable { */ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { this.keystorePassword = keystorePassword; - Preconditions.checkNotNull(keystore); + checkNotNull(keystore); this.keystore = keystore; } @@ -50,8 +49,8 @@ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { */ public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - Preconditions.checkNotNull(pfxFile); - Preconditions.checkNotNull(password); + checkNotNull(pfxFile); + checkNotNull(password); keystore = KeyStore.getInstance("pkcs12"); keystore.load(new FileInputStream(pfxFile), password.toCharArray()); keystorePassword = password; @@ -126,8 +125,10 @@ public int hashCode() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("keystore", keystore) + return new StringBuilder() + .append(this.getClass().getSimpleName()).append("{") + .append("keystore=").append(keystore) + .append("}") .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 6415d0c18..d60db72c5 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,16 +1,18 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.DockerClientException; -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.glassfish.jersey.SslConfigurator; +import static com.github.dockerjava.Preconditions.checkNotNull; -import javax.net.ssl.SSLContext; import java.io.Serializable; -import java.security.KeyStore; import java.security.Security; +import javax.net.ssl.SSLContext; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.glassfish.jersey.SslConfigurator; + +import com.github.dockerjava.api.DockerClientException; + + /** * SSL Config from local files. */ @@ -19,7 +21,7 @@ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { private final String dockerCertPath; public LocalDirectorySSLConfig(String dockerCertPath) { - Preconditions.checkNotNull(dockerCertPath); + checkNotNull(dockerCertPath); this.dockerCertPath = dockerCertPath; } @@ -88,8 +90,10 @@ public int hashCode() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("dockerCertPath", dockerCertPath) + return new StringBuilder() + .append(this.getClass().getSimpleName()).append("{") + .append("dockerCertPath=").append(dockerCertPath) + .append("}") .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 96e92da4b..8069ed6b1 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -1,17 +1,16 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.codec.binary.Base64; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; - -import org.apache.commons.codec.binary.Base64; - public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { @@ -31,7 +30,7 @@ public AuthConfig getAuthConfig() { } public T withAuthConfig(AuthConfig authConfig) { - Preconditions.checkNotNull(authConfig, "authConfig was not specified"); + checkNotNull(authConfig, "authConfig was not specified"); return withOptionalAuthConfig(authConfig); } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 54312c50c..ed289c98a 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; import org.slf4j.Logger; @@ -8,7 +10,6 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; -import com.google.common.base.Preconditions; public abstract class AbstrDockerCmd, RES_T> implements DockerCmd { @@ -17,7 +18,7 @@ public abstract class AbstrDockerCmd, RES_T> impl protected DockerCmdExec execution; public AbstrDockerCmd(DockerCmdExec execution) { - Preconditions.checkNotNull(execution, "execution was not specified"); + checkNotNull(execution, "execution was not specified"); this.execution = execution; } 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 930fbdfdd..6ac220c0e 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.AttachContainerCmd; -import com.google.common.base.Preconditions; - /** * Attach to container * @@ -66,7 +66,7 @@ public boolean hasStderrEnabled() { @Override public AttachContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } 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 ec3406b17..b2286bc85 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -1,5 +1,9 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; +import static com.github.dockerjava.Preconditions.checkState; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -24,7 +28,6 @@ import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; -import com.google.common.base.Preconditions; /** * @@ -49,7 +52,7 @@ public class BuildImageCmdImpl extends public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFolder) { super(exec); - Preconditions.checkNotNull(dockerFolder, "dockerFolder is null"); + checkNotNull(dockerFolder, "dockerFolder is null"); tarFile = buildDockerFolderTar(dockerFolder); try { withTarInputStream(FileUtils.openInputStream(tarFile)); @@ -61,7 +64,7 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFolder) { public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { super(exec); - Preconditions.checkNotNull(tarInputStream, "tarInputStream is null"); + checkNotNull(tarInputStream, "tarInputStream is null"); withTarInputStream(tarInputStream); } @@ -72,14 +75,14 @@ public InputStream getTarInputStream() { @Override public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - Preconditions.checkNotNull(tarInputStream, "tarInputStream is null"); + checkNotNull(tarInputStream, "tarInputStream is null"); this.tarInputStream = tarInputStream; return this; } @Override public BuildImageCmdImpl withTag(String tag) { - Preconditions.checkNotNull(tag, "Tag is null"); + checkNotNull(tag, "Tag is null"); this.tag = tag; return this; } @@ -157,11 +160,11 @@ public String toString() { } protected File buildDockerFolderTar(File dockerFolder) { - Preconditions.checkArgument(dockerFolder.exists(), + checkArgument(dockerFolder.exists(), "Path %s doesn't exist", dockerFolder); - Preconditions.checkArgument(dockerFolder.isDirectory(), + checkArgument(dockerFolder.isDirectory(), "Folder %s doesn't exist", dockerFolder); - Preconditions.checkState(new File(dockerFolder, "Dockerfile").exists(), + checkState(new File(dockerFolder, "Dockerfile").exists(), "Dockerfile doesn't exist in " + dockerFolder); // ARCHIVE TAR diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index ee9c4db6e..6ba3d4a34 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -1,15 +1,15 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonProperty; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; -import com.google.common.base.Preconditions; /** * @@ -86,7 +86,7 @@ public String getContainerId() { @Override public CommitCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -152,7 +152,7 @@ public CommitCmdImpl withAttachStdout() { @Override public CommitCmdImpl withCmd(String... cmd) { - Preconditions.checkNotNull(cmd, "cmd was not specified"); + checkNotNull(cmd, "cmd was not specified"); this.cmd = cmd; return this; } @@ -165,28 +165,28 @@ public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { @Override public CommitCmdImpl withAuthor(String author) { - Preconditions.checkNotNull(author, "author was not specified"); + checkNotNull(author, "author was not specified"); this.author = author; return this; } @Override public CommitCmdImpl withMessage(String message) { - Preconditions.checkNotNull(message, "message was not specified"); + checkNotNull(message, "message was not specified"); this.message = message; return this; } @Override public CommitCmdImpl withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } @Override public CommitCmdImpl withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @@ -204,7 +204,7 @@ public String[] getEnv() { @Override public CommitCmdImpl withEnv(String... env) { - Preconditions.checkNotNull(env, "env was not specified"); + checkNotNull(env, "env was not specified"); this.env = env; return this; } @@ -216,7 +216,7 @@ public ExposedPorts getExposedPorts() { @Override public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { - Preconditions.checkNotNull(exposedPorts, "exposedPorts was not specified"); + checkNotNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = exposedPorts; return this; } @@ -228,7 +228,7 @@ public String getHostname() { @Override public CommitCmdImpl withHostname(String hostname) { - Preconditions.checkNotNull(hostname, "hostname was not specified"); + checkNotNull(hostname, "hostname was not specified"); this.hostname = hostname; return this; } @@ -240,7 +240,7 @@ public Integer getMemory() { @Override public CommitCmdImpl withMemory(Integer memory) { - Preconditions.checkNotNull(memory, "memory was not specified"); + checkNotNull(memory, "memory was not specified"); this.memory = memory; return this; } @@ -252,7 +252,7 @@ public Integer getMemorySwap() { @Override public CommitCmdImpl withMemorySwap(Integer memorySwap) { - Preconditions.checkNotNull(memorySwap, "memorySwap was not specified"); + checkNotNull(memorySwap, "memorySwap was not specified"); this.memorySwap = memorySwap; return this; } @@ -264,7 +264,7 @@ public boolean isOpenStdin() { @Override public CommitCmdImpl withOpenStdin(boolean openStdin) { - Preconditions.checkNotNull(openStdin, "openStdin was not specified"); + checkNotNull(openStdin, "openStdin was not specified"); this.openStdin = openStdin; return this; } @@ -276,7 +276,7 @@ public String[] getPortSpecs() { @Override public CommitCmdImpl withPortSpecs(String... portSpecs) { - Preconditions.checkNotNull(portSpecs, "portSpecs was not specified"); + checkNotNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } @@ -320,7 +320,7 @@ public String getUser() { @Override public CommitCmdImpl withUser(String user) { - Preconditions.checkNotNull(user, "user was not specified"); + checkNotNull(user, "user was not specified"); this.user = user; return this; } @@ -332,7 +332,7 @@ public Volumes getVolumes() { @Override public CommitCmdImpl withVolumes(Volumes volumes) { - Preconditions.checkNotNull(volumes, "volumes was not specified"); + checkNotNull(volumes, "volumes was not specified"); this.volumes = volumes; return this; } @@ -344,7 +344,7 @@ public String getWorkingDir() { @Override public CommitCmdImpl withWorkingDir(String workingDir) { - Preconditions.checkNotNull(workingDir, "workingDir was not specified"); + checkNotNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index f6a414b1b..68293107d 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.DockerException; @@ -8,8 +10,6 @@ import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; -import com.google.common.base.Preconditions; - /** * Inspect changes on a container's filesystem * @@ -32,7 +32,7 @@ public String getContainerId() { @Override public ContainerDiffCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 929b6bf5f..2d91bb72e 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -1,15 +1,15 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonProperty; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.google.common.base.Preconditions; /** * @@ -44,14 +44,14 @@ public String getResource() { @Override public CopyFileFromContainerCmdImpl withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public CopyFileFromContainerCmdImpl withResource(String resource) { - Preconditions.checkNotNull(resource, "resource was not specified"); + checkNotNull(resource, "resource was not specified"); this.resource = resource; return this; } @@ -63,7 +63,7 @@ public String getHostPath() { @Override public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { - Preconditions.checkNotNull(hostPath, "hostPath was not specified"); + checkNotNull(hostPath, "hostPath was not specified"); this.hostPath = hostPath; return this; } 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 b8cde7fe0..ea6d721e7 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -14,7 +16,7 @@ import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; -import com.google.common.base.Preconditions; + /** * @@ -49,13 +51,13 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { @@ -31,7 +32,7 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { } public ExecCreateCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 3b21f9b2f..8f9028d2e 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.command.ExecStartCmd; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.InputStream; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecStartCmd; + public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { private String execId; @@ -24,7 +25,7 @@ public String getExecId() { @Override public ExecStartCmd withExecId(String execId) { - Preconditions.checkNotNull(execId, "execId was not specified"); + checkNotNull(execId, "execId was not specified"); this.execId = execId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index 0fd55b761..f48101b89 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.google.common.base.Preconditions; - /** * Inspect the details of a container. */ @@ -25,7 +25,7 @@ public String getContainerId() { @Override public InspectContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index b52b15d53..11a0ea7f5 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -1,10 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; -import com.google.common.base.Preconditions; /** * Inspect the details of an image. @@ -25,7 +26,7 @@ public String getImageId() { @Override public InspectImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index f8ca070fc..ccc7b58b0 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -1,9 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; -import com.google.common.base.Preconditions; /** * Kill a running container. @@ -29,14 +30,14 @@ public String getSignal() { @Override public KillContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public KillContainerCmd withSignal(String signal) { - Preconditions.checkNotNull(signal, "signal was not specified"); + checkNotNull(signal, "signal was not specified"); this.signal = signal; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index c2ebd4911..5bfe61afe 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -1,11 +1,13 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -import com.google.common.base.Preconditions; /** * List containers @@ -68,21 +70,21 @@ public ListContainersCmd withShowSize(boolean showSize) { @Override public ListContainersCmd withLimit(int limit) { - Preconditions.checkArgument(limit > 0, "limit must be greater 0"); + checkArgument(limit > 0, "limit must be greater 0"); this.limit = limit; return this; } @Override public ListContainersCmd withSince(String since) { - Preconditions.checkNotNull(since, "since was not specified"); + checkNotNull(since, "since was not specified"); this.sinceId = since; return this; } @Override public ListContainersCmd withBefore(String before) { - Preconditions.checkNotNull(before, "before was not specified"); + checkNotNull(before, "before was not specified"); this.beforeId = before; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 451a0ac57..01c5eb01a 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; -import com.google.common.base.Preconditions; - /** * List images * @@ -41,7 +41,7 @@ public ListImagesCmd withShowAll(boolean showAll) { @Override public ListImagesCmd withFilters(String filter) { - Preconditions.checkNotNull(filter, "filters have not been specified"); + checkNotNull(filter, "filters have not been specified"); this.filters = filter; return this; } 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 26c9a3b03..b71a149c9 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.LogContainerCmd; -import com.google.common.base.Preconditions; - /** * Get container logs * @@ -67,7 +67,7 @@ public boolean hasStderrEnabled() { @Override public LogContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index fa6b816f7..4d8702b11 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PauseContainerCmd; -import com.google.common.base.Preconditions; - /** * Pause a container. * @@ -27,7 +27,7 @@ public String getContainerId() { @Override public PauseContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index bcd3613b4..b4cde7947 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; import java.io.InputStream; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; + /** * * Pull image from repository. @@ -37,21 +38,21 @@ public String getRegistry() { @Override public PullImageCmd withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @Override public PullImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } @Override public PullImageCmd withRegistry(String registry) { - Preconditions.checkNotNull(registry, "registry was not specified"); + checkNotNull(registry, "registry was not specified"); this.registry = registry; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 56f587158..2a2795503 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.InputStream; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PushImageCmd; -import com.google.common.base.Preconditions; - /** * Push the latest image to the repository. * @@ -37,7 +37,7 @@ public String getTag() { */ @Override public PushImageCmd withName(String name) { - Preconditions.checkNotNull(name, "name was not specified"); + checkNotNull(name, "name was not specified"); this.name = name; return this; } @@ -47,7 +47,7 @@ public PushImageCmd withName(String name) { */ @Override public PushImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 31344fdb7..84d7cc12f 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.google.common.base.Preconditions; - /** * Remove a container. * @@ -39,7 +39,7 @@ public boolean hasForceEnabled() { @Override public RemoveContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index dda905fe7..6e7f4fb17 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; -import com.google.common.base.Preconditions; - /** * * Remove an image, deleting any tags it might have. @@ -38,7 +38,7 @@ public boolean hasNoPruneEnabled() { @Override public RemoveImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index f82a65b62..0f105e53b 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -1,10 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RestartContainerCmd; -import com.google.common.base.Preconditions; - /** * Restart a running container. * @@ -34,14 +35,14 @@ public int getTimeout() { @Override public RestartContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public RestartContainerCmd withtTimeout(int timeout) { - Preconditions.checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 3ca878f18..7462cdbdc 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -1,12 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.util.List; import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; -import com.google.common.base.Preconditions; - /** * Search images * @@ -29,7 +29,7 @@ public String getTerm() { @Override public SearchImagesCmd withTerm(String term) { - Preconditions.checkNotNull(term, "term was not specified"); + checkNotNull(term, "term was not specified"); this.term = term; return this; } 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 63ff4ff0e..1ca2124db 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; +import static com.github.dockerjava.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; @@ -20,7 +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.google.common.base.Preconditions; + /** * Start a container @@ -158,7 +159,7 @@ public Capability[] getCapDrop() { @Override @JsonIgnore public StartContainerCmd withBinds(Bind... binds) { - Preconditions.checkNotNull(binds, "binds was not specified"); + checkNotNull(binds, "binds was not specified"); this.binds = new Binds(binds); return this; } @@ -166,21 +167,21 @@ public StartContainerCmd withBinds(Bind... binds) { @Override @JsonIgnore public StartContainerCmd withLinks(Link... links) { - Preconditions.checkNotNull(links, "links was not specified"); + checkNotNull(links, "links was not specified"); this.links = new Links(links); return this; } @Override public StartContainerCmd withLxcConf(LxcConf... lxcConf) { - Preconditions.checkNotNull(lxcConf, "lxcConf was not specified"); + checkNotNull(lxcConf, "lxcConf was not specified"); this.lxcConf = lxcConf; return this; } @Override public StartContainerCmd withPortBindings(Ports portBindings) { - Preconditions.checkNotNull(portBindings, + checkNotNull(portBindings, "portBindings was not specified"); this.portBindings = portBindings; return this; @@ -188,7 +189,7 @@ public StartContainerCmd withPortBindings(Ports portBindings) { @Override public StartContainerCmd withPortBindings(PortBinding... portBindings) { - Preconditions.checkNotNull(portBindings, "portBindings was not specified"); + checkNotNull(portBindings, "portBindings was not specified"); if (this.portBindings == null) { this.portBindings = new Ports(); } @@ -210,65 +211,63 @@ public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts) { @Override public StartContainerCmd withDns(String... dns) { - Preconditions.checkNotNull(dns, "dns was not specified"); + checkNotNull(dns, "dns was not specified"); this.dns = dns; return this; } @Override public StartContainerCmd withDnsSearch(String... dnsSearch) { - Preconditions.checkNotNull(dnsSearch, "dnsSearch was not specified"); + checkNotNull(dnsSearch, "dnsSearch was not specified"); this.dnsSearch = dnsSearch; return this; } @Override public StartContainerCmd withVolumesFrom(String volumesFrom) { - Preconditions - .checkNotNull(volumesFrom, "volumesFrom was not specified"); + checkNotNull(volumesFrom, "volumesFrom was not specified"); this.volumesFrom = volumesFrom; return this; } @Override public StartContainerCmd withContainerId(String containerId) { - Preconditions - .checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public StartContainerCmd withNetworkMode(String networkMode) { - Preconditions.checkNotNull(networkMode, "networkMode was not specified"); + checkNotNull(networkMode, "networkMode was not specified"); this.networkMode = networkMode; return this; } @Override public StartContainerCmd withDevices(Device... devices) { - Preconditions.checkNotNull(devices, "devices was not specified"); + checkNotNull(devices, "devices was not specified"); this.devices = devices; return this; } @Override public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - Preconditions.checkNotNull(restartPolicy, "restartPolicy was not specified"); + checkNotNull(restartPolicy, "restartPolicy was not specified"); this.restartPolicy = restartPolicy; return this; } @Override public StartContainerCmd withCapAdd(Capability... capAdd) { - Preconditions.checkNotNull(capAdd, "capAdd was not specified"); + checkNotNull(capAdd, "capAdd was not specified"); this.capAdd = capAdd; return this; } @Override public StartContainerCmd withCapDrop(Capability... capDrop) { - Preconditions.checkNotNull(capDrop, "capDrop was not specified"); + checkNotNull(capDrop, "capDrop was not specified"); this.capDrop = capDrop; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 7033cad6b..26372b9fc 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkArgument; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; import com.github.dockerjava.api.command.StopContainerCmd; -import com.google.common.base.Preconditions; - /** * Stop a running container. * @@ -36,14 +37,14 @@ public int getTimeout() { @Override public StopContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @Override public StopContainerCmd withTimeout(int timeout) { - Preconditions.checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index fe981218a..cdcc74502 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -1,8 +1,9 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.command.TagImageCmd; -import com.google.common.base.Preconditions; /** * Tag an image into a repository @@ -47,21 +48,21 @@ public boolean hasForceEnabled() { @Override public TagImageCmd withImageId(String imageId) { - Preconditions.checkNotNull(imageId, "imageId was not specified"); + checkNotNull(imageId, "imageId was not specified"); this.imageId = imageId; return this; } @Override public TagImageCmd withRepository(String repository) { - Preconditions.checkNotNull(repository, "repository was not specified"); + checkNotNull(repository, "repository was not specified"); this.repository = repository; return this; } @Override public TagImageCmd withTag(String tag) { - Preconditions.checkNotNull(tag, "tag was not specified"); + checkNotNull(tag, "tag was not specified"); this.tag = tag; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 92b825231..c49698cf7 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; -import com.google.common.base.Preconditions; - /** * List processes running inside a container */ @@ -32,7 +32,7 @@ public String getPsArgs() { @Override public TopContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -40,7 +40,7 @@ public TopContainerCmd withContainerId(String containerId) { @Override public TopContainerCmd withPsArgs(String psArgs) { - Preconditions.checkNotNull(psArgs, "psArgs was not specified"); + checkNotNull(psArgs, "psArgs was not specified"); this.psArgs = psArgs; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 3ecc0acb3..97d12eaa6 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.UnpauseContainerCmd; -import com.google.common.base.Preconditions; - /** * Unpause a container. * @@ -27,7 +27,7 @@ public String getContainerId() { @Override public UnpauseContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index 80baf2cc1..c5952e53b 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -1,7 +1,8 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.Preconditions.checkNotNull; + import com.github.dockerjava.api.command.WaitContainerCmd; -import com.google.common.base.Preconditions; /** * Wait a container @@ -24,7 +25,7 @@ public String getContainerId() { @Override public WaitContainerCmd withContainerId(String containerId) { - Preconditions.checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 727055f96..4e63d8a4a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -1,5 +1,7 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.Preconditions.checkNotNull; + import java.io.IOException; import javax.ws.rs.ProcessingException; @@ -8,21 +10,18 @@ import org.apache.commons.codec.binary.Base64; import com.fasterxml.jackson.databind.ObjectMapper; - import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -import com.google.common.base.Preconditions; - public abstract class AbstrDockerCmdExec, RES_T> implements DockerCmdExec { private WebTarget baseResource; public AbstrDockerCmdExec(WebTarget baseResource) { - Preconditions.checkNotNull(baseResource, + checkNotNull(baseResource, "baseResource was not specified"); this.baseResource = baseResource; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java index a4adb1bb7..23d6d1ab9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -22,10 +22,6 @@ -import com.google.common.collect.Queues; - -import org.newsclub.net.unix.AFUNIXSocket; - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -34,8 +30,11 @@ import java.net.SocketAddress; import java.net.SocketException; import java.nio.channels.SocketChannel; +import java.util.ArrayDeque; import java.util.Queue; +import org.newsclub.net.unix.AFUNIXSocket; + /** * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options * until the socket is connected. This is necessary because the Apache HTTP client attempts to @@ -50,7 +49,7 @@ public class ApacheUnixSocket extends Socket { private final AFUNIXSocket inner; - private final Queue optionsToSet = Queues.newArrayDeque(); + private final Queue optionsToSet = new ArrayDeque(); public ApacheUnixSocket() throws IOException { this.inner = AFUNIXSocket.newInstance(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index c91b0d565..3f59a2839 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,13 +1,16 @@ package com.github.dockerjava.jaxrs; -import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.api.command.*; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.util.JsonClientFilter; -import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; -import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; -import com.google.common.base.Preconditions; +import static com.github.dockerjava.Preconditions.checkNotNull; + +import java.io.IOException; +import java.net.URI; +import java.util.logging.Logger; + +import javax.net.ssl.SSLContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; + import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; @@ -19,13 +22,46 @@ import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; -import javax.net.ssl.SSLContext; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import java.io.IOException; -import java.net.URI; -import java.util.logging.Logger; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; +import com.github.dockerjava.api.DockerClientException; +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.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.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +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.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.JsonClientFilter; +import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; +import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -35,7 +71,7 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @Override public void init(DockerClientConfig dockerClientConfig) { - Preconditions.checkNotNull(dockerClientConfig, "config was not specified"); + checkNotNull(dockerClientConfig, "config was not specified"); ClientConfig clientConfig = new ClientConfig(); clientConfig.connectorProvider(new ApacheConnectorProvider()); @@ -99,7 +135,7 @@ private org.apache.http.config.Registry getSchemeRegist } protected WebTarget getBaseResource() { - Preconditions.checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); return baseResource; } @@ -270,7 +306,7 @@ public EventsCmd.Exec createEventsCmdExec() { @Override public void close() throws IOException { - Preconditions.checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); + checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); client.close(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index ffd757e93..ba15e995a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,10 +1,18 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.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; @@ -12,13 +20,6 @@ import com.github.dockerjava.api.command.EventCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.google.common.base.Preconditions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); @@ -54,8 +55,8 @@ private EventNotifier(EventCallback eventCallback, WebTarget webTarget) { } public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) { - Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided"); - Preconditions.checkNotNull(webTarget, "An WebTarget must be provided"); + checkNotNull(eventCallback, "An EventCallback must be provided"); + checkNotNull(webTarget, "An WebTarget must be provided"); return new EventNotifier(eventCallback, webTarget); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 1fe38617c..84ede89b4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -1,20 +1,19 @@ package com.github.dockerjava.jaxrs; +import static com.github.dockerjava.jaxrs.util.guava.Guava.urlPathSegmentEscaper; + import java.util.List; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; -import com.google.common.net.UrlEscapers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; -import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; - public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java index 7f7e06c73..42898008f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java @@ -1,6 +1,8 @@ package com.github.dockerjava.jaxrs.util; import java.io.IOException; +import java.util.Collections; +import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; @@ -8,8 +10,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import com.google.common.collect.ImmutableSet; - import org.glassfish.jersey.filter.LoggingFilter; /** @@ -21,10 +21,15 @@ */ public class SelectiveLoggingFilter extends LoggingFilter { - private static final Set SKIPPED_CONTENT = ImmutableSet.builder() - .add(MediaType.APPLICATION_OCTET_STREAM) - .add("application/tar") - .build(); + // Immutable'ish + private static final Set SKIPPED_CONTENT; + static { + Set s = new HashSet(); + s.add(MediaType.APPLICATION_OCTET_STREAM); + s.add("application/tar"); + SKIPPED_CONTENT = Collections.unmodifiableSet(s); + } + public SelectiveLoggingFilter(Logger logger, boolean b) { super(logger, b); diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java new file mode 100644 index 000000000..13f87142a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * 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.jaxrs.util.guava; + +public class Guava { + + static final String URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS = + "-._~" + // Unreserved characters. + "!$'()*,;&=" + // The subdelim characters (excluding '+'). + "@:"; // The gendelim characters permitted in paths. + + public static PercentEscaper urlPathSegmentEscaper() { + return URL_PATH_SEGMENT_ESCAPER; + } + + private static final PercentEscaper URL_PATH_SEGMENT_ESCAPER = + new PercentEscaper(URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS + "+", false); + + public static String join(String[] joins, String sep, boolean skipNulls) { + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < joins.length; i++) { + if(skipNulls && joins[i] == null) { + continue; + } + sb.append(joins[i]); + if(i < joins.length -1) { + sb.append(sep); + } + } + return sb.toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java new file mode 100644 index 000000000..b8c2b2711 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * 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.jaxrs.util.guava; + +import com.github.dockerjava.Preconditions; + +/** + * A {@code UnicodeEscaper} that escapes some set of Java characters using a + * UTF-8 based percent encoding scheme. The set of safe characters (those which + * remain unescaped) can be specified on construction. + * + *

This class is primarily used for creating URI escapers in UrlEscapers + * but can be used directly if required. While URI escapers impose + * specific semantics on which characters are considered 'safe', this class has + * a minimal set of restrictions. + * + *

When escaping a String, the following rules apply: + *

    + *
  • All specified safe characters remain unchanged. + *
  • If {@code plusForSpace} was specified, the space character " " is + * converted into a plus sign {@code "+"}. + *
  • All other characters are converted into one or more bytes using UTF-8 + * encoding and each byte is then represented by the 3-character string + * "%XX", where "XX" is the two-digit, uppercase, hexadecimal representation + * of the byte value. + *
+ * + *

For performance reasons the only currently supported character encoding of + * this class is UTF-8. + * + *

Note: This escaper produces uppercase hexadecimal sequences. From + * RFC 3986:
+ * "URI producers and normalizers should use uppercase hexadecimal digits + * for all percent-encodings." + * + * @author David Beaumont + * @since 15.0 + */ +public final class PercentEscaper extends UnicodeEscaper { + + // In some escapers spaces are escaped to '+' + private static final char[] PLUS_SIGN = { '+' }; + + // Percent escapers output upper case hex digits (uri escapers require this). + private static final char[] UPPER_HEX_DIGITS = + "0123456789ABCDEF".toCharArray(); + + /** + * If true we should convert space to the {@code +} character. + */ + private final boolean plusForSpace; + + /** + * An array of flags where for any {@code char c} if {@code safeOctets[c]} is + * true then {@code c} should remain unmodified in the output. If + * {@code c > safeOctets.length} then it should be escaped. + */ + private final boolean[] safeOctets; + + /** + * Constructs a percent escaper with the specified safe characters and + * optional handling of the space character. + * + *

Not that it is allowed, but not necessarily desirable to specify {@code %} + * as a safe character. This has the effect of creating an escaper which has no + * well defined inverse but it can be useful when escaping additional characters. + * + * @param safeChars a non null string specifying additional safe characters + * for this escaper (the ranges 0..9, a..z and A..Z are always safe and + * should not be specified here) + * @param plusForSpace true if ASCII space should be escaped to {@code +} + * rather than {@code %20} + * @throws IllegalArgumentException if any of the parameters were invalid + */ + public PercentEscaper(String safeChars, boolean plusForSpace) { + // TODO(user): Switch to static factory methods for creation now that class is final. + // TODO(user): Support escapers where alphanumeric chars are not safe. + Preconditions.checkNotNull(safeChars); // eager for GWT. + // Avoid any misunderstandings about the behavior of this escaper + if (safeChars.matches(".*[0-9A-Za-z].*")) { + throw new IllegalArgumentException( + "Alphanumeric characters are always 'safe' and should not be " + + "explicitly specified"); + } + safeChars += "abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "0123456789"; + // Avoid ambiguous parameters. Safe characters are never modified so if + // space is a safe character then setting plusForSpace is meaningless. + if (plusForSpace && safeChars.contains(" ")) { + throw new IllegalArgumentException( + "plusForSpace cannot be specified when space is a 'safe' character"); + } + this.plusForSpace = plusForSpace; + this.safeOctets = createSafeOctets(safeChars); + } + + /** + * Creates a boolean array with entries corresponding to the character values + * specified in safeChars set to true. The array is as small as is required to + * hold the given character information. + */ + private static boolean[] createSafeOctets(String safeChars) { + int maxChar = -1; + char[] safeCharArray = safeChars.toCharArray(); + for (char c : safeCharArray) { + maxChar = Math.max(c, maxChar); + } + boolean[] octets = new boolean[maxChar + 1]; + for (char c : safeCharArray) { + octets[c] = true; + } + return octets; + } + + /* + * Overridden for performance. For unescaped strings this improved the + * performance of the uri escaper from ~760ns to ~400ns as measured by + * CharEscapersBenchmark. + */ + @Override + protected int nextEscapeIndex(CharSequence csq, int index, int end) { + Preconditions.checkNotNull(csq); + for (; index < end; index++) { + char c = csq.charAt(index); + if (c >= safeOctets.length || !safeOctets[c]) { + break; + } + } + return index; + } + + /* + * Overridden for performance. For unescaped strings this improved the + * performance of the uri escaper from ~400ns to ~170ns as measured by + * CharEscapersBenchmark. + */ + @Override + public String escape(String s) { + Preconditions.checkNotNull(s); + int slen = s.length(); + for (int index = 0; index < slen; index++) { + char c = s.charAt(index); + if (c >= safeOctets.length || !safeOctets[c]) { + return escapeSlow(s, index); + } + } + return s; + } + + /** + * Escapes the given Unicode code point in UTF-8. + */ + @Override + protected char[] escape(int cp) { + // We should never get negative values here but if we do it will throw an + // IndexOutOfBoundsException, so at least it will get spotted. + if (cp < safeOctets.length && safeOctets[cp]) { + return null; + } else if (cp == ' ' && plusForSpace) { + return PLUS_SIGN; + } else if (cp <= 0x7F) { + // Single byte UTF-8 characters + // Start with "%--" and fill in the blanks + char[] dest = new char[3]; + dest[0] = '%'; + dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; + dest[1] = UPPER_HEX_DIGITS[cp >>> 4]; + return dest; + } else if (cp <= 0x7ff) { + // Two byte UTF-8 characters [cp >= 0x80 && cp <= 0x7ff] + // Start with "%--%--" and fill in the blanks + char[] dest = new char[6]; + dest[0] = '%'; + dest[3] = '%'; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[1] = UPPER_HEX_DIGITS[0xC | cp]; + return dest; + } else if (cp <= 0xffff) { + // Three byte UTF-8 characters [cp >= 0x800 && cp <= 0xffff] + // Start with "%E-%--%--" and fill in the blanks + char[] dest = new char[9]; + dest[0] = '%'; + dest[1] = 'E'; + dest[3] = '%'; + dest[6] = '%'; + dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp]; + return dest; + } else if (cp <= 0x10ffff) { + char[] dest = new char[12]; + // Four byte UTF-8 characters [cp >= 0xffff && cp <= 0x10ffff] + // Start with "%F-%--%--%--" and fill in the blanks + dest[0] = '%'; + dest[1] = 'F'; + dest[3] = '%'; + dest[6] = '%'; + dest[9] = '%'; + dest[11] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[10] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; + cp >>>= 4; + dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; + cp >>>= 2; + dest[2] = UPPER_HEX_DIGITS[cp & 0x7]; + return dest; + } else { + // If this ever happens it is due to bug in UnicodeEscaper, not bad input. + throw new IllegalArgumentException( + "Invalid unicode character value " + cp); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java new file mode 100644 index 000000000..a58239484 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java @@ -0,0 +1,304 @@ +/* + * Copyright (C) 2008 The Guava Authors + * + * 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.jaxrs.util.guava; + + +import com.github.dockerjava.Preconditions; + +/** + * An Escaper that converts literal text into a format safe for + * inclusion in a particular context (such as an XML document). Typically (but + * not always), the inverse process of "unescaping" the text is performed + * automatically by the relevant parser. + * + *

For example, an XML escaper would convert the literal string {@code + * "Foo"} into {@code "Foo<Bar>"} to prevent {@code ""} from + * being confused with an XML tag. When the resulting XML document is parsed, + * the parser API will return this text as the original literal string {@code + * "Foo"}. + * + *

Note: This class is similar to CharEscaper but with one + * very important difference. A CharEscaper can only process Java + * UTF16 characters in + * isolation and may not cope when it encounters surrogate pairs. This class + * facilitates the correct escaping of all Unicode characters. + * + *

As there are important reasons, including potential security issues, to + * handle Unicode correctly if you are considering implementing a new escaper + * you should favor using UnicodeEscaper wherever possible. + * + *

A {@code UnicodeEscaper} instance is required to be stateless, and safe + * when used concurrently by multiple threads. + * + *

Several popular escapers are defined as constants in classes like + * com.google.common.html.HtmlEscapers, com.google.common.xml.XmlEscapers, + * and SourceCodeEscapers. To create + * your own escapers extend this class and implement the #escape(int) + * method. + * + * @author David Beaumont + * @since 15.0 + */ +public abstract class UnicodeEscaper { + /** The amount of padding (chars) to use when growing the escape buffer. */ + private static final int DEST_PAD = 32; + + /** Constructor for use by subclasses. */ + protected UnicodeEscaper() {} + + /** + * Returns the escaped form of the given Unicode code point, or {@code null} + * if this code point does not need to be escaped. When called as part of an + * escaping operation, the given code point is guaranteed to be in the range + * {@code 0 <= cp <= Character#MAX_CODE_POINT}. + * + *

If an empty array is returned, this effectively strips the input + * character from the resulting text. + * + *

If the character does not need to be escaped, this method should return + * {@code null}, rather than an array containing the character representation + * of the code point. This enables the escaping algorithm to perform more + * efficiently. + * + *

If the implementation of this method cannot correctly handle a + * particular code point then it should either throw an appropriate runtime + * exception or return a suitable replacement character. It must never + * silently discard invalid input as this may constitute a security risk. + * + * @param cp the Unicode code point to escape if necessary + * @return the replacement characters, or {@code null} if no escaping was + * needed + */ + protected abstract char[] escape(int cp); + + /** + * Scans a sub-sequence of characters from a given CharSequence, + * returning the index of the next character that requires escaping. + * + *

Note: When implementing an escaper, it is a good idea to override + * this method for efficiency. The base class implementation determines + * successive Unicode code points and invokes #escape(int) for each of + * them. If the semantics of your escaper are such that code points in the + * supplementary range are either all escaped or all unescaped, this method + * can be implemented more efficiently using CharSequence#charAt(int). + * + *

Note however that if your escaper does not escape characters in the + * supplementary range, you should either continue to validate the correctness + * of any surrogate characters encountered or provide a clear warning to users + * that your escaper does not validate its input. + * + *

See com.google.common.net.PercentEscaper for an example. + * + * @param csq a sequence of characters + * @param start the index of the first character to be scanned + * @param end the index immediately after the last character to be scanned + * @throws IllegalArgumentException if the scanned sub-sequence of {@code csq} + * contains invalid surrogate pairs + */ + protected int nextEscapeIndex(CharSequence csq, int start, int end) { + int index = start; + while (index < end) { + int cp = codePointAt(csq, index, end); + if (cp < 0 || escape(cp) != null) { + break; + } + index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; + } + return index; + } + + /** + * Returns the escaped form of a given literal string. + * + *

If you are escaping input in arbitrary successive chunks, then it is not + * generally safe to use this method. If an input string ends with an + * unmatched high surrogate character, then this method will throw + * IllegalArgumentException. You should ensure your input is valid UTF-16 before calling this + * method. + * + *

Note: When implementing an escaper it is a good idea to override + * this method for efficiency by inlining the implementation of + * #nextEscapeIndex(CharSequence, int, int) directly. Doing this for + * com.google.common.net.PercentEscaper more than doubled the + * performance for unescaped strings (as measured by CharEscapersBenchmark}. + * + * @param string the literal string to be escaped + * @return the escaped form of {@code string} + * @throws NullPointerException if {@code string} is null + * @throws IllegalArgumentException if invalid surrogate characters are + * encountered + */ + public String escape(String string) { + Preconditions.checkNotNull(string); + int end = string.length(); + int index = nextEscapeIndex(string, 0, end); + return index == end ? string : escapeSlow(string, index); + } + + /** + * Returns the escaped form of a given literal string, starting at the given + * index. This method is called by the #escape(String) method when it + * discovers that escaping is required. It is protected to allow subclasses + * to override the fastpath escaping function to inline their escaping test. + * See CharEscaperBuilder for an example usage. + * + *

This method is not reentrant and may only be invoked by the top level + * #escape(String) method. + * + * @param s the literal string to be escaped + * @param index the index to start escaping from + * @return the escaped form of {@code string} + * @throws NullPointerException if {@code string} is null + * @throws IllegalArgumentException if invalid surrogate characters are + * encountered + */ + protected final String escapeSlow(String s, int index) { + int end = s.length(); + + // Get a destination buffer and setup some loop variables. + char[] dest = new char[1024]; + int destIndex = 0; + int unescapedChunkStart = 0; + + while (index < end) { + int cp = codePointAt(s, index, end); + if (cp < 0) { + throw new IllegalArgumentException( + "Trailing high surrogate at end of input"); + } + // It is possible for this to return null because nextEscapeIndex() may + // (for performance reasons) yield some false positives but it must never + // give false negatives. + char[] escaped = escape(cp); + int nextIndex = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); + if (escaped != null) { + int charsSkipped = index - unescapedChunkStart; + + // This is the size needed to add the replacement, not the full + // size needed by the string. We only regrow when we absolutely must. + int sizeNeeded = destIndex + charsSkipped + escaped.length; + if (dest.length < sizeNeeded) { + int destLength = sizeNeeded + (end - index) + DEST_PAD; + dest = growBuffer(dest, destIndex, destLength); + } + // If we have skipped any characters, we need to copy them now. + if (charsSkipped > 0) { + s.getChars(unescapedChunkStart, index, dest, destIndex); + destIndex += charsSkipped; + } + if (escaped.length > 0) { + System.arraycopy(escaped, 0, dest, destIndex, escaped.length); + destIndex += escaped.length; + } + // If we dealt with an escaped character, reset the unescaped range. + unescapedChunkStart = nextIndex; + } + index = nextEscapeIndex(s, nextIndex, end); + } + + // Process trailing unescaped characters - no need to account for escaped + // length or padding the allocation. + int charsSkipped = end - unescapedChunkStart; + if (charsSkipped > 0) { + int endIndex = destIndex + charsSkipped; + if (dest.length < endIndex) { + dest = growBuffer(dest, destIndex, endIndex); + } + s.getChars(unescapedChunkStart, end, dest, destIndex); + destIndex = endIndex; + } + return new String(dest, 0, destIndex); + } + + /** + * Returns the Unicode code point of the character at the given index. + * + *

Unlike Character#codePointAt(CharSequence, int) or + * String#codePointAt(int) this method will never fail silently when + * encountering an invalid surrogate pair. + * + *

The behaviour of this method is as follows: + *

    + *
  1. If {@code index >= end}, IndexOutOfBoundsException is thrown. + *
  2. If the character at the specified index is not a surrogate, it is + * returned. + *
  3. If the first character was a high surrogate value, then an attempt is + * made to read the next character. + *
      + *
    1. If the end of the sequence was reached, the negated value of + * the trailing high surrogate is returned. + *
    2. If the next character was a valid low surrogate, the code point + * value of the high/low surrogate pair is returned. + *
    3. If the next character was not a low surrogate value, then + * IllegalArgumentException is thrown. + *
    + *
  4. If the first character was a low surrogate value, + * IllegalArgumentException is thrown. + *
+ * + * @param seq the sequence of characters from which to decode the code point + * @param index the index of the first character to decode + * @param end the index beyond the last valid character to decode + * @return the Unicode code point for the given index or the negated value of + * the trailing high surrogate character at the end of the sequence + */ + protected static int codePointAt(CharSequence seq, int index, int end) { + Preconditions.checkNotNull(seq); + if (index < end) { + char c1 = seq.charAt(index++); + if (c1 < Character.MIN_HIGH_SURROGATE || + c1 > Character.MAX_LOW_SURROGATE) { + // Fast path (first test is probably all we need to do) + return c1; + } else if (c1 <= Character.MAX_HIGH_SURROGATE) { + // If the high surrogate was the last character, return its inverse + if (index == end) { + return -c1; + } + // Otherwise look for the low surrogate following it + char c2 = seq.charAt(index); + if (Character.isLowSurrogate(c2)) { + return Character.toCodePoint(c1, c2); + } + throw new IllegalArgumentException( + "Expected low surrogate but got char '" + c2 + + "' with value " + (int) c2 + " at index " + index + + " in '" + seq + "'"); + } else { + throw new IllegalArgumentException( + "Unexpected low surrogate character '" + c1 + + "' with value " + (int) c1 + " at index " + (index - 1) + + " in '" + seq + "'"); + } + } + throw new IndexOutOfBoundsException("Index exceeds specified range"); + } + + /** + * Helper method to grow the character buffer as needed, this only happens + * once in a while so it's ok if it's in a method call. If the index passed + * in is 0 then no copying will be done. + */ + private static char[] growBuffer(char[] dest, int index, int size) { + char[] copy = new char[size]; + if (index > 0) { + System.arraycopy(dest, 0, copy, 0, index); + } + return copy; + } +} From 6c4ab6a18e00a8cd97e03d49d4681610a6b7e526 Mon Sep 17 00:00:00 2001 From: Aslak Knutsen Date: Tue, 27 Jan 2015 17:32:44 +0100 Subject: [PATCH 0049/1399] Update to latest unix-socket-factory * Removes transitive dep on groovy-all --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a9af78d9..4bc6b7193 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 0.3 18.0 1.51 - 2014-11-16T14-41-27 + 2015-01-27T15-02-14 1.0.1 From a19dc6b6a30615e1f1b9361193e98b47c08ac5bc Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 27 Jan 2015 20:27:00 +0100 Subject: [PATCH 0050/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b0d2c6c2..fbf6d65cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Change Log docker-java-0.10.6-SNAPSHOT --- + * [#135](https://github.com/docker-java/docker-java/pull/135) Update to latest unix-socket-factory + * [#134](https://github.com/docker-java/docker-java/pull/134) Remove Google Guava as dependency * [#128](https://github.com/docker-java/docker-java/pull/128) Allow unauthorized pullImageCmd docker-java-0.10.5 From 5a7e79c0f7750d0e5ddc3937c493138d2bbd8ffe Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 27 Jan 2015 21:33:24 +0100 Subject: [PATCH 0051/1399] Fix some CFX interoperability issues --- .../command/CopyFileFromContainerCmdImpl.java | 14 - .../jaxrs/AttachContainerCmdExec.java | 33 +- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 5 +- .../dockerjava/jaxrs/ExecStartCmdExec.java | 5 +- .../jaxrs/KillContainerCmdExec.java | 19 +- .../jaxrs/PauseContainerCmdExec.java | 21 +- .../dockerjava/jaxrs/PullImageCmdExec.java | 52 +-- .../dockerjava/jaxrs/PushImageCmdExec.java | 29 +- .../jaxrs/RestartContainerCmdExec.java | 16 +- .../jaxrs/StopContainerCmdExec.java | 13 +- .../dockerjava/jaxrs/TagImageCmdExec.java | 6 +- .../jaxrs/WaitContainerCmdExec.java | 4 +- .../dockerjava/jaxrs/util/LoggingFilter.java | 330 ++++++++++++++++++ .../jaxrs/util/SelectiveLoggingFilter.java | 1 - 14 files changed, 436 insertions(+), 112 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 2d91bb72e..fe1a57b62 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -84,18 +84,4 @@ public String toString() { public InputStream exec() throws NotFoundException { return super.exec(); } - -// protected InputStream impl() throws DockerException { -// -// CopyFileFromContainerCmd command = this; -// -// WebTarget webResource = -// baseResource.path("/containers/{id}/copy").resolveTemplate("id", command.getContainerId()); -// -// LOGGER.trace("POST: " + webResource.toString()); -// -// return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); -// } - - } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 5ed84c341..1fafd1f0e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import java.io.InputStream; import javax.ws.rs.client.WebTarget; @@ -13,29 +11,34 @@ import com.github.dockerjava.api.command.AttachContainerCmd; -public class AttachContainerCmdExec extends AbstrDockerCmdExec implements AttachContainerCmd.Exec { - +public class AttachContainerCmdExec extends + AbstrDockerCmdExec implements + AttachContainerCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(AttachContainerCmdExec.class); - + public AttachContainerCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected InputStream execute(AttachContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()) - .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") - // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); + WebTarget webResource = getBaseResource() + .path("/containers/{id}/attach") + .resolveTemplate("id", command.getContainerId()) + .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") + // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("stream", + command.hasFollowStreamEnabled() ? "1" : "0"); LOGGER.trace("POST: {}", webResource); - - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(null, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + + return webResource.request() + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(null, Response.class).readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index 69346efd5..02ea4d8ae 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -25,6 +25,9 @@ protected ExecCreateCmdResponse execute(ExecCreateCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); + return webResource + .request() + .accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index ae4c71816..effd39045 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -26,6 +26,9 @@ protected InputStream execute(ExecStartCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + return webResource + .request() + .accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index 28496edc9..21a6b9d67 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,25 +8,28 @@ import com.github.dockerjava.api.command.KillContainerCmd; -public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { - +public class KillContainerCmdExec extends + AbstrDockerCmdExec implements + KillContainerCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(KillContainerCmdExec.class); - + public KillContainerCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected Void execute(KillContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/kill").resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/kill") + .resolveTemplate("id", command.getContainerId()); - if(command.getSignal() != null) { + if (command.getSignal() != null) { webResource = webResource.queryParam("signal", command.getSignal()); } - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index ee84a3209..6b3eeaf08 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -1,19 +1,19 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - 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.PauseContainerCmd; -public class PauseContainerCmdExec extends AbstrDockerCmdExec implements PauseContainerCmd.Exec { +public class PauseContainerCmdExec extends + AbstrDockerCmdExec implements + PauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(PauseContainerCmdExec.class); public PauseContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -21,13 +21,12 @@ public PauseContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(PauseContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/pause") - .resolveTemplate("id", command.getContainerId()); - + WebTarget webResource = getBaseResource() + .path("/containers/{id}/pause").resolveTemplate("id", + command.getContainerId()); + LOGGER.trace("POST: {}", webResource); - webResource.request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(null, MediaType.APPLICATION_JSON), Response.class); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index dea72f429..725483f85 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -1,22 +1,24 @@ package com.github.dockerjava.jaxrs; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.model.AuthConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.InputStream; 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.InputStream; -import static javax.ws.rs.client.Entity.entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; + +public class PullImageCmdExec extends + AbstrDockerCmdExec implements + PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PullImageCmdExec.class); -public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); - public PullImageCmdExec(WebTarget baseResource) { super(baseResource); } @@ -24,22 +26,24 @@ public PullImageCmdExec(WebTarget baseResource) { @Override protected InputStream execute(PullImageCmd command) { WebTarget webResource = getBaseResource().path("/images/create") - .queryParam("tag", command.getTag()) - .queryParam("fromImage", command.getRepository()) - .queryParam("registry", command.getRegistry()); + .queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()) + .queryParam("registry", command.getRegistry()); LOGGER.trace("POST: {}", webResource); - return resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(Response.class, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); + return resourceWithOptionalAuthConfig(command, webResource.request()) + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null) + .readEntity(InputStream.class); } - private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { - AuthConfig authConfig = command.getAuthConfig(); - if (authConfig != null) { - request = request.header("X-Registry-Auth", registryAuth(authConfig)); - } - return request; - } + private Invocation.Builder resourceWithOptionalAuthConfig( + PullImageCmd command, Invocation.Builder request) { + AuthConfig authConfig = command.getAuthConfig(); + if (authConfig != null) { + request = request.header("X-Registry-Auth", + registryAuth(authConfig)); + } + return request; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 9454a0e73..b970d42fc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,12 +1,9 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - 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; @@ -14,28 +11,30 @@ import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.model.AuthConfig; -public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); - +public class PushImageCmdExec extends + AbstrDockerCmdExec implements + PushImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(PushImageCmdExec.class); + public PushImageCmdExec(WebTarget baseResource) { super(baseResource); } @Override protected InputStream execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push") - .queryParam("tag", command.getTag()); + WebTarget webResource = getBaseResource().path( + "/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); final String registryAuth = registryAuth(command.getAuthConfig()); LOGGER.trace("POST: {}", webResource); - return webResource - .request() - .header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON) - .post(entity(Response.class, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); + return webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON).post(null) + .readEntity(InputStream.class); } - + private String name(PushImageCmd command) { String name = command.getName(); AuthConfig authConfig = command.getAuthConfig(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index fe544f134..b08aa0328 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,9 +8,12 @@ import com.github.dockerjava.api.command.RestartContainerCmd; -public class RestartContainerCmdExec extends AbstrDockerCmdExec implements RestartContainerCmd.Exec { +public class RestartContainerCmdExec extends + AbstrDockerCmdExec implements + RestartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(RestartContainerCmdExec.class); public RestartContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -20,12 +21,13 @@ public RestartContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(RestartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/restart") + WebTarget webResource = getBaseResource() + .path("/containers/{id}/restart") .resolveTemplate("id", command.getContainerId()) .queryParam("t", String.valueOf(command.getTimeout())); - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON_TYPE)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index 337c71b2e..956f3d0b7 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -10,9 +8,12 @@ import com.github.dockerjava.api.command.StopContainerCmd; -public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { +public class StopContainerCmdExec extends + AbstrDockerCmdExec implements + StopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory + .getLogger(StopContainerCmdExec.class); public StopContainerCmdExec(WebTarget baseResource) { super(baseResource); @@ -23,9 +24,9 @@ protected Void execute(StopContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/stop") .resolveTemplate("id", command.getContainerId()) .queryParam("t", String.valueOf(command.getTimeout())); - + LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(null, MediaType.APPLICATION_JSON)); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index d8545e339..b1c770bab 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -1,10 +1,6 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - 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; @@ -28,7 +24,7 @@ protected Void execute(TagImageCmd command) { .queryParam("force", command.hasForceEnabled() ? "1" : "0"); LOGGER.trace("POST: {}", webResource); - webResource.request().post(entity(null, MediaType.APPLICATION_JSON), Response.class); + webResource.request().post(null); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index e6f95586c..1b81eee33 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -27,7 +25,7 @@ protected Integer execute(WaitContainerCmd command) { LOGGER.trace("POST: {}", webResource); ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON) - .post(entity(null, MediaType.TEXT_PLAIN), ObjectNode.class); + .post(null, ObjectNode.class); return ObjectNode.get("StatusCode").asInt(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java new file mode 100644 index 000000000..5a37720ad --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java @@ -0,0 +1,330 @@ +package com.github.dockerjava.jaxrs.util; + +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2011-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.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Logger; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.WriterInterceptor; +import javax.ws.rs.ext.WriterInterceptorContext; + +import javax.annotation.Priority; + + +/** + * Universal logging filter. + * + * Can be used on client or server side. Has the highest priority. + * + * @author Pavel Bucek (pavel.bucek at oracle.com) + * @author Martin Matula (martin.matula at oracle.com) + */ +@PreMatching +@Priority(Integer.MIN_VALUE) +@SuppressWarnings("ClassWithMultipleLoggers") +public class LoggingFilter implements ContainerRequestFilter, ClientRequestFilter, ContainerResponseFilter, + ClientResponseFilter, WriterInterceptor { + + private static final Logger LOGGER = Logger.getLogger(LoggingFilter.class.getName()); + private static final String NOTIFICATION_PREFIX = "* "; + private static final String REQUEST_PREFIX = "> "; + private static final String RESPONSE_PREFIX = "< "; + private static final String ENTITY_LOGGER_PROPERTY = LoggingFilter.class.getName() + ".entityLogger"; + + private static final Comparator>> COMPARATOR = + new Comparator>>() { + + @Override + public int compare(final Map.Entry> o1, final Map.Entry> o2) { + return o1.getKey().compareToIgnoreCase(o2.getKey()); + } + }; + + private static final int DEFAULT_MAX_ENTITY_SIZE = 8 * 1024; + + // + @SuppressWarnings("NonConstantLogger") + private final Logger logger; + private final AtomicLong _id = new AtomicLong(0); + private final boolean printEntity; + private final int maxEntitySize; + + /** + * Create a logging filter logging the request and response to a default JDK + * logger, named as the fully qualified class name of this class. Entity + * logging is turned off by default. + */ + public LoggingFilter() { + this(LOGGER, false); + } + + /** + * Create a logging filter with custom logger and custom settings of entity + * logging. + * + * @param logger the logger to log requests and responses. + * @param printEntity if true, entity will be logged as well up to the default maxEntitySize, which is 8KB + */ + @SuppressWarnings("BooleanParameter") + public LoggingFilter(final Logger logger, final boolean printEntity) { + this.logger = logger; + this.printEntity = printEntity; + this.maxEntitySize = DEFAULT_MAX_ENTITY_SIZE; + } + + /** + * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size + * of entity to be buffered and logged. + * + * @param logger the logger to log requests and responses. + * @param maxEntitySize maximum number of entity bytes to be logged (and buffered) - if the entity is larger, + * logging filter will print (and buffer in memory) only the specified number of bytes + * and print "...more..." string at the end. + */ + public LoggingFilter(final Logger logger, final int maxEntitySize) { + this.logger = logger; + this.printEntity = true; + this.maxEntitySize = maxEntitySize; + } + + private void log(final StringBuilder b) { + if (logger != null) { + logger.info(b.toString()); + } + } + + private StringBuilder prefixId(final StringBuilder b, final long id) { + b.append(Long.toString(id)).append(" "); + return b; + } + + private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, final URI uri) { + prefixId(b, id).append(NOTIFICATION_PREFIX) + .append(note) + .append(" on thread ").append(Thread.currentThread().getName()) + .append("\n"); + prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" "). + append(uri.toASCIIString()).append("\n"); + } + + private void printResponseLine(final StringBuilder b, final String note, final long id, final int status) { + prefixId(b, id).append(NOTIFICATION_PREFIX) + .append(note) + .append(" on thread ").append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(RESPONSE_PREFIX). + append(Integer.toString(status)). + append("\n"); + } + + private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, final MultivaluedMap headers) { + for (final Map.Entry> headerEntry : getSortedHeaders(headers.entrySet())) { + final List val = headerEntry.getValue(); + final String header = headerEntry.getKey(); + + if (val.size() == 1) { + prefixId(b, id).append(prefix).append(header).append(": ").append(val.get(0)).append("\n"); + } else { + final StringBuilder sb = new StringBuilder(); + boolean add = false; + for (final Object s : val) { + if (add) { + sb.append(','); + } + add = true; + sb.append(s); + } + prefixId(b, id).append(prefix).append(header).append(": ").append(sb.toString()).append("\n"); + } + } + } + + private Set>> getSortedHeaders(final Set>> headers) { + final TreeSet>> sortedHeaders = new TreeSet>>(COMPARATOR); + sortedHeaders.addAll(headers); + return sortedHeaders; + } + + private InputStream logInboundEntity(final StringBuilder b, InputStream stream) throws IOException { + if (!stream.markSupported()) { + stream = new BufferedInputStream(stream); + } + stream.mark(maxEntitySize + 1); + final byte[] entity = new byte[maxEntitySize + 1]; + final int entitySize = stream.read(entity); + b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize))); + if (entitySize > maxEntitySize) { + b.append("...more..."); + } + b.append('\n'); + stream.reset(); + return stream; + } + + @Override + public void filter(final ClientRequestContext context) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printRequestLine(b, "Sending client request", id, context.getMethod(), context.getUri()); + printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getStringHeaders()); + + if (printEntity && context.hasEntity()) { + final OutputStream stream = new LoggingStream(b, context.getEntityStream()); + context.setEntityStream(stream); + context.setProperty(ENTITY_LOGGER_PROPERTY, stream); + // not calling log(b) here - it will be called by the interceptor + } else { + log(b); + } + } + + @Override + public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printResponseLine(b, "Client response received", id, responseContext.getStatus()); + printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getHeaders()); + + if (printEntity && responseContext.hasEntity()) { + responseContext.setEntityStream(logInboundEntity(b, responseContext.getEntityStream())); + } + + log(b); + } + + @Override + public void filter(final ContainerRequestContext context) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo().getRequestUri()); + printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getHeaders()); + + if (printEntity && context.hasEntity()) { + context.setEntityStream(logInboundEntity(b, context.getEntityStream())); + } + + log(b); + } + + @Override + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException { + final long id = this._id.incrementAndGet(); + final StringBuilder b = new StringBuilder(); + + printResponseLine(b, "Server responded with a response", id, responseContext.getStatus()); + printPrefixedHeaders(b, id, RESPONSE_PREFIX, responseContext.getStringHeaders()); + + if (printEntity && responseContext.hasEntity()) { + final OutputStream stream = new LoggingStream(b, responseContext.getEntityStream()); + responseContext.setEntityStream(stream); + requestContext.setProperty(ENTITY_LOGGER_PROPERTY, stream); + // not calling log(b) here - it will be called by the interceptor + } else { + log(b); + } + } + + @Override + public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException { + final LoggingStream stream = (LoggingStream) writerInterceptorContext.getProperty(ENTITY_LOGGER_PROPERTY); + writerInterceptorContext.proceed(); + if (stream != null) { + log(stream.getStringBuilder()); + } + } + + private class LoggingStream extends OutputStream { + private final StringBuilder b; + private final OutputStream inner; + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + LoggingStream(final StringBuilder b, final OutputStream inner) { + this.b = b; + this.inner = inner; + } + + StringBuilder getStringBuilder() { + // write entity to the builder + final byte[] entity = baos.toByteArray(); + + b.append(new String(entity, 0, Math.min(entity.length, maxEntitySize))); + if (entity.length > maxEntitySize) { + b.append("...more..."); + } + b.append('\n'); + + return b; + } + + @Override + public void write(final int i) throws IOException { + if (baos.size() <= maxEntitySize) { + baos.write(i); + } + inner.write(i); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java index 42898008f..9c577fd54 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java @@ -10,7 +10,6 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.glassfish.jersey.filter.LoggingFilter; /** * A version of the logging filter that will avoid trying to log entities which can cause From db4cf1d5821b8e6d96660f4af288b74e9e86155d Mon Sep 17 00:00:00 2001 From: Nuno Santos Date: Wed, 28 Jan 2015 13:49:47 +0100 Subject: [PATCH 0052/1399] Patched LoggingFilter to work with CXF. Added missing @Override tags. --- .../java/com/github/dockerjava/api/DockerClient.java | 1 + .../com/github/dockerjava/api/command/CommitCmd.java | 1 + .../dockerjava/api/command/ContainerDiffCmd.java | 2 ++ .../api/command/CopyFileFromContainerCmd.java | 1 + .../dockerjava/api/command/DockerCmdExecFactory.java | 1 + .../dockerjava/api/command/InspectContainerCmd.java | 1 + .../github/dockerjava/api/command/InspectImageCmd.java | 1 + .../dockerjava/api/command/KillContainerCmd.java | 1 + .../github/dockerjava/api/command/LogContainerCmd.java | 1 + .../dockerjava/api/command/PauseContainerCmd.java | 1 + .../github/dockerjava/api/command/PushImageCmd.java | 1 + .../dockerjava/api/command/RemoveContainerCmd.java | 1 + .../github/dockerjava/api/command/RemoveImageCmd.java | 1 + .../dockerjava/api/command/RestartContainerCmd.java | 1 + .../dockerjava/api/command/StartContainerCmd.java | 1 + .../dockerjava/api/command/StopContainerCmd.java | 1 + .../github/dockerjava/api/command/TopContainerCmd.java | 1 + .../dockerjava/api/command/UnpauseContainerCmd.java | 1 + .../java/com/github/dockerjava/api/model/Links.java | 1 - .../dockerjava/core/command/ExecCreateCmdImpl.java | 10 ++++++++++ .../github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 1 + .../github/dockerjava/jaxrs/RemoveImageCmdExec.java | 1 - .../github/dockerjava/jaxrs/util/LoggingFilter.java | 2 +- .../core/command/WaitContainerCmdImplTest.java | 1 - 24 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 53b212605..f7addfa27 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -105,6 +105,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public EventsCmd eventsCmd(EventCallback eventCallback); + @Override public void close() 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 5eb5a3e8b..ac0a7bb5e 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -106,6 +106,7 @@ public interface CommitCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public String exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { 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 516ea3650..21d99045d 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -13,6 +13,7 @@ public interface ContainerDiffCmd extends DockerCmd> { public ContainerDiffCmd withContainerId(String containerId); + @Override public String toString(); /** @@ -20,6 +21,7 @@ public interface ContainerDiffCmd extends DockerCmd> { * @throws InternalServerErrorException server error * @throws DockerException unexpected http status code */ + @Override public List exec() throws NotFoundException; public static interface Exec extends DockerCmdExec> { 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 0ebd3cc10..8d2bfbb41 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -21,6 +21,7 @@ public interface CopyFileFromContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { 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 df26743e1..73381d692 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -75,6 +75,7 @@ public interface DockerCmdExecFactory extends Closeable { public EventsCmd.Exec createEventsCmdExec(); + @Override public void close() throws IOException; } \ 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 ca6a9a695..f67fe4aea 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -11,6 +11,7 @@ public interface InspectContainerCmd extends DockerCmd /** * @throws NotFoundException No such container */ + @Override public InspectContainerResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index f25234879..d064badba 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -14,6 +14,7 @@ public interface InspectImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public InspectImageResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index aff39f9e5..b9522cb8c 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -18,6 +18,7 @@ public interface KillContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { 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 e0f20f9a8..36a41beb5 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -58,6 +58,7 @@ public interface LogContainerCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index a05733f94..652d433e4 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -17,6 +17,7 @@ public interface PauseContainerCmd extends DockerCmd{ /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { 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 c746fd7c2..f50beb01e 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -33,6 +33,7 @@ public interface PushImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index be9b9d259..b9c1f9437 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -27,6 +27,7 @@ public interface RemoveContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 212c9290c..be65ca41e 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -41,6 +41,7 @@ public interface RemoveImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 793919c24..8da41d38a 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -21,6 +21,7 @@ public interface RestartContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { 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 ef96267f7..40fb23a9f 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -135,6 +135,7 @@ public interface StartContainerCmd extends DockerCmd { * @throws NotModifiedException * Container already started */ + @Override public Void exec() throws NotFoundException, NotModifiedException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index 7e706c06e..19c248552 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -24,6 +24,7 @@ public interface StopContainerCmd extends DockerCmd { * @throws NotFoundException No such container * @throws NotModifiedException Container already stopped */ + @Override public Void exec() throws NotFoundException, NotModifiedException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index c7818a79d..63865c2a6 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -18,6 +18,7 @@ public interface TopContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public TopContainerResponse exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index e74df14cf..166bfa6a8 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -17,6 +17,7 @@ public interface UnpauseContainerCmd extends DockerCmd { /** * @throws NotFoundException No such container */ + @Override public Void exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index d901ea8d2..9bbef25d0 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Map; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 219b789da..5819fa498 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -31,48 +31,58 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { withContainerId(containerId); } + @Override public ExecCreateCmd withContainerId(String containerId) { checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } + @Override public ExecCreateCmd withAttachStdin(boolean attachStdin) { this.attachStdin = attachStdin; return this; } + @Override public ExecCreateCmd withAttachStdin() { return withAttachStdin(true); } + @Override public ExecCreateCmd withAttachStdout(boolean attachStdout) { this.attachStdout = attachStdout; return this; } + @Override public ExecCreateCmd withAttachStdout() { return withAttachStdout(true); } + @Override public ExecCreateCmd withAttachStderr(boolean attachStderr) { this.attachStderr = attachStderr; return this; } + @Override public ExecCreateCmd withAttachStderr() { return withAttachStderr(true); } + @Override public ExecCreateCmd withTty(boolean tty) { this.tty = tty; return this; } + @Override public ExecCreateCmd withTty() { return withTty(true); } + @Override public ExecCreateCmd withCmd(String... cmd) { this.cmd = cmd; return this; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 4e63d8a4a..95c13b26f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -39,6 +39,7 @@ protected String registryAuth(AuthConfig authConfig) { } } + @Override public RES_T exec(CMD_T command) { // this hack works because of ResponseStatusExceptionFilter RES_T result; diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 6bfeecd71..d5d7b8000 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -1,7 +1,6 @@ package com.github.dockerjava.jaxrs; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java index 5a37720ad..9679f230a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java @@ -211,7 +211,7 @@ private InputStream logInboundEntity(final StringBuilder b, InputStream stream) } stream.mark(maxEntitySize + 1); final byte[] entity = new byte[maxEntitySize + 1]; - final int entitySize = stream.read(entity); + final int entitySize = Math.max(0, stream.read(entity)); b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize))); if (entitySize > maxEntitySize) { b.append("...more..."); diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 32434eead..19c7057d2 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -16,7 +16,6 @@ import org.testng.annotations.Test; 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; From 48ba911ee7c9c6ff834dcd839f9a3abc5d9ddc4c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 28 Jan 2015 23:55:29 +0100 Subject: [PATCH 0053/1399] Multiple volumesFrom option when creating a container --- .../api/command/CreateContainerCmd.java | 5 +- .../dockerjava/api/model/AccessMode.java | 1 + .../com/github/dockerjava/api/model/Bind.java | 18 +--- .../dockerjava/api/model/HostConfig.java | 8 +- .../github/dockerjava/api/model/Volume.java | 17 ++-- .../dockerjava/api/model/VolumeFrom.java | 87 +++++++++++++++++++ .../github/dockerjava/api/model/Volumes.java | 2 +- .../dockerjava/api/model/VolumesFrom.java | 69 +++++++++++++++ .../core/command/CreateContainerCmdImpl.java | 10 ++- .../api/model/VolumeFrom_SerializingTest.java | 33 +++++++ .../command/CreateContainerCmdImplTest.java | 7 +- 11 files changed, 220 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumeFrom.java create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumesFrom.java create mode 100644 src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java 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 2eeda23e2..8d290125b 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeFrom; public interface CreateContainerCmd extends DockerCmd{ @@ -93,9 +94,9 @@ public interface CreateContainerCmd extends DockerCmd{ public CreateContainerCmd withVolumes(Volume... volumes); - public String[] getVolumesFrom(); + public VolumeFrom[] getVolumesFrom(); - public CreateContainerCmd withVolumesFrom(String... volumesFrom); + public CreateContainerCmd withVolumesFrom(VolumeFrom... volumesFrom); public HostConfig getHostConfig(); 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 e01065368..a1f53f57b 100644 --- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java +++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java @@ -16,4 +16,5 @@ public enum AccessMode { */ public static final AccessMode DEFAULT = rw; + } 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 2a838c279..eb0b8fd43 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.model; -import static com.github.dockerjava.api.model.AccessMode.ro; -import static com.github.dockerjava.api.model.AccessMode.rw; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; @@ -29,14 +28,6 @@ public Bind(String path, Volume volume, AccessMode accessMode) { this.accessMode = accessMode; } - /** - * @deprecated use {@link #Bind(String, Volume, AccessMode)} - */ - @Deprecated - public Bind(String path, Volume volume, boolean readOnly) { - this(path, volume, readOnly ? ro : rw); - } - public String getPath() { return path; } @@ -49,13 +40,6 @@ public AccessMode getAccessMode() { return accessMode; } - /** - * @deprecated use {@link #getAccessMode()} - */ - @Deprecated - public boolean isReadOnly() { - return ro.equals(accessMode); - } /** * Parses a bind mount specification to a {@link Bind}. 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 3d1865017..dd25e79bd 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -33,7 +33,7 @@ public class HostConfig { private String[] dnsSearch; @JsonProperty("VolumesFrom") - private String[] volumesFrom; + private VolumesFrom volumesFrom; @JsonProperty("ContainerIDFile") private String containerIDFile; @@ -57,7 +57,7 @@ public HostConfig() { } public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, - boolean privileged, String[] dns, String[] dnsSearch, String[] volumesFrom, String containerIDFile, + boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices) { this.binds = binds; this.links = links; @@ -100,7 +100,7 @@ public String[] getDns() { return dns; } - public String[] getVolumesFrom() { + public VolumesFrom getVolumesFrom() { return volumesFrom; } @@ -168,7 +168,7 @@ public void setDnsSearch(String[] dnsSearch) { this.dnsSearch = dnsSearch; } - public void setVolumesFrom(String[] volumesFrom) { + public void setVolumesFrom(VolumesFrom volumesFrom) { this.volumesFrom = volumesFrom; } 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 1a1890147..3ec5e24c7 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -30,18 +30,23 @@ public class Volume { private String path; - private boolean readWrite = true; + 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 boolean isReadWrite() { - return readWrite; + public AccessMode getAccessMode() { + return accessMode; } public static Volume parse(String serialized) { @@ -64,7 +69,7 @@ public String toString() { public boolean equals(Object obj) { if (obj instanceof Volume) { Volume other = (Volume) obj; - return new EqualsBuilder().append(path, other.getPath()).append(readWrite, other.isReadWrite()) + return new EqualsBuilder().append(path, other.getPath()).append(accessMode, other.getAccessMode()) .isEquals(); } else return super.equals(obj); @@ -72,7 +77,7 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return new HashCodeBuilder().append(path).append(readWrite).toHashCode(); + return new HashCodeBuilder().append(path).append(accessMode).toHashCode(); } public static class Serializer extends JsonSerializer { @@ -84,7 +89,7 @@ public void serialize(Volume volume, JsonGenerator jsonGen, jsonGen.writeStartObject(); jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeString(Boolean.toString(volume.isReadWrite())); + jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); jsonGen.writeEndObject(); } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java new file mode 100644 index 000000000..8554c2f6d --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java @@ -0,0 +1,87 @@ +package com.github.dockerjava.api.model; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +public class VolumeFrom { + + private String container; + + private AccessMode accessMode; + + public VolumeFrom(String container) { + this(container, AccessMode.DEFAULT); + } + + public VolumeFrom(String container, AccessMode accessMode) { + this.container = container; + this.accessMode = accessMode; + } + + public String getContainer() { + return container; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + + /** + * Parses a volume from specification to a {@link VolumeFrom}. + * + * @param serialized the specification, e.g. container:ro + * @return a {@link VolumeFrom} matching the specification + * @throws IllegalArgumentException if the specification cannot be parsed + */ + public static VolumeFrom parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 1: { + return new VolumeFrom(parts[0]); + } + case 2: { + return new VolumeFrom(parts[0], AccessMode.valueOf(parts[1])); + } + + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VolumeFrom) { + VolumeFrom other = (VolumeFrom) obj; + return new EqualsBuilder().append(container, other.getContainer()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(container) + .append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link VolumeFrom} suitable + * for inclusion in a JSON message. + * The format is <container>:<access mode>, + * like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link VolumeFrom} + */ + @Override + public String toString() { + return container + ":" + accessMode.toString(); + } + +} 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 b8a9315bc..69753d6a8 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,7 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen, jsonGen.writeStartObject(); for (Volume volume : volumes.getVolumes()) { jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeString(Boolean.toString(volume.isReadWrite())); + jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); } jsonGen.writeEndObject(); } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java new file mode 100644 index 000000000..a16e0c679 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -0,0 +1,69 @@ +package com.github.dockerjava.api.model; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +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; + +@JsonSerialize(using = VolumesFrom.Serializer.class) +@JsonDeserialize(using = VolumesFrom.Deserializer.class) +public class VolumesFrom { + + private VolumeFrom[] volumesFrom; + + public VolumesFrom(VolumeFrom... volumesFrom) { + this.volumesFrom = volumesFrom; + } + + public VolumeFrom[] getVolumesFrom() { + return volumesFrom; + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumesFrom volumesFrom, JsonGenerator jsonGen, + SerializerProvider serProvider) throws IOException, + JsonProcessingException { + + // + jsonGen.writeStartArray(); + for (VolumeFrom bind : volumesFrom.getVolumesFrom()) { + jsonGen.writeString(bind.toString()); + } + jsonGen.writeEndArray(); + // + } + + } + + public static class Deserializer extends JsonDeserializer { + @Override + public VolumesFrom deserialize(JsonParser jsonParser, + DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + + List volumesFrom = new ArrayList(); + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + for (Iterator it = node.iterator(); it.hasNext();) { + JsonNode field = it.next(); + volumesFrom.add(VolumeFrom.parse(field.asText())); + } + return new VolumesFrom(volumesFrom.toArray(new VolumeFrom[0])); + } + } + +} 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 ea6d721e7..991ecc8e1 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -15,7 +15,9 @@ import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeFrom; import com.github.dockerjava.api.model.Volumes; +import com.github.dockerjava.api.model.VolumesFrom; /** @@ -303,13 +305,13 @@ public CreateContainerCmdImpl withVolumes(Volume... volumes) { } @Override - public String[] getVolumesFrom() { - return hostConfig.getVolumesFrom(); + public VolumeFrom[] getVolumesFrom() { + return hostConfig.getVolumesFrom() == null ? new VolumeFrom[0] : hostConfig.getVolumesFrom().getVolumesFrom(); } @Override - public CreateContainerCmdImpl withVolumesFrom(String... volumesFrom) { - this.hostConfig.setVolumesFrom(volumesFrom); + public CreateContainerCmdImpl withVolumesFrom(VolumeFrom... volumesFrom) { + this.hostConfig.setVolumesFrom(new VolumesFrom(volumesFrom)); return this; } diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java new file mode 100644 index 000000000..37a3e37a6 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import java.util.Map; + +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.model.Ports.Binding; + +public class VolumeFrom_SerializingTest { + private final ObjectMapper objectMapper = new ObjectMapper(); + private final String json = + "[\"container1:ro\",\"container2:rw\"]"; + @Test + public void deserializing() throws Exception { + VolumesFrom volumesFrom = objectMapper.readValue(json, VolumesFrom.class); + + VolumesFrom expected = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw)); + + assertEquals(volumesFrom.getVolumesFrom(), expected.getVolumesFrom()); + } + + @Test + public void serializing() throws Exception { + VolumesFrom volumesFrom = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw)); + + assertEquals(objectMapper.writeValueAsString(volumesFrom), json); + } + + +} 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 2b879a9a9..71358ff50 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -32,6 +32,7 @@ import com.github.dockerjava.api.model.Link; import com.github.dockerjava.api.model.Links; import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -125,14 +126,14 @@ public void createContainerWithVolumesFrom() throws DockerException { // create a second container with volumes from first container CreateContainerResponse container2 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") - .withVolumesFrom(container1Name).exec(); + .withVolumesFrom(new VolumeFrom(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(container1Name)); + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom().getVolumesFrom(), hasItemInArray(new VolumeFrom(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 @@ -144,7 +145,7 @@ public void createContainerWithVolumesFrom() throws DockerException { inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(container1Name)); + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom().getVolumesFrom(), hasItemInArray(new VolumeFrom(container1Name))); assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); } From afdafe9fbd3507c0a7a7f22a2789764d70b7b120 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 28 Jan 2015 23:59:46 +0100 Subject: [PATCH 0054/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbf6d65cd..4d70968f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log docker-java-0.10.6-SNAPSHOT --- + * [#137](https://github.com/docker-java/docker-java/pull/137) Multiple volumesFrom option when creating a container * [#135](https://github.com/docker-java/docker-java/pull/135) Update to latest unix-socket-factory * [#134](https://github.com/docker-java/docker-java/pull/134) Remove Google Guava as dependency * [#128](https://github.com/docker-java/docker-java/pull/128) Allow unauthorized pullImageCmd From cc5331d7de228601fa817f0212ee107953470075 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 29 Jan 2015 22:03:41 +0100 Subject: [PATCH 0055/1399] Simplify volumesFrom handling --- .../api/command/CreateContainerCmd.java | 6 +- .../dockerjava/api/model/HostConfig.java | 8 +- .../dockerjava/api/model/VolumeFrom.java | 87 --------------- .../dockerjava/api/model/VolumesFrom.java | 104 ++++++++++++++---- .../core/command/CreateContainerCmdImpl.java | 12 +- .../api/model/VolumeFrom_SerializingTest.java | 24 ++-- .../command/CreateContainerCmdImplTest.java | 8 +- 7 files changed, 106 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/api/model/VolumeFrom.java 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 8d290125b..88a6caf03 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -6,7 +6,7 @@ import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeFrom; +import com.github.dockerjava.api.model.VolumesFrom; public interface CreateContainerCmd extends DockerCmd{ @@ -94,9 +94,9 @@ public interface CreateContainerCmd extends DockerCmd{ public CreateContainerCmd withVolumes(Volume... volumes); - public VolumeFrom[] getVolumesFrom(); + public VolumesFrom[] getVolumesFrom(); - public CreateContainerCmd withVolumesFrom(VolumeFrom... volumesFrom); + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); public HostConfig getHostConfig(); 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 dd25e79bd..5532fba3a 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -33,7 +33,7 @@ public class HostConfig { private String[] dnsSearch; @JsonProperty("VolumesFrom") - private VolumesFrom volumesFrom; + private VolumesFrom[] volumesFrom; @JsonProperty("ContainerIDFile") private String containerIDFile; @@ -57,7 +57,7 @@ public HostConfig() { } public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, - boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom volumesFrom, String containerIDFile, + boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices) { this.binds = binds; this.links = links; @@ -100,7 +100,7 @@ public String[] getDns() { return dns; } - public VolumesFrom getVolumesFrom() { + public VolumesFrom[] getVolumesFrom() { return volumesFrom; } @@ -168,7 +168,7 @@ public void setDnsSearch(String[] dnsSearch) { this.dnsSearch = dnsSearch; } - public void setVolumesFrom(VolumesFrom volumesFrom) { + public void setVolumesFrom(VolumesFrom[] volumesFrom) { this.volumesFrom = volumesFrom; } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java deleted file mode 100644 index 8554c2f6d..000000000 --- a/src/main/java/com/github/dockerjava/api/model/VolumeFrom.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.github.dockerjava.api.model; - -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; - -public class VolumeFrom { - - private String container; - - private AccessMode accessMode; - - public VolumeFrom(String container) { - this(container, AccessMode.DEFAULT); - } - - public VolumeFrom(String container, AccessMode accessMode) { - this.container = container; - this.accessMode = accessMode; - } - - public String getContainer() { - return container; - } - - public AccessMode getAccessMode() { - return accessMode; - } - - - /** - * Parses a volume from specification to a {@link VolumeFrom}. - * - * @param serialized the specification, e.g. container:ro - * @return a {@link VolumeFrom} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static VolumeFrom parse(String serialized) { - try { - String[] parts = serialized.split(":"); - switch (parts.length) { - case 1: { - return new VolumeFrom(parts[0]); - } - case 2: { - return new VolumeFrom(parts[0], AccessMode.valueOf(parts[1])); - } - - default: { - throw new IllegalArgumentException(); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Bind '" + serialized - + "'"); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof VolumeFrom) { - VolumeFrom other = (VolumeFrom) obj; - return new EqualsBuilder().append(container, other.getContainer()) - .append(accessMode, other.getAccessMode()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(container) - .append(accessMode).toHashCode(); - } - - /** - * Returns a string representation of this {@link VolumeFrom} suitable - * for inclusion in a JSON message. - * The format is <container>:<access mode>, - * like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link VolumeFrom} - */ - @Override - public String toString() { - return container + ":" + accessMode.toString(); - } - -} diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java index a16e0c679..9aae9f30b 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -1,9 +1,9 @@ package com.github.dockerjava.api.model; import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; + +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; @@ -21,30 +21,94 @@ @JsonDeserialize(using = VolumesFrom.Deserializer.class) public class VolumesFrom { - private VolumeFrom[] volumesFrom; + private String container; + + private AccessMode accessMode; - public VolumesFrom(VolumeFrom... volumesFrom) { - this.volumesFrom = volumesFrom; + public VolumesFrom(String container) { + this(container, AccessMode.DEFAULT); } - public VolumeFrom[] getVolumesFrom() { - return volumesFrom; + public VolumesFrom(String container, AccessMode accessMode) { + this.container = container; + this.accessMode = accessMode; + } + + public String getContainer() { + return container; } + + public AccessMode getAccessMode() { + return accessMode; + } + + /** + * Parses a volume from specification to a {@link VolumesFrom}. + * + * @param serialized the specification, e.g. container:ro + * @return a {@link VolumesFrom} matching the specification + * @throws IllegalArgumentException if the specification cannot be parsed + */ + public static VolumesFrom parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 1: { + return new VolumesFrom(parts[0]); + } + case 2: { + return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); + } + + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VolumesFrom) { + VolumesFrom other = (VolumesFrom) obj; + return new EqualsBuilder().append(container, other.getContainer()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(container) + .append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link VolumesFrom} suitable + * for inclusion in a JSON message. + * The format is <container>:<access mode>, + * like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link VolumesFrom} + */ + @Override + public String toString() { + return container + ":" + accessMode.toString(); + } + public static class Serializer extends JsonSerializer { @Override - public void serialize(VolumesFrom volumesFrom, JsonGenerator jsonGen, + public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, SerializerProvider serProvider) throws IOException, JsonProcessingException { - // - jsonGen.writeStartArray(); - for (VolumeFrom bind : volumesFrom.getVolumesFrom()) { - jsonGen.writeString(bind.toString()); - } - jsonGen.writeEndArray(); - // + jsonGen.writeString(volumeFrom.toString()); + } } @@ -55,14 +119,10 @@ public VolumesFrom deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - List volumesFrom = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); - for (Iterator it = node.iterator(); it.hasNext();) { - JsonNode field = it.next(); - volumesFrom.add(VolumeFrom.parse(field.asText())); - } - return new VolumesFrom(volumesFrom.toArray(new VolumeFrom[0])); + return VolumesFrom.parse(node.asText()); + } } 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 991ecc8e1..59a08b910 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -15,10 +15,8 @@ import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeFrom; -import com.github.dockerjava.api.model.Volumes; import com.github.dockerjava.api.model.VolumesFrom; - +import com.github.dockerjava.api.model.Volumes; /** * @@ -305,13 +303,13 @@ public CreateContainerCmdImpl withVolumes(Volume... volumes) { } @Override - public VolumeFrom[] getVolumesFrom() { - return hostConfig.getVolumesFrom() == null ? new VolumeFrom[0] : hostConfig.getVolumesFrom().getVolumesFrom(); + public VolumesFrom[] getVolumesFrom() { + return hostConfig.getVolumesFrom(); } @Override - public CreateContainerCmdImpl withVolumesFrom(VolumeFrom... volumesFrom) { - this.hostConfig.setVolumesFrom(new VolumesFrom(volumesFrom)); + public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { + this.hostConfig.setVolumesFrom(volumesFrom); return this; } diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java index 37a3e37a6..b7c3bbff5 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java @@ -2,32 +2,24 @@ import static org.testng.Assert.assertEquals; -import java.util.Map; - import org.testng.annotations.Test; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.model.Ports.Binding; public class VolumeFrom_SerializingTest { private final ObjectMapper objectMapper = new ObjectMapper(); - private final String json = - "[\"container1:ro\",\"container2:rw\"]"; + private final String json = "\"container1:ro\""; + @Test public void deserializing() throws Exception { - VolumesFrom volumesFrom = objectMapper.readValue(json, VolumesFrom.class); - - VolumesFrom expected = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw)); - - assertEquals(volumesFrom.getVolumesFrom(), expected.getVolumesFrom()); + VolumesFrom volumeFrom = objectMapper.readValue(json, VolumesFrom.class); + assertEquals(volumeFrom, new VolumesFrom("container1", AccessMode.ro)); } - + @Test public void serializing() throws Exception { - VolumesFrom volumesFrom = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw)); - - assertEquals(objectMapper.writeValueAsString(volumesFrom), json); + VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); + assertEquals(objectMapper.writeValueAsString(volumeFrom), json); } - - + } 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 71358ff50..ed81a5296 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -32,7 +32,7 @@ import com.github.dockerjava.api.model.Link; import com.github.dockerjava.api.model.Links; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeFrom; +import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -126,14 +126,14 @@ public void createContainerWithVolumesFrom() throws DockerException { // create a second container with volumes from first container CreateContainerResponse container2 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") - .withVolumesFrom(new VolumeFrom(container1Name)).exec(); + .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().getVolumesFrom(), hasItemInArray(new VolumeFrom(container1Name))); + 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 @@ -145,7 +145,7 @@ public void createContainerWithVolumesFrom() throws DockerException { inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom().getVolumesFrom(), hasItemInArray(new VolumeFrom(container1Name))); + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name))); assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); } From 91b81072e5a358b9a283efa486f800c2c851fff8 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 29 Jan 2015 22:23:12 +0100 Subject: [PATCH 0056/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d70968f9..80b6fc4ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log docker-java-0.10.6-SNAPSHOT --- + * [#138](https://github.com/docker-java/docker-java/pull/138) Apache CXF interopabilty * [#137](https://github.com/docker-java/docker-java/pull/137) Multiple volumesFrom option when creating a container * [#135](https://github.com/docker-java/docker-java/pull/135) Update to latest unix-socket-factory * [#134](https://github.com/docker-java/docker-java/pull/134) Remove Google Guava as dependency From 11ae37f1fabc6e3dc0a929bfbda3021f27f8c8f9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 31 Jan 2015 21:08:04 +0100 Subject: [PATCH 0057/1399] Removed own Preconditons implementation --- .../com/github/dockerjava/Preconditions.java | 145 ------------------ .../github/dockerjava/api/model/Device.java | 2 +- .../dockerjava/api/model/RestartPolicy.java | 2 +- .../dockerjava/core/DockerClientConfig.java | 2 +- .../dockerjava/core/DockerClientImpl.java | 2 +- .../dockerjava/core/KeystoreSSLConfig.java | 2 +- .../core/LocalDirectorySSLConfig.java | 2 +- .../core/command/AbstrAuthCfgDockerCmd.java | 2 +- .../core/command/AbstrDockerCmd.java | 2 +- .../core/command/AttachContainerCmdImpl.java | 2 +- .../core/command/BuildImageCmdImpl.java | 6 +- .../core/command/CommitCmdImpl.java | 2 +- .../core/command/ContainerDiffCmdImpl.java | 2 +- .../command/CopyFileFromContainerCmdImpl.java | 2 +- .../core/command/CreateContainerCmdImpl.java | 2 +- .../core/command/CreateImageCmdImpl.java | 2 +- .../core/command/ExecCreateCmdImpl.java | 2 +- .../core/command/ExecStartCmdImpl.java | 2 +- .../core/command/InspectContainerCmdImpl.java | 2 +- .../core/command/InspectImageCmdImpl.java | 2 +- .../core/command/KillContainerCmdImpl.java | 2 +- .../core/command/ListContainersCmdImpl.java | 4 +- .../core/command/ListImagesCmdImpl.java | 2 +- .../core/command/LogContainerCmdImpl.java | 2 +- .../core/command/PauseContainerCmdImpl.java | 2 +- .../core/command/PullImageCmdImpl.java | 2 +- .../core/command/PushImageCmdImpl.java | 2 +- .../core/command/RemoveContainerCmdImpl.java | 2 +- .../core/command/RemoveImageCmdImpl.java | 2 +- .../core/command/RestartContainerCmdImpl.java | 4 +- .../core/command/SearchImagesCmdImpl.java | 2 +- .../core/command/StartContainerCmdImpl.java | 2 +- .../core/command/StopContainerCmdImpl.java | 4 +- .../core/command/TagImageCmdImpl.java | 2 +- .../core/command/TopContainerCmdImpl.java | 2 +- .../core/command/UnpauseContainerCmdImpl.java | 2 +- .../core/command/WaitContainerCmdImpl.java | 2 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 2 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 2 +- .../dockerjava/jaxrs/EventsCmdExec.java | 2 +- .../jaxrs/util/guava/PercentEscaper.java | 2 +- .../jaxrs/util/guava/UnicodeEscaper.java | 2 +- 42 files changed, 45 insertions(+), 192 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/Preconditions.java diff --git a/src/main/java/com/github/dockerjava/Preconditions.java b/src/main/java/com/github/dockerjava/Preconditions.java deleted file mode 100644 index 183e640b7..000000000 --- a/src/main/java/com/github/dockerjava/Preconditions.java +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright (C) 2008 The Guava Authors - * - * 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; - - -public final class Preconditions { - private Preconditions() {} - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessageTemplate a template for the exception message should the check fail. The - * message is formed by replacing each {@code %s} placeholder in the template with an - * argument. These are matched by position - the first {@code %s} gets {@code - * errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message - * in square braces. Unmatched placeholders will be left as-is. - * @param errorMessageArgs the arguments to be substituted into the message template. Arguments - * are converted to strings using {@link String#valueOf(Object)}. - * @throws IllegalArgumentException if {@code expression} is false - * @throws NullPointerException if the check fails and either {@code errorMessageTemplate} or - * {@code errorMessageArgs} is null (don't let this happen) - */ - public static void checkArgument(boolean expression, - String errorMessageTemplate, - Object... errorMessageArgs) { - if (!expression) { - throw new IllegalArgumentException(Preconditions.format(errorMessageTemplate, errorMessageArgs)); - } - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - * @param reference an object reference - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference, Object errorMessage) { - if (reference == null) { - throw new NullPointerException(String.valueOf(errorMessage)); - } - return reference; - } - - /** - * Ensures the truth of an expression involving one or more parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @throws IllegalArgumentException if {@code expression} is false - */ - public static void checkArgument(boolean expression, Object errorMessage) { - if (!expression) { - throw new IllegalArgumentException(String.valueOf(errorMessage)); - } - } - - /** - * Ensures that an object reference passed as a parameter to the calling method is not null. - * - * @param reference an object reference - * @return the non-null reference that was validated - * @throws NullPointerException if {@code reference} is null - */ - public static T checkNotNull(T reference) { - if (reference == null) { - throw new NullPointerException(); - } - return reference; - } - - /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - * @param expression a boolean expression - * @param errorMessage the exception message to use if the check fails; will be converted to a - * string using {@link String#valueOf(Object)} - * @throws IllegalStateException if {@code expression} is false - */ - public static void checkState(boolean expression, Object errorMessage) { - if (!expression) { - throw new IllegalStateException(String.valueOf(errorMessage)); - } - } - - /** - * Substitutes each {@code %s} in {@code template} with an argument. These are matched by - * position: the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than - * placeholders, the unmatched arguments will be appended to the end of the formatted message in - * square braces. - * - * @param template a non-null string containing 0 or more {@code %s} placeholders. - * @param args the arguments to be substituted into the message template. Arguments are converted - * to strings using {@link String#valueOf(Object)}. Arguments can be null. - */ - // Note that this is somewhat-improperly used from Verify.java as well. - public static String format(String template, Object... args) { - template = String.valueOf(template); // null -> "null" - - // start substituting the arguments into the '%s' placeholders - StringBuilder builder = new StringBuilder(template.length() + 16 * args.length); - int templateStart = 0; - int i = 0; - while (i < args.length) { - int placeholderStart = template.indexOf("%s", templateStart); - if (placeholderStart == -1) { - break; - } - builder.append(template.substring(templateStart, placeholderStart)); - builder.append(args[i++]); - templateStart = placeholderStart + 2; - } - builder.append(template.substring(templateStart)); - - // if we run out of placeholders, append the extra args in square braces - if (i < args.length) { - builder.append(" ["); - builder.append(args[i++]); - while (i < args.length) { - builder.append(", "); - builder.append(args[i++]); - } - builder.append(']'); - } - - return builder.toString(); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index 76b0ddbf9..63d26b41f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.model; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index e08dd1384..d2dd6d944 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.model; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 9a7a2e9fa..881a7663d 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index f1175921c..5f0876bbd 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.Closeable; import java.io.File; diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index fe5e65099..7f141142e 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index d60db72c5..a27cb01f5 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.security.Security; diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 8069ed6b1..c1ccab516 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index ed289c98a..300489a0a 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; 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 6ac220c0e..65155a1a0 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; 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 b2286bc85..0bdb6db36 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -1,9 +1,5 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkArgument; -import static com.github.dockerjava.Preconditions.checkNotNull; -import static com.github.dockerjava.Preconditions.checkState; - import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -29,6 +25,8 @@ import com.github.dockerjava.core.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; +import static jersey.repackaged.com.google.common.base.Preconditions.*; + /** * * Build an image from Dockerfile. diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index 6ba3d4a34..df8b1a662 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index 68293107d..abb6469de 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index fe1a57b62..d335bf8cd 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; 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 59a08b910..7a41f1d41 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index fc6ce9122..71c333e7c 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 5819fa498..3fac90138 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 8f9028d2e..70a95b85b 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index f48101b89..de7c268c3 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 11a0ea7f5..c2c91b996 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index ccc7b58b0..ba4da47ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 5bfe61afe..741da75e7 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkArgument; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 01c5eb01a..ed163bb81 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.util.List; 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 b71a149c9..547165f11 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index 4d8702b11..a2fd73ee5 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PauseContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index b4cde7947..8dd3af41e 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 2a2795503..137c008a3 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 84d7cc12f..51dd4b0c0 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 6e7f4fb17..938e2b81c 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index 0f105e53b..3548e04f0 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkArgument; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RestartContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 7462cdbdc..164425fc9 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.util.List; 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 1ca2124db..44476e0ac 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 26372b9fc..bed0aab7f 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkArgument; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index cdcc74502..3e0370cb1 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.command.TagImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index c49698cf7..713ac2f25 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 97d12eaa6..ce266162a 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.UnpauseContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index c5952e53b..ecfc89e4e 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.command.WaitContainerCmd; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 95c13b26f..a33e11a15 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 3f59a2839..744f0c63c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; import java.net.URI; diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index ba15e995a..3c525baeb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static com.github.dockerjava.Preconditions.checkNotNull; +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; import java.util.concurrent.Callable; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java index b8c2b2711..8625121ef 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java @@ -16,7 +16,7 @@ package com.github.dockerjava.jaxrs.util.guava; -import com.github.dockerjava.Preconditions; +import jersey.repackaged.com.google.common.base.Preconditions; /** * A {@code UnicodeEscaper} that escapes some set of Java characters using a diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java index a58239484..b0b74d8fa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java @@ -16,8 +16,8 @@ package com.github.dockerjava.jaxrs.util.guava; +import jersey.repackaged.com.google.common.base.Preconditions; -import com.github.dockerjava.Preconditions; /** * An Escaper that converts literal text into a format safe for From 93348ec80459da959d70649d25bd771797fb8a51 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 2 Feb 2015 21:17:38 +0100 Subject: [PATCH 0058/1399] Fix Issue #139 --- pom.xml | 12 ++++++------ .../dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 6 ++++-- .../github/dockerjava/jaxrs/util/LoggingFilter.java | 9 +++++---- .../jaxrs/util/SelectiveLoggingFilter.java | 3 ++- .../dockerjava/client/AbstractDockerClientTest.java | 2 ++ src/test/resources/logback.xml | 6 +++--- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 2d0116531..3ae2e1f82 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 2015-01-27T15-02-14 - 1.0.1 + 1.1.0 5.12.1 1.3 1.6 @@ -143,11 +143,11 @@ ${slf4j-api.version}
- - org.slf4j - jul-to-slf4j - ${slf4j-api.version} - + + + + + org.bouncycastle diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 744f0c63c..78cd8427c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -4,7 +4,9 @@ import java.io.IOException; import java.net.URI; -import java.util.logging.Logger; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; @@ -65,7 +67,7 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { - private static final Logger LOGGER = Logger.getLogger(DockerCmdExecFactoryImpl.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); private Client client; private WebTarget baseResource; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java index 9679f230a..eda72b835 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java @@ -53,7 +53,9 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Logger; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.ClientRequestContext; @@ -68,7 +70,6 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; - import javax.annotation.Priority; @@ -86,7 +87,7 @@ public class LoggingFilter implements ContainerRequestFilter, ClientRequestFilter, ContainerResponseFilter, ClientResponseFilter, WriterInterceptor { - private static final Logger LOGGER = Logger.getLogger(LoggingFilter.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class.getName()); private static final String NOTIFICATION_PREFIX = "* "; private static final String REQUEST_PREFIX = "> "; private static final String RESPONSE_PREFIX = "< "; @@ -150,7 +151,7 @@ public LoggingFilter(final Logger logger, final int maxEntitySize) { private void log(final StringBuilder b) { if (logger != null) { - logger.info(b.toString()); + logger.debug(b.toString()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java index 9c577fd54..6771ebe88 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java @@ -4,12 +4,13 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; -import java.util.logging.Logger; import javax.ws.rs.client.ClientRequestContext; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import org.slf4j.Logger; + /** * A version of the logging filter that will avoid trying to log entities which can cause diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 71bfb9304..f5519283c 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -39,6 +39,8 @@ 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()) diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index 318af2861..bdb0ee75a 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -6,10 +6,10 @@ - - + + - + From 602008c241469d6bc41d406d8504aa1fc6021a08 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 2 Jan 2015 11:30:10 +0000 Subject: [PATCH 0059/1399] There are two different event streamed JSON objects that come back from commands. Create representations for them. Signed-off-by: Nigel Magnay --- .../dockerjava/api/model/EventStreamItem.java | 62 +++++++++++++++++++ .../api/model/PushEventStreamItem.java | 58 +++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/model/EventStreamItem.java create mode 100644 src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java new file mode 100644 index 000000000..98c61a862 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.api.model; + +import com.google.common.base.Objects; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +/** + * Represents an event stream + */ +@JsonIgnoreProperties(ignoreUnknown=true) +public class EventStreamItem implements Serializable { + + @JsonProperty("stream") + private String stream; + + // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} + @JsonProperty("error") + private String error; + + @JsonProperty("errorDetail") + private ErrorDetail errorDetail; + + public String getStream() { + return stream; + } + + public String getError() { + return error; + } + + public ErrorDetail getErrorDetail() { + return errorDetail; + } + + @JsonIgnoreProperties(ignoreUnknown=true) + public static class ErrorDetail implements Serializable { + @JsonProperty("code") + String code; + @JsonProperty("message") + String message; + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("code", code) + .add("message", message) + .toString(); + } + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("stream", stream) + .add("error", error) + .add("errorDetail", errorDetail) + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java new file mode 100644 index 000000000..df7f59f50 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -0,0 +1,58 @@ +package com.github.dockerjava.api.model; + +import com.google.common.base.Objects; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +/** + * Represents an item returned from push + */ +@JsonIgnoreProperties(ignoreUnknown=true) +public class PushEventStreamItem implements Serializable { + + @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(); + } +} From 8140c4707886246480eb5e330c53c85e84ebe0d7 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 2 Jan 2015 11:35:36 +0000 Subject: [PATCH 0060/1399] Make BuildImage and PushImage return an object that can be iterated over in a typed fashion so that clients can read out the responses. Use Iterable so the response does not have to be 'complete' before consuming. Derive from InputStream to maintain backwards compatibility and for clients that don't want to parse the response. Signed-off-by: Nigel Magnay --- .../dockerjava/api/command/BuildImageCmd.java | 11 +++- .../dockerjava/api/command/PushImageCmd.java | 13 ++-- .../core/command/BuildImageCmdImpl.java | 3 +- .../core/command/PushImageCmdImpl.java | 6 +- .../dockerjava/jaxrs/BuildImageCmdExec.java | 49 ++++++++++++--- .../dockerjava/jaxrs/PushImageCmdExec.java | 63 +++++++++++++++---- .../core/TestDockerCmdExecFactory.java | 9 +-- 7 files changed, 119 insertions(+), 35 deletions(-) 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 7c2deb63a..8a1e62115 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,5 +1,9 @@ package com.github.dockerjava.api.command; +import com.github.dockerjava.api.model.EventStreamItem; +import com.github.dockerjava.api.model.PushEventStreamItem; + +import java.io.IOException; import java.io.InputStream; /** @@ -9,7 +13,7 @@ * TODO: http://docs.docker.com/reference/builder/#dockerignore * */ -public interface BuildImageCmd extends DockerCmd{ +public interface BuildImageCmd extends DockerCmd{ public BuildImageCmd withTag(String tag); @@ -37,7 +41,10 @@ public interface BuildImageCmd extends DockerCmd{ public BuildImageCmd withQuiet(boolean quiet); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdExec { } + 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/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index f50beb01e..80e16c6d9 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -1,16 +1,18 @@ 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; /** * Push the latest image to the repository. * * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public interface PushImageCmd extends DockerCmd{ +public interface PushImageCmd extends DockerCmd{ public String getName(); @@ -33,10 +35,13 @@ public interface PushImageCmd extends DockerCmd{ /** * @throws NotFoundException No such image */ - @Override - public InputStream exec() throws NotFoundException; + public Response exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdExec { + } + + 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/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 0bdb6db36..468dac7e7 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -32,8 +32,7 @@ * Build an image from Dockerfile. * */ -public class BuildImageCmdImpl extends - AbstrDockerCmd implements BuildImageCmd { +public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { private static final Pattern ADD_OR_COPY_PATTERN = Pattern .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 137c008a3..1914f91dd 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -2,8 +2,6 @@ import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; -import java.io.InputStream; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PushImageCmd; @@ -12,7 +10,7 @@ * * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd implements PushImageCmd { +public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd implements PushImageCmd { private String name; private String tag; @@ -63,7 +61,7 @@ public String toString() { * @throws NotFoundException No such image */ @Override - public InputStream exec() throws NotFoundException { + public Response exec() throws NotFoundException { return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 85c5f18c2..2b5d9a57a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,8 +1,12 @@ package com.github.dockerjava.jaxrs; +import com.google.common.collect.ImmutableList; + 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.WebTarget; import javax.ws.rs.core.MediaType; @@ -13,9 +17,14 @@ 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; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.model.EventStreamItem; +import com.github.dockerjava.api.model.PushEventStreamItem; -public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { +public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory .getLogger(BuildImageCmdExec.class); @@ -25,7 +34,7 @@ public BuildImageCmdExec(WebTarget baseResource) { } @Override - protected InputStream execute(BuildImageCmd command) { + protected ResponseImpl execute(BuildImageCmd command) { WebTarget webResource = getBaseResource().path("/build"); if(command.getTag() != null) { @@ -45,12 +54,38 @@ protected InputStream execute(BuildImageCmd command) { webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024*1024); - LOGGER.debug("POST: {}", webResource); - return webResource - .request() - .accept(MediaType.TEXT_PLAIN) - .post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class); + + LOGGER.debug("POST: {}", webResource); + InputStream is = webResource + .request() + .accept(MediaType.TEXT_PLAIN) + .post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class); + + return new ResponseImpl(is); } + public static class ResponseImpl extends BuildImageCmd.Response { + + private final InputStream proxy; + + public ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(EventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + return ImmutableList.copyOf(items); + } + @Override + public int read() throws IOException { + return proxy.read(); + } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index b970d42fc..838c9b89a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,6 +1,12 @@ package com.github.dockerjava.jaxrs; +import com.google.common.collect.ImmutableList; + +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.WebTarget; import javax.ws.rs.core.MediaType; @@ -8,37 +14,70 @@ 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.PushImageCmd; +import com.github.dockerjava.api.command.PushImageCmd.Response; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushEventStreamItem; -public class PushImageCmdExec extends - AbstrDockerCmdExec implements - PushImageCmd.Exec { +public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(PushImageCmdExec.class); - + public PushImageCmdExec(WebTarget baseResource) { super(baseResource); } @Override - protected InputStream execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path( - "/images/" + name(command) + "/push").queryParam("tag", - command.getTag()); + protected ResponseImpl execute(PushImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push") + .queryParam("tag", command.getTag()); final String registryAuth = registryAuth(command.getAuthConfig()); LOGGER.trace("POST: {}", webResource); - return webResource.request().header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON).post(null) - .readEntity(InputStream.class); - } + InputStream is = webResource + .request() + .header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON) + .post( + entity(Response.class, MediaType.APPLICATION_JSON)).readEntity( + InputStream.class); + return new ResponseImpl(is); + } + private String name(PushImageCmd command) { String name = command.getName(); AuthConfig authConfig = command.getAuthConfig(); return name.contains("/") ? name : authConfig.getUsername(); } + + public static class ResponseImpl extends Response { + + private final InputStream proxy; + + ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(PushEventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + return ImmutableList.copyOf(items); + } + + @Override + public int read() throws IOException { + return proxy.read(); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index c63667a0d..4fcf26b6a 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -8,6 +8,7 @@ import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; +import com.github.dockerjava.jaxrs.BuildImageCmdExec; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations @@ -92,18 +93,18 @@ public Void exec(RemoveImageCmd command) { public BuildImageCmd.Exec createBuildImageCmdExec() { return new BuildImageCmd.Exec() { @Override - public InputStream exec(BuildImageCmd command) { + public BuildImageCmd.Response exec(BuildImageCmd command) { // can't detect image id here so tagging it String tag = command.getTag(); if(tag == null || "".equals(tag.trim())) { tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); command.withTag(tag); } - InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); + InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); imageNames.add(tag); - return inputStream; + return new BuildImageCmdExec.ResponseImpl(inputStream); } - }; + }; } @Override From f18697161e744463be0d033095b450eaf2598cf7 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Tue, 3 Feb 2015 13:58:09 +0000 Subject: [PATCH 0061/1399] Repoint to shaded, imported jersey.repackaged guava (!) Signed-off-by: Nigel Magnay --- .../java/com/github/dockerjava/api/model/EventStreamItem.java | 4 +++- .../com/github/dockerjava/api/model/PushEventStreamItem.java | 4 ++-- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 4 +++- .../java/com/github/dockerjava/jaxrs/PushImageCmdExec.java | 4 +++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 98c61a862..6e6ce035a 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -1,12 +1,14 @@ package com.github.dockerjava.api.model; -import com.google.common.base.Objects; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; +import jersey.repackaged.com.google.common.base.Objects; + /** * Represents an event stream */ diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index df7f59f50..f5e845b29 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -1,12 +1,12 @@ package com.github.dockerjava.api.model; -import com.google.common.base.Objects; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.io.Serializable; +import jersey.repackaged.com.google.common.base.Objects; + /** * Represents an item returned from push */ diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 2b5d9a57a..faf3d9f23 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import com.google.common.collect.ImmutableList; + import static javax.ws.rs.client.Entity.entity; @@ -24,6 +24,8 @@ import com.github.dockerjava.api.model.EventStreamItem; import com.github.dockerjava.api.model.PushEventStreamItem; +import jersey.repackaged.com.google.common.collect.ImmutableList; + public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 838c9b89a..152f31a3b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import com.google.common.collect.ImmutableList; + import static javax.ws.rs.client.Entity.entity; @@ -21,6 +21,8 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushEventStreamItem; +// Shaded, but imported +import jersey.repackaged.com.google.common.collect.ImmutableList; public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { From b4d30f68f09587dbbd38dc4c2b98068f6e7dc57c Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Tue, 3 Feb 2015 14:30:56 +0000 Subject: [PATCH 0062/1399] Update test to show typed API. Signed-off-by: Nigel Magnay --- .../core/command/BuildImageCmdImplTest.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) 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 3692f56d1..8be2f8f8e 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -27,8 +27,10 @@ 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; + @Test(groups = "integration") public class BuildImageCmdImplTest extends AbstractDockerClientTest { @@ -170,18 +172,24 @@ public void testDockerIgnore() throws DockerException, } @Test - public void testNetCatDockerfileBuilder() throws InterruptedException { + public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("netcat").getFile()); - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); - String fullLog = asString(response); + String imageId = null; + + for(EventStreamItem item : response) { + String text = item.getStream(); + if( text.startsWith("Successfully built ")) { + imageId = StringUtils.substringBetween(text, + "Successfully built ", "\n").trim(); + } + } - assertThat(fullLog, containsString("Successfully built")); + assertNotNull(imageId, "Not successful in build"); - String imageId = StringUtils.substringBetween(fullLog, - "Successfully built ", "\\n\"}").trim(); InspectImageResponse inspectImageResponse = dockerClient .inspectImageCmd(imageId).exec(); From 6fa4cc0225a598fd756f36edabccd311de6c1cc1 Mon Sep 17 00:00:00 2001 From: Ted Crossman Date: Thu, 5 Feb 2015 07:59:12 -0800 Subject: [PATCH 0063/1399] Only override AuthConfig iff username/password/email/server address are all set Unless this is done, it is possible to create an invalid AuthConfig with null values for password and other fields. --- .../java/com/github/dockerjava/core/DockerClientConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 881a7663d..7513c7f29 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -253,7 +253,8 @@ public String getDockerCfgPath() { private AuthConfig getAuthConfig() { AuthConfig authConfig = null; - if(getUsername() != null) { + if (getUsername() != null && getPassword() != null && getEmail() != null + && getServerAddress() != null) { authConfig = new AuthConfig(); authConfig.setUsername(getUsername()); authConfig.setPassword(getPassword()); From ea72e14fd219359a9eab7249e433573daa3b023a Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 5 Feb 2015 20:27:36 +0100 Subject: [PATCH 0064/1399] Added testcase for conflicting ports binding --- .../command/StartContainerCmdImplTest.java | 385 ++++++++++-------- 1 file changed, 216 insertions(+), 169 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 10b656e66..7579b5ec6 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -17,6 +17,7 @@ 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; @@ -77,12 +78,15 @@ public void startContainerWithVolumes() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/opt/webapp1", "/opt/webapp2")); - dockerClient.startContainerCmd(container.getId()).withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)).exec(); + dockerClient + .startContainerCmd(container.getId()) + .withBinds(new Bind("/src/webapp1", volume1, ro), + new Bind("/src/webapp2", volume2)).exec(); dockerClient.waitContainerCmd(container.getId()).exec(); - inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + inspectContainerResponse = dockerClient.inspectContainerCmd( + container.getId()).exec(); assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); @@ -98,27 +102,29 @@ public void startContainerWithVolumesFrom() throws DockerException { Volume volume2 = new Volume("/opt/webapp2"); String container1Name = UUID.randomUUID().toString(); - + CreateContainerResponse container1 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") .withName(container1Name).exec(); LOG.info("Created container1 {}", container1.toString()); - dockerClient.startContainerCmd(container1.getId()).withBinds( - new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + dockerClient + .startContainerCmd(container1.getId()) + .withBinds(new Bind("/src/webapp1", volume1), + new Bind("/src/webapp2", volume2)).exec(); LOG.info("Started container1 {}", container1.toString()); - InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( - container1.getId()).exec(); + InspectContainerResponse inspectContainerResponse1 = dockerClient + .inspectContainerCmd(container1.getId()).exec(); assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); - CreateContainerResponse container2 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container2 {}", container2.toString()); - dockerClient.startContainerCmd(container2.getId()).withVolumesFrom(container1Name).exec(); + dockerClient.startContainerCmd(container2.getId()) + .withVolumesFrom(container1Name).exec(); LOG.info("Started container2 {}", container2.toString()); InspectContainerResponse inspectContainerResponse2 = dockerClient @@ -134,30 +140,29 @@ public void startContainerWithDns() throws DockerException { String anotherDnsServer = "8.8.4.4"; CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true").exec(); + .createContainerCmd("busybox").withCmd("true").exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).withDns(aDnsServer, anotherDnsServer).exec(); + dockerClient.startContainerCmd(container.getId()) + .withDns(aDnsServer, anotherDnsServer).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), - contains(aDnsServer, anotherDnsServer)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getDns()), contains(aDnsServer, anotherDnsServer)); } - + @Test public void startContainerWithDnsSearch() throws DockerException { String dnsSearch = "example.com"; - + CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true").exec(); + .createContainerCmd("busybox").withCmd("true").exec(); LOG.info("Created container {}", container.toString()); @@ -166,15 +171,16 @@ public void startContainerWithDnsSearch() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient .inspectContainerCmd(container.getId()).exec(); - dockerClient.startContainerCmd(container.getId()).withDnsSearch(dnsSearch).exec(); + dockerClient.startContainerCmd(container.getId()) + .withDnsSearch(dnsSearch).exec(); - inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + inspectContainerResponse = dockerClient.inspectContainerCmd( + container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDnsSearch()), - contains(dnsSearch)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getDnsSearch()), contains(dnsSearch)); } - + @Test public void startContainerWithPortBindings() throws DockerException { @@ -182,8 +188,8 @@ public void startContainerWithPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true").withExposedPorts(tcp22, tcp23).exec(); + .createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).exec(); LOG.info("Created container {}", container.toString()); @@ -197,22 +203,52 @@ public void startContainerWithPortBindings() throws DockerException { portBindings.bind(tcp23, Ports.Binding(11023)); portBindings.bind(tcp23, Ports.Binding(11024)); - dockerClient.startContainerCmd(container.getId()).withPortBindings(portBindings).exec(); + dockerClient.startContainerCmd(container.getId()) + .withPortBindings(portBindings).exec(); + + inspectContainerResponse = dockerClient.inspectContainerCmd( + container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig() + .getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024)))); + + } + + @Test + public void startContainerWithConflictingPortBindings() + throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).exec(); - 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)))); + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11022)); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], - is(equalTo(Ports.Binding(11023)))); + try { + dockerClient.startContainerCmd(container.getId()) + .withPortBindings(portBindings).exec(); + fail("expected InternalServerErrorException"); + } catch (InternalServerErrorException e) { - assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], - is(equalTo(Ports.Binding(11024)))); + } } @@ -220,11 +256,12 @@ public void startContainerWithPortBindings() throws DockerException { public void startContainerWithLinking() throws DockerException { CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").withName("container1").exec(); + .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 @@ -233,7 +270,8 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getId(), + startsWith(container1.getId())); assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse1.getState(), is(notNullValue())); @@ -245,12 +283,14 @@ public void startContainerWithLinking() throws DockerException { } CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("true").withName("container2").exec(); + .createContainerCmd("busybox").withCmd("true") + .withName("container2").exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container2.getId()).withLinks(new Link("container1", "container1Link")).exec(); + + dockerClient.startContainerCmd(container2.getId()) + .withLinks(new Link("container1", "container1Link")).exec(); InspectContainerResponse inspectContainerResponse2 = dockerClient .inspectContainerCmd(container2.getId()).exec(); @@ -258,10 +298,15 @@ public void startContainerWithLinking() throws DockerException { 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().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); - assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getHostConfig(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks() + .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())); @@ -269,16 +314,16 @@ public void startContainerWithLinking() throws DockerException { } - @Test public void startContainer() throws DockerException { CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd(new String[] { "top" }).exec(); + .createContainerCmd("busybox").withCmd(new String[] { "top" }) + .exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); - + dockerClient.startContainerCmd(container.getId()).exec(); InspectContainerResponse inspectContainerResponse = dockerClient @@ -301,7 +346,7 @@ public void startContainer() throws DockerException { is(equalTo(0))); } } - + @Test public void testStartNonExistingContainer() throws DockerException { try { @@ -310,171 +355,173 @@ public void testStartNonExistingContainer() throws DockerException { } catch (NotFoundException e) { } } - + /** * 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. + * --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 { + public void startContainerWithNetworkMode() throws DockerException { + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .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())); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()) + .withNetworkMode("host").exec(); - dockerClient.startContainerCmd(container.getId()).withNetworkMode("host").exec(); + inspectContainerResponse = dockerClient.inspectContainerCmd( + container.getId()).exec(); - inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), + is(equalTo("host"))); + } - assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), - is(equalTo("host"))); - } - @Test - public void startContainerWithCapAddAndCapDrop() throws DockerException { + public void startContainerWithCapAddAndCapDrop() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999").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())); + + dockerClient.startContainerCmd(container.getId()).withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); - assertThat(container.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - dockerClient.startContainerCmd(container.getId()) - .withCapAdd(NET_ADMIN) - .withCapDrop(MKNOD).exec(); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getCapAdd()), contains(NET_ADMIN)); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); - - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getCapDrop()), contains(MKNOD)); + } - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), - contains(NET_ADMIN)); - - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), - contains(MKNOD)); - } - @Test - public void startContainerWithDevices() throws DockerException { + public void startContainerWithDevices() throws DockerException { + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999").exec(); + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); - LOG.info("Created container {}", container.toString()); + dockerClient.startContainerCmd(container.getId()) + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) + .exec(); - assertThat(container.getId(), not(isEmptyString())); + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); - dockerClient.startContainerCmd(container.getId()) - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) - .exec(); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); - - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getDevices()), contains(new Device("rwm", "/dev/nulo", + "/dev/zero"))); + } - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), - contains(new Device("rwm", "/dev/nulo", "/dev/zero"))); - } - @Test - public void startContainerWithRestartPolicy() throws DockerException { + public void startContainerWithRestartPolicy() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999").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())); - RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - - dockerClient.startContainerCmd(container.getId()) - .withRestartPolicy(restartPolicy) - .exec(); + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); - - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + dockerClient.startContainerCmd(container.getId()) + .withRestartPolicy(restartPolicy).exec(); - assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), - is(equalTo(restartPolicy))); - } + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), + is(equalTo(restartPolicy))); + } @Test - public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerException { - + public void existingHostConfigIsPreservedByBlankStartCmd() + throws DockerException { + String dnsServer = "8.8.8.8"; - - // prepare a container with custom DNS + + // prepare a container with custom DNS CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withDns(dnsServer) + .createContainerCmd("busybox").withDns(dnsServer) .withCmd("true").exec(); - + LOG.info("Created container {}", container.toString()); - + assertThat(container.getId(), not(isEmptyString())); - - // start container _without_any_customization_ (important!) + + // 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(); + // The DNS setting survived. - assertThat(inspectContainerResponse.getHostConfig().getDns(), is(notNullValue())); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), - contains(dnsServer)); + assertThat(inspectContainerResponse.getHostConfig().getDns(), + is(notNullValue())); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getDns()), contains(dnsServer)); } @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. + 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 + // If this test starts to fail, this behavior changed and a review of + // implementation // and documentation might be needed. - + String dnsServer = "8.8.8.8"; - - // prepare a container with custom DNS + + // prepare a container with custom DNS CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withDns(dnsServer) + .createContainerCmd("busybox").withDns(dnsServer) .withCmd("true").exec(); - + LOG.info("Created container {}", container.toString()); - + assertThat(container.getId(), not(isEmptyString())); - - // modify another setting in start command. Leave DNS unchanged. - dockerClient.startContainerCmd(container.getId()).withPublishAllPorts(true).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))); + + // modify another setting in start command. Leave DNS unchanged. + dockerClient.startContainerCmd(container.getId()) + .withPublishAllPorts(true).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))); } @Test From ad3277235c55d29df40692295a05b989315bec03 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 5 Feb 2015 22:26:38 +0100 Subject: [PATCH 0065/1399] Fix events tests --- .../dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java | 2 +- .../com/github/dockerjava/core/command/EventsCmdImplTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java index 42158e01f..af141bf3f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java @@ -57,7 +57,7 @@ public void filter(ClientRequestContext requestContext, ClientResponseContext re } } - public String getBodyAsMessage(ClientResponseContext responseContext) + private String getBodyAsMessage(ClientResponseContext responseContext) throws IOException { if (responseContext.hasEntity()) { int contentLength = responseContext.getLength(); 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 941657a19..4d0b0c15a 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -99,7 +99,7 @@ private int generateEvents() { String testImage = "busybox"; asString(dockerClient.pullImageCmd(testImage).exec()); CreateContainerResponse container = dockerClient - .createContainerCmd(testImage).withCmd("echo").exec(); + .createContainerCmd(testImage).withCmd("sleep 9999").exec(); dockerClient.startContainerCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); return KNOWN_NUM_EVENTS; From 62cd7e9dd53e500216bf913c7c89463ccb3cf312 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 5 Feb 2015 22:26:38 +0100 Subject: [PATCH 0066/1399] Fix events tests --- .../dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java | 2 +- .../com/github/dockerjava/core/command/EventsCmdImplTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java index 42158e01f..af141bf3f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java @@ -57,7 +57,7 @@ public void filter(ClientRequestContext requestContext, ClientResponseContext re } } - public String getBodyAsMessage(ClientResponseContext responseContext) + private String getBodyAsMessage(ClientResponseContext responseContext) throws IOException { if (responseContext.hasEntity()) { int contentLength = responseContext.getLength(); 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 941657a19..6f227e43a 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -99,7 +99,7 @@ private int generateEvents() { String testImage = "busybox"; asString(dockerClient.pullImageCmd(testImage).exec()); CreateContainerResponse container = dockerClient - .createContainerCmd(testImage).withCmd("echo").exec(); + .createContainerCmd(testImage).withCmd("sleep", "9999").exec(); dockerClient.startContainerCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); return KNOWN_NUM_EVENTS; From e820c21208343856016a7f2d93e2f4ab3bcfe16d Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 6 Feb 2015 13:45:53 +0000 Subject: [PATCH 0067/1399] Introduce the notion of a Dockerfile, which can read specifications and generate the resultant TAR file. Splitting the file down into statements makes it easier to understand and extend, particularly around property replacements. This separates out the functionality from BuildImageCmd so that it can be tested separately, and re-used elsewhere. Signed-off-by: Nigel Magnay --- .../core/dockerfile/Dockerfile.java | 282 ++++++++++++++++++ .../core/dockerfile/DockerfileStatement.java | 208 +++++++++++++ .../core/dockerfile/DockerfileTest.java | 50 ++++ 3 files changed, 540 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java create mode 100644 src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java create mode 100644 src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java new file mode 100644 index 000000000..72c6c7956 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -0,0 +1,282 @@ +package com.github.dockerjava.core.dockerfile; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.core.GoLangFileMatch; +import com.github.dockerjava.core.GoLangFileMatchException; +import com.github.dockerjava.core.GoLangMatchFileFilter; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import jersey.repackaged.com.google.common.base.Function; +import jersey.repackaged.com.google.common.base.Objects; +import jersey.repackaged.com.google.common.base.Optional; +import jersey.repackaged.com.google.common.base.Predicate; +import jersey.repackaged.com.google.common.collect.Collections2; + +/** + * Parse a Dockerfile. + */ +public class Dockerfile { + + public final File dockerFile; + + public Dockerfile(File dockerFile) { + + if (!dockerFile.exists()) { + throw new IllegalStateException( + String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); + } + + if (!dockerFile.isFile()) { + throw new IllegalStateException( + String.format("Dockerfile %s is not a file", dockerFile.getAbsolutePath())); + } + + this.dockerFile = dockerFile; + + } + + private static class LineTransformer + implements Function> { + + private int line = 0; + + @Override + public Optional apply(String input) { + try { + line++; + return DockerfileStatement.createFromLine(input); + + } catch (Exception ex) { + throw new DockerClientException("Error on dockerfile line " + line); + } + } + } + + /** + * Not needed in modern guava + */ + private static class MissingOptionalFilter + implements Predicate> { + + @Override + public boolean apply(Optional optional) { + return (optional.orNull() != null); + } + } + + /** + * Not needed in modern guava + */ + private static class OptionalItemTransformer + implements Function, DockerfileStatement> { + + @Override + public DockerfileStatement apply(Optional optional) { + return optional.orNull(); + } + } + + public Collection getStatements() throws IOException { + Collection dockerFileContent = FileUtils.readLines(dockerFile); + + if (dockerFileContent.size() <= 0) { + throw new DockerClientException(String.format( + "Dockerfile %s is empty", dockerFile)); + } + + Collection> optionals = Collections2 + .transform(dockerFileContent, new LineTransformer()); + + // Modern guava would be done here, + // With simply return Optional.presentInstances( optionals ); + // + // So this entire function could simply be + // return Optional.presentInstances( Collections2.transform( FileUtils.readLines(dockerFile), new LineTransformer() ) ); + // + // Until the dawn of that day, do it manually + + return Collections2.transform(Collections2.filter(optionals, new MissingOptionalFilter()), + new OptionalItemTransformer()); + + } + + public List getIgnores() throws IOException { + List ignores = new ArrayList(); + File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); + if (dockerIgnoreFile.exists()) { + int lineNumber = 0; + List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); + for (String pattern : dockerIgnoreFileContent) { + lineNumber++; + pattern = pattern.trim(); + if (pattern.isEmpty()) { + continue; // skip empty lines + } + pattern = FilenameUtils.normalize(pattern); + try { + // validate pattern and make sure we aren't excluding Dockerfile + if (GoLangFileMatch.match(pattern, "Dockerfile")) { + throw new DockerClientException( + String.format( + "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", + pattern, lineNumber)); + } + ignores.add(pattern); + } catch (GoLangFileMatchException e) { + throw new DockerClientException(String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + } + } + } + return ignores; + } + + + public ScannedResult parse() throws IOException { + return new ScannedResult(); + } + + + public File getDockerFolder() { + return dockerFile.getParentFile(); + } + + + /** + * Result of scanning / parsing a docker file. + */ + public class ScannedResult { + + final List ignores; + final Map environmentMap = new HashMap(); + final List filesToAdd = new ArrayList(); + + public InputStream buildDockerFolderTar() { + + // ARCHIVE TAR + File dockerFolderTar = null; + + try { + String archiveNameWithOutExtension = UUID.randomUUID().toString(); + + dockerFolderTar = CompressArchiveUtil.archiveTARFiles(getDockerFolder(), + filesToAdd, + archiveNameWithOutExtension); + return FileUtils.openInputStream(dockerFolderTar); + + } catch (IOException ex) { + FileUtils.deleteQuietly(dockerFolderTar); + throw new DockerClientException( + "Error occurred while preparing Docker context folder.", ex); + } + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("ignores", ignores) + .add("environmentMap", environmentMap) + .add("filesToAdd", filesToAdd) + .toString(); + } + + public ScannedResult() throws IOException { + + ignores = getIgnores(); + filesToAdd.add(dockerFile); + + for (DockerfileStatement statement : getStatements()) { + if (statement instanceof DockerfileStatement.Env) { + processEnvStatement((DockerfileStatement.Env) statement); + } else if (statement instanceof DockerfileStatement.Add) { + processAddStatement((DockerfileStatement.Add) statement); + } + } + } + + private void processAddStatement(DockerfileStatement.Add add) throws IOException { + + add = add.transform(environmentMap); + + if (add.isFileResource()) { + + File dockerFolder = getDockerFolder(); + String resource = add.source; + + File src = new File(resource); + if (!src.isAbsolute()) { + src = new File(dockerFolder, resource) + .getCanonicalFile(); + } 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, + CompressArchiveUtil.relativize(dockerFolder, + src))) { + filesToAdd.add(src); + } else { + throw new DockerClientException( + String.format( + "Source file %s is excluded by .dockerignore file", + src)); + } + } + } + + private Collection resolveWildcards(File file, List ignores) { + List filesToAdd = new ArrayList(); + + File parent = file.getParentFile(); + if (parent != null) { + if (parent.isDirectory()) { + Collection files = FileUtils.listFiles(parent, + new GoLangMatchFileFilter(parent, ignores), + TrueFileFilter.INSTANCE); + filesToAdd.addAll(files); + } else { + filesToAdd.addAll(resolveWildcards(parent, ignores)); + } + } else { + throw new DockerClientException(String.format( + "Source file %s doesn't exist", file)); + } + + return filesToAdd; + } + + private void processEnvStatement(DockerfileStatement.Env env) { + + environmentMap.put(env.variable, env.value); + } + + } + +} diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java new file mode 100644 index 000000000..1e2ddf1b0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -0,0 +1,208 @@ +package com.github.dockerjava.core.dockerfile; + +import com.github.dockerjava.api.DockerClientException; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import jersey.repackaged.com.google.common.base.Objects; +import jersey.repackaged.com.google.common.base.Optional; + +/** + * A statement present in a dockerfile. + */ +public abstract class DockerfileStatement { + + private DockerfileStatement() { + } + + public T transform(Map env) { + return (T) this; + } + + protected String filterForEnvironmentVars(Map environmentMap, + String extractedResource) { + + if (environmentMap.size() > 0) { + + String currentResourceContent = extractedResource; + + for (Map.Entry entry : environmentMap.entrySet()) { + + String variable = entry.getKey(); + + String replacementValue = entry.getValue(); + + // handle: $VARIABLE case + currentResourceContent = currentResourceContent.replaceAll( + "\\$" + variable, replacementValue); + + // handle ${VARIABLE} case + currentResourceContent = currentResourceContent.replaceAll( + "\\$\\{" + variable + "\\}", replacementValue); + + } + + return currentResourceContent; + } else { + return extractedResource; + } + } + + + /** + * A statement that we don't particularly care about. + */ + public static class OtherLine extends DockerfileStatement { + + public final String statement; + + public OtherLine(String statement) { + this.statement = statement; + } + + @Override + public String toString() { + return statement; + } + } + + /** + * An ADD or a COPY + */ + public static class Add extends DockerfileStatement { + + private static final Pattern ADD_OR_COPY_PATTERN = Pattern + .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); + + public final String source; + public final String destination; + + private Add(String source, String destination) { + this.source = source; + this.destination = destination; + } + + private Add(final Matcher matcher) { + source = matcher.group(2); + destination = matcher.group(3); + } + + @Override + public Add transform(Map env) { + String resource = filterForEnvironmentVars(env, source).trim(); + return new Add(resource, destination); + } + + public boolean isFileResource() { + URI uri; + try { + uri = new URI(source); + } catch (URISyntaxException e) { + return false; + } + return uri.getScheme() == null || "file".equals(uri.getScheme()); + } + + /** + * Createa an Add if it matches, or missing if not. + * + * @param statement statement that may be an ADD or a COPY + * @return optional typed item. + */ + public static Optional create(String statement) { + Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } + + if (matcher.groupCount() != 3) { + throw new DockerClientException("Wrong ADD or COPY format"); + } + + return Optional.of(new Add(matcher)); + } + + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("source", source) + .add("destination", destination) + .toString(); + } + } + + public static class Env extends DockerfileStatement { + + private static final Pattern ENV_PATTERN = Pattern + .compile("^ENV\\s+(.*)\\s+(.*)$"); + + public final String variable; + public final String value; + + private Env(String variable, String value) { + this.variable = variable; + this.value = value; + } + + private Env(Matcher envMatcher) { + this.variable = envMatcher.group(1).trim(); + this.value = envMatcher.group(2).trim(); + } + + public static Optional create(String statement) { + Matcher matcher = ENV_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } + + if (matcher.groupCount() != 2) { + throw new DockerClientException("Wrong ENV format"); + } + + return Optional.of(new Env(matcher)); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("variable", variable) + .add("value", value) + .toString(); + } + } + + /** + * Return a dockerfile statement + */ + public static Optional createFromLine(String cmd) { + if (cmd.trim().isEmpty() || cmd.startsWith("#")) { + return Optional.absent(); + } + + Optional line; + + line = Add.create(cmd); + + // if (line.isPresent()) { : Newer guava + if (line.orNull() != null) { + return line; + } + + line = Env.create(cmd); + + // if (line.isPresent()) { : Newer guava + if (line.orNull() != null) { + return line; + } + + return Optional.of(new OtherLine(cmd)); + + + } + +} diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java new file mode 100644 index 000000000..428511c2e --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java @@ -0,0 +1,50 @@ +package com.github.dockerjava.core.dockerfile; + +import junit.framework.TestCase; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class DockerfileTest extends TestCase { + + private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class); + + @Test + public void testAllItems() throws IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("netcat").getFile()); + + File root = baseDir.getParentFile(); + + Map dockerfiles = new HashMap(); + Map results = new HashMap(); + + for (File child : root.listFiles()) { + if (new File(child, "Dockerfile").exists()) { + Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); + dockerfiles.put(child.getName(), dockerfile); + } + } + + for (String name : dockerfiles.keySet()) { + log.info("Scanning {}", name); + try { + results.put(name, dockerfiles.get(name).parse()); + } catch (Exception ex) { + log.error("Error in {}", name, ex); + } + + } + + for (String name : results.keySet()) { + log.info("Name: {} = {}", name, results.get(name)); + } + } + +} \ No newline at end of file From 509bd2e9a1a95910e2f446642f7e764a36452e0f Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 6 Feb 2015 13:54:23 +0000 Subject: [PATCH 0068/1399] Make BuildImage use DockerFile impl. Signed-off-by: Nigel Magnay --- .../core/command/BuildImageCmdImpl.java | 213 +----------------- 1 file changed, 6 insertions(+), 207 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 468dac7e7..0634651b2 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -24,6 +24,7 @@ import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; +import com.github.dockerjava.core.dockerfile.Dockerfile; import static jersey.repackaged.com.google.common.base.Preconditions.*; @@ -34,14 +35,8 @@ */ public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { - private static final Pattern ADD_OR_COPY_PATTERN = Pattern - .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); - - private static final Pattern ENV_PATTERN = Pattern - .compile("^ENV\\s+(.*)\\s+(.*)$"); private InputStream tarInputStream = null; - private File tarFile = null; private String tag; private boolean noCache; private boolean remove = true; @@ -50,9 +45,12 @@ public class BuildImageCmdImpl extends AbstrDockerCmd dockerFileContent = FileUtils.readLines(dockerFile); - - if (dockerFileContent.size() <= 0) { - throw new DockerClientException(String.format( - "Dockerfile %s is empty", dockerFile)); - } - - List ignores = new ArrayList(); - File dockerIgnoreFile = new File(dockerFolder, ".dockerignore"); - if (dockerIgnoreFile.exists()) { - int lineNumber = 0; - List dockerIgnoreFileContent = FileUtils - .readLines(dockerIgnoreFile); - for (String pattern : dockerIgnoreFileContent) { - lineNumber++; - pattern = pattern.trim(); - if (pattern.isEmpty()) { - continue; // skip empty lines - } - pattern = FilenameUtils.normalize(pattern); - try { - // validate pattern and make sure we aren't excluding - // Dockerfile - if (GoLangFileMatch.match(pattern, "Dockerfile")) { - throw new DockerClientException( - String.format( - "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", - pattern, lineNumber)); - } - ignores.add(pattern); - } catch (GoLangFileMatchException e) { - throw new DockerClientException( - String.format( - "Invalid pattern '%s' on line %s in .dockerignore file", - pattern, lineNumber)); - } - } - } - List filesToAdd = new ArrayList(); - filesToAdd.add(dockerFile); - - Map environmentMap = new HashMap(); - - int lineNumber = 0; - - for (String cmd : dockerFileContent) { - - lineNumber++; - - if (cmd.trim().isEmpty() || cmd.startsWith("#")) - continue; // skip emtpy and commend lines - - final Matcher envMatcher = ENV_PATTERN.matcher(cmd.trim()); - - if (envMatcher.find()) { - if (envMatcher.groupCount() != 2) - throw new DockerClientException(String.format( - "Wrong ENV format on line [%d]", lineNumber)); - - String variable = envMatcher.group(1).trim(); - - String value = envMatcher.group(2).trim(); - - environmentMap.put(variable, value); - } - - final Matcher matcher = ADD_OR_COPY_PATTERN.matcher(cmd.trim()); - if (matcher.find()) { - if (matcher.groupCount() != 3) { - throw new DockerClientException(String.format( - "Wrong ADD or COPY format on line [%d]", - lineNumber)); - } - - String extractedResource = matcher.group(2); - - String resource = filterForEnvironmentVars( - extractedResource, environmentMap).trim(); - - if (isFileResource(resource)) { - File src = new File(resource); - if (!src.isAbsolute()) { - src = new File(dockerFolder, resource) - .getCanonicalFile(); - } 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, - CompressArchiveUtil.relativize(dockerFolder, - src))) { - filesToAdd.add(src); - } else { - throw new DockerClientException( - String.format( - "Source file %s is excluded by .dockerignore file", - src)); - } - } - } - } - return CompressArchiveUtil.archiveTARFiles(dockerFolder, - filesToAdd, archiveNameWithOutExtension); - } catch (IOException ex) { - FileUtils.deleteQuietly(dockerFolderTar); - throw new DockerClientException( - "Error occurred while preparing Docker context folder.", ex); - } - } - - private Collection resolveWildcards(File file, List ignores) { - List filesToAdd = new ArrayList(); - - File parent = file.getParentFile(); - if (parent != null) { - if (parent.isDirectory()) { - Collection files = FileUtils.listFiles(parent, - new GoLangMatchFileFilter(parent, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else { - filesToAdd.addAll(resolveWildcards(parent, ignores)); - } - } else { - throw new DockerClientException(String.format( - "Source file %s doesn't exist", file)); - } - - return filesToAdd; - } - - private String filterForEnvironmentVars(String extractedResource, - Map environmentMap) { - - if (environmentMap.size() > 0) { - - String currentResourceContent = extractedResource; - - for (Map.Entry entry : environmentMap.entrySet()) { - - String variable = entry.getKey(); - - String replacementValue = entry.getValue(); - - // handle: $VARIABLE case - currentResourceContent = currentResourceContent.replaceAll( - "\\$" + variable, replacementValue); - - // handle ${VARIABLE} case - currentResourceContent = currentResourceContent.replaceAll( - "\\$\\{" + variable + "\\}", replacementValue); - - } - - return currentResourceContent; - } else - return extractedResource; - } - - private static boolean isFileResource(String resource) { - URI uri; - try { - uri = new URI(resource); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - return uri.getScheme() == null || "file".equals(uri.getScheme()); - } } From 06fea216b583237d4f0441e2963cbadde2a5e819 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Feb 2015 20:49:14 +0100 Subject: [PATCH 0069/1399] Fix Issue #110 --- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 2 ++ .../dockerjava/jaxrs/CopyFileFromContainerCmdExec.java | 2 +- src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java | 3 ++- .../com/github/dockerjava/jaxrs/KillContainerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/LogContainerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/PauseContainerCmdExec.java | 2 +- src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java | 2 +- .../java/com/github/dockerjava/jaxrs/PushImageCmdExec.java | 2 ++ .../com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java | 3 +-- .../com/github/dockerjava/jaxrs/RestartContainerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/StartContainerCmdExec.java | 5 +++-- .../com/github/dockerjava/jaxrs/StopContainerCmdExec.java | 2 +- .../java/com/github/dockerjava/jaxrs/TagImageCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java | 4 +--- 14 files changed, 19 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 faf3d9f23..ed36c62c0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -81,6 +81,8 @@ public Iterable getItems() throws IOException { ObjectReader reader = mapper.reader(EventStreamItem.class); // and then do other configuration, if any, and read: Iterator items = reader.readValues(proxy); + + proxy.close(); return ImmutableList.copyOf(items); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 27b4d5bd6..3061df53a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -30,7 +30,7 @@ protected InputStream execute(CopyFileFromContainerCmd command) { LOGGER.trace("POST: " + webResource.toString()); - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java index aff72fab2..c585f31c9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java @@ -23,6 +23,7 @@ protected Info execute(InfoCmd command) { WebTarget webResource = getBaseResource().path("/info"); LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); } + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index 21a6b9d67..6164064c9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -29,7 +29,7 @@ protected Void execute(KillContainerCmd command) { } LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); 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 46d259424..ad1d61853 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -29,7 +29,7 @@ protected InputStream execute(LogContainerCmd command) { .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); LOGGER.trace("GET: {}", webResource); - return webResource.request().get(Response.class).readEntity(InputStream.class); + return webResource.request().get().readEntity(InputStream.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index 6b3eeaf08..429c61edb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -26,7 +26,7 @@ protected Void execute(PauseContainerCmd command) { command.getContainerId()); LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index abfb0f4cc..f8a172a11 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -21,7 +21,7 @@ protected Void execute(PingCmd command) { WebTarget webResource = getBaseResource().path("/_ping"); LOGGER.trace("GET: {}", webResource); - webResource.request().get(Response.class); + webResource.request().get().close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 152f31a3b..8a9b9ebc9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -74,6 +74,8 @@ public Iterable getItems() throws IOException { // and then do other configuration, if any, and read: Iterator items = reader.readValues(proxy); + proxy.close(); + return ImmutableList.copyOf(items); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index 7a479ce2f..d2ff1b837 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -23,8 +23,7 @@ protected Void execute(RemoveContainerCmd command) { .queryParam("force", command.hasForceEnabled() ? "1" : "0"); LOGGER.trace("DELETE: {}", webResource); - /*String response = */webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); -// LOGGER.trace("Response: {}", response); + webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index b08aa0328..9ac76a36a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -27,7 +27,7 @@ protected Void execute(RestartContainerCmd command) { .queryParam("t", String.valueOf(command.getTimeout())); LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 0e7697e4e..661317266 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -4,6 +4,7 @@ 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; @@ -23,8 +24,8 @@ protected Void execute(StartContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", command.getContainerId()); LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)); - + webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)).close(); + return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index 956f3d0b7..bf683be59 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -26,7 +26,7 @@ protected Void execute(StopContainerCmd command) { .queryParam("t", String.valueOf(command.getTimeout())); LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index b1c770bab..dfbeba072 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -24,7 +24,7 @@ protected Void execute(TagImageCmd command) { .queryParam("force", command.hasForceEnabled() ? "1" : "0"); LOGGER.trace("POST: {}", webResource); - webResource.request().post(null); + webResource.request().post(null).close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java index 361f9adcf..7fed603a5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java @@ -1,9 +1,7 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.Entity; 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; @@ -25,7 +23,7 @@ protected Void execute(UnpauseContainerCmd command) { LOGGER.trace("POST: {}", webResource); webResource.request().accept(MediaType.APPLICATION_JSON) - .post(Entity.entity(Response.class, MediaType.APPLICATION_JSON)); + .post(null).close(); return null; } From abee7f659e8431066a8b3d75daf455d3fed08b89 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Feb 2015 21:06:45 +0100 Subject: [PATCH 0070/1399] Move utilities classes to core package --- .../github/dockerjava/api/command/TopContainerResponse.java | 2 +- .../dockerjava/{jaxrs => core}/util/JsonClientFilter.java | 2 +- .../dockerjava/{jaxrs => core}/util/LoggingFilter.java | 2 +- .../{jaxrs => core}/util/ResponseStatusExceptionFilter.java | 2 +- .../{jaxrs => core}/util/SelectiveLoggingFilter.java | 2 +- .../github/dockerjava/{jaxrs => core}/util/guava/Guava.java | 2 +- .../{jaxrs => core}/util/guava/PercentEscaper.java | 2 +- .../{jaxrs => core}/util/guava/UnicodeEscaper.java | 2 +- .../github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 6 +++--- .../java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/JsonClientFilter.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/LoggingFilter.java (99%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/ResponseStatusExceptionFilter.java (98%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/SelectiveLoggingFilter.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/guava/Guava.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/guava/PercentEscaper.java (99%) rename src/main/java/com/github/dockerjava/{jaxrs => core}/util/guava/UnicodeEscaper.java (99%) diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index 099da368f..89aa36451 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.command; -import static com.github.dockerjava.jaxrs.util.guava.Guava.join; +import static com.github.dockerjava.core.util.guava.Guava.join; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java rename to src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java index e0eaa4a4a..f2911d961 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.core.util; import javax.ws.rs.client.ClientRequestContext; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java similarity index 99% rename from src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java rename to src/main/java/com/github/dockerjava/core/util/LoggingFilter.java index eda72b835..5a72ba237 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.core.util; /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java similarity index 98% rename from src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java rename to src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java index af141bf3f..7e9708564 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.core.util; import java.io.EOFException; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java rename to src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java index 6771ebe88..8cfe88b73 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.core.util; import java.io.IOException; import java.util.Collections; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java b/src/main/java/com/github/dockerjava/core/util/guava/Guava.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java rename to src/main/java/com/github/dockerjava/core/util/guava/Guava.java index 13f87142a..84e27b34e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/guava/Guava.java +++ b/src/main/java/com/github/dockerjava/core/util/guava/Guava.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.github.dockerjava.jaxrs.util.guava; +package com.github.dockerjava.core.util.guava; public class Guava { diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java similarity index 99% rename from src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java rename to src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java index 8625121ef..e136ec7b8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/guava/PercentEscaper.java +++ b/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.github.dockerjava.jaxrs.util.guava; +package com.github.dockerjava.core.util.guava; import jersey.repackaged.com.google.common.base.Preconditions; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java similarity index 99% rename from src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java rename to src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java index b0b74d8fa..9bee03a71 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/guava/UnicodeEscaper.java +++ b/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.github.dockerjava.jaxrs.util.guava; +package com.github.dockerjava.core.util.guava; import jersey.repackaged.com.google.common.base.Preconditions; diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 78cd8427c..cdb851175 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -61,9 +61,9 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.util.JsonClientFilter; -import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; -import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; +import com.github.dockerjava.core.util.JsonClientFilter; +import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; +import com.github.dockerjava.core.util.SelectiveLoggingFilter; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 84ede89b4..001ba1d09 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static com.github.dockerjava.jaxrs.util.guava.Guava.urlPathSegmentEscaper; +import static com.github.dockerjava.core.util.guava.Guava.urlPathSegmentEscaper; import java.util.List; From cbcfba47ed2af9778ee1cd238fedb73efb549cdc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Feb 2015 21:07:22 +0100 Subject: [PATCH 0071/1399] switch to 1.0.0-SNAPSHOT --- CHANGELOG.md | 4 +++- README.md | 2 +- pom.xml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80b6fc4ab..3525f87e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,14 @@ Change Log === -docker-java-0.10.6-SNAPSHOT +docker-java-1.0.0-SNAPSHOT --- + * [#142](https://github.com/docker-java/docker-java/pull/142) Reduce Logging Level * [#138](https://github.com/docker-java/docker-java/pull/138) Apache CXF interopabilty * [#137](https://github.com/docker-java/docker-java/pull/137) Multiple volumesFrom option when creating a container * [#135](https://github.com/docker-java/docker-java/pull/135) Update to latest unix-socket-factory * [#134](https://github.com/docker-java/docker-java/pull/134) Remove Google Guava as dependency + * [#131](https://github.com/docker-java/docker-java/pull/128) Utility classes and streamed JSON representations * [#128](https://github.com/docker-java/docker-java/pull/128) Allow unauthorized pullImageCmd docker-java-0.10.5 diff --git a/README.md b/README.md index 63c8d64b9..717b1b655 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 0.10.6-SNAPSHOT + 1.0.0-SNAPSHOT ## Documentation diff --git a/pom.xml b/pom.xml index 3ae2e1f82..82b7ce822 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 0.10.6-SNAPSHOT + 1.0.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From 1d098f8604e389476060eaa38142544dcbe84f65 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 7 Feb 2015 16:18:08 +0100 Subject: [PATCH 0072/1399] Fix Issue #147 --- .../dockerjava/core/util/ResponseStatusExceptionFilter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java index 7e9708564..99893a429 100644 --- a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java @@ -37,6 +37,7 @@ public void filter(ClientRequestContext requestContext, ClientResponseContext re case 200: case 201: case 204: + case 301: return; case 304: throw new NotModifiedException(getBodyAsMessage(responseContext)); From 8af3d6fa83a0298a40ad2075fc4f48cd789b376f Mon Sep 17 00:00:00 2001 From: Arthur Tsang Date: Sun, 8 Feb 2015 00:10:22 -0800 Subject: [PATCH 0073/1399] feat(save): add save image to docker client add saveImageCmd which will return a InputStream. the file is a tar file. https://docs.docker.com/reference/api/docker_remote_api_v1.15/#image-tarball-format --- .../github/dockerjava/api/DockerClient.java | 2 + .../api/command/DockerCmdExecFactory.java | 2 + .../dockerjava/api/command/SaveImageCmd.java | 39 ++++++++++ .../dockerjava/core/DockerClientImpl.java | 77 +++---------------- .../core/command/SaveImageCmdImpl.java | 63 +++++++++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 38 +-------- .../dockerjava/jaxrs/SaveImageCmdExec.java | 44 +++++++++++ .../core/TestDockerCmdExecFactory.java | 3 + .../core/command/SaveImageCmdImplTest.java | 62 +++++++++++++++ 9 files changed, 228 insertions(+), 102 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index f7addfa27..c2b15cf34 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -39,6 +39,8 @@ public CreateImageCmd createImageCmd(String repository, public ListImagesCmd listImagesCmd(); public InspectImageCmd inspectImageCmd(String imageId); + + public SaveImageCmd saveImageCmd(String name); /** * * CONTAINER API * 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 73381d692..ca2bbcae0 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -22,6 +22,8 @@ public interface DockerCmdExecFactory extends Closeable { public PullImageCmd.Exec createPullImageCmdExec(); public PushImageCmd.Exec createPushImageCmdExec(); + + public SaveImageCmd.Exec createSaveImageCmdExec(); public CreateImageCmd.Exec createCreateImageCmdExec(); diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java new file mode 100644 index 000000000..b8a5af4a2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushEventStreamItem; + +import java.io.IOException; +import java.io.InputStream; + +public interface SaveImageCmd extends DockerCmd{ + + public String getName(); + + public String getTag(); + + /** + * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + public SaveImageCmd withName(String name); + + /** + * @param tag The image's tag. Not null. + */ + public SaveImageCmd withTag(String tag); + + public AuthConfig getAuthConfig(); + + public SaveImageCmd withAuthConfig(AuthConfig authConfig); + + /** + * @throws com.github.dockerjava.api.NotFoundException No such image + */ + 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/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 5f0876bbd..522afe3bf 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -8,75 +8,9 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -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.EventCallback; -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.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.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -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.command.*; import com.github.dockerjava.api.model.AuthConfig; -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.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.SearchImagesCmdImpl; -import com.github.dockerjava.core.command.StartContainerCmdImpl; -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; +import com.github.dockerjava.core.command.*; /** * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -195,6 +129,13 @@ public PushImageCmd pushImageCmd(String name) { return new PushImageCmdImpl(getDockerCmdExecFactory() .createPushImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); } + + @Override + public SaveImageCmd saveImageCmd(String name) { + return new SaveImageCmdImpl(getDockerCmdExecFactory() + .createSaveImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); + + } @Override public CreateImageCmd createImageCmd(String repository, diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java new file mode 100644 index 000000000..85f7cfe60 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -0,0 +1,63 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.SaveImageCmd; + +import java.io.InputStream; + +import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; + +public class SaveImageCmdImpl extends AbstrAuthCfgDockerCmd implements SaveImageCmd { + private String name; + private String tag; + + public SaveImageCmdImpl(SaveImageCmd.Exec exec, String name) { + super(exec); + withName(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getTag() { + return tag; + } + + /** + * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + @Override + public SaveImageCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + /** + * @param tag The image's tag. Can be null or empty. + */ + @Override + public SaveImageCmd withTag(String tag) { + checkNotNull(tag, "tag was not specified"); + this.tag = tag; + return this; + } + + @Override + public String toString() { + return new StringBuilder("get ") + .append(name) + .toString(); + } + + /** + * @throws com.github.dockerjava.api.NotFoundException No such image + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index cdb851175..4edba9fcb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.net.URI; +import com.github.dockerjava.api.command.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,40 +27,6 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; -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.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.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -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.core.DockerClientConfig; import com.github.dockerjava.core.util.JsonClientFilter; import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; @@ -170,6 +137,9 @@ public PullImageCmd.Exec createPullImageCmdExec() { public PushImageCmd.Exec createPushImageCmdExec() { return new PushImageCmdExec(getBaseResource()); } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { return new SaveImageCmdExec(getBaseResource()); } @Override public CreateImageCmd.Exec createCreateImageCmdExec() { diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java new file mode 100644 index 000000000..16ad00122 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.jaxrs; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushEventStreamItem; +import jersey.repackaged.com.google.common.collect.ImmutableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; + +import static javax.ws.rs.client.Entity.entity; + +public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { + private static final Logger LOGGER = LoggerFactory + .getLogger(PushImageCmdExec.class); + + public SaveImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(SaveImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get") + .queryParam("tag", command.getTag()); + + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("GET: {}", webResource); + InputStream is = webResource + .request() + .header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON) + .get().readEntity(InputStream.class); + + return is; + } +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 4fcf26b6a..5e7f2974d 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -141,6 +141,9 @@ public PullImageCmd.Exec createPullImageCmdExec() { public PushImageCmd.Exec createPushImageCmdExec() { return delegate.createPushImageCmdExec(); } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { return delegate.createSaveImageCmdExec(); } @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { diff --git a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java new file mode 100644 index 000000000..b62594bed --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.BufferedInputStream; +import java.io.DataInputStream; +import java.io.InputStream; +import java.lang.reflect.Method; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +@Test(groups = "integration") +public class SaveImageCmdImplTest extends AbstractDockerClientTest { + public static final Logger LOG = LoggerFactory + .getLogger(PushImageCmdImplTest.class); + + String username; + + @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 saveImage() throws Exception { + + InputStream image = IOUtils.toBufferedInputStream(dockerClient + .saveImageCmd("busybox").exec()); + assertThat(image.available(), greaterThan(0)); + + } + +} From 0c6f2b4424b62add3dbb6c9f2c0d76150aa27a62 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 8 Feb 2015 20:33:25 +0100 Subject: [PATCH 0074/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3525f87e8..63fc6e787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log docker-java-1.0.0-SNAPSHOT --- + * [#148](https://github.com/docker-java/docker-java/pull/148) Save image functionality * [#142](https://github.com/docker-java/docker-java/pull/142) Reduce Logging Level * [#138](https://github.com/docker-java/docker-java/pull/138) Apache CXF interopabilty * [#137](https://github.com/docker-java/docker-java/pull/137) Multiple volumesFrom option when creating a container From 19ec0dbdd10fd940f9fb88399a0afa92cf41d560 Mon Sep 17 00:00:00 2001 From: Gabe Ki Date: Wed, 11 Feb 2015 14:31:52 -0800 Subject: [PATCH 0075/1399] Add redirection for 301 - Issue #147 --- .../dockerjava/core/DockerClientConfig.java | 22 +++++++++-- .../core/util/FollowRedirectsFilter.java | 37 +++++++++++++++++++ .../util/ResponseStatusExceptionFilter.java | 1 - .../jaxrs/DockerCmdExecFactoryImpl.java | 5 +++ 4 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 7513c7f29..f4881c194 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -33,6 +33,7 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_READ_TIMEOUT_PROPERTY = "docker.io.readTimeout"; // this is really confusing, as there are two ways to spell it private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; + private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilterEnabled"; private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; // connection pooling properties @@ -53,6 +54,7 @@ public class DockerClientConfig implements Serializable { m.put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY); m.put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY); m.put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY); + m.put("DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY", DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY); m.put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY); m.put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY); ENV_NAME_TO_IO_NAME = Collections.unmodifiableMap(m); @@ -63,14 +65,15 @@ public class DockerClientConfig implements Serializable { private final String version, username, password, email, serverAddress, dockerCfgPath; private final Integer readTimeout; private final boolean loggingFilterEnabled; + private final boolean followRedirectsFilterEnabled; private final SSLConfig sslConfig; private final int maxTotalConnections; private final int maxPerRouteConnections; DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, SSLConfig sslConfig, - int maxTotalConns, int maxPerRouteConns) { + String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, boolean followRedirectsFilterEnabled, + SSLConfig sslConfig, int maxTotalConns, int maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -80,6 +83,7 @@ public class DockerClientConfig implements Serializable { this.dockerCfgPath = dockerCfgPath; this.readTimeout = readTimeout; this.loggingFilterEnabled = loggingFilterEnabled; + this.followRedirectsFilterEnabled = followRedirectsFilterEnabled; this.sslConfig = sslConfig; this.maxTotalConnections = maxTotalConns; this.maxPerRouteConnections = maxPerRouteConns; @@ -243,6 +247,10 @@ public boolean isLoggingFilterEnabled() { return loggingFilterEnabled; } + public boolean followRedirectsFilterEnabled() { + return followRedirectsFilterEnabled; + } + public SSLConfig getSslConfig() { return sslConfig; } @@ -345,6 +353,7 @@ public String toString() { ", sslConfig='" + sslConfig + '\'' + ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + '}'; } @@ -352,7 +361,7 @@ public static class DockerClientConfigBuilder { private URI uri; private String version, username, password, email, serverAddress, dockerCfgPath; private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; - private boolean loggingFilterEnabled; + private boolean loggingFilterEnabled, followRedirectsFilterEnabled; private SSLConfig sslConfig; /** @@ -370,6 +379,7 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) + .withFollowRedirectsFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "true"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY, "2"))) @@ -428,6 +438,11 @@ public final DockerClientConfigBuilder withLoggingFilter(boolean loggingFilterEn return this; } + public final DockerClientConfigBuilder withFollowRedirectsFilter(boolean followRedirectsFilterEnabled) { + this.followRedirectsFilterEnabled = followRedirectsFilterEnabled; + return this; + } + public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); return this; @@ -455,6 +470,7 @@ public DockerClientConfig build() { dockerCfgPath, readTimeout, loggingFilterEnabled, + followRedirectsFilterEnabled, sslConfig, maxTotalConnections, maxPerRouteConnections diff --git a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java new file mode 100644 index 000000000..fd375eceb --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.core.util; + +import java.io.IOException; +import java.io.InputStream; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.core.Response; + +/** + * Default implementation of RedirectStrategy honors the restrictions + * on automatic redirection of entity enclosing methods such as POST + * and PUT imposed by the HTTP specification. 302 Moved Temporarily, + * 301 Moved Permanently and 307 Temporary Redirect status codes will + * result in an automatic redirect of HEAD and GET methods only. + * + * {@link org.apache.http.impl.client.DefaultRedirectStrategy} + * + * This filter allows arbitrary redirection for other methods. + */ +public class FollowRedirectsFilter implements ClientResponseFilter { + + @Override + public void filter(ClientRequestContext requestContext, + ClientResponseContext responseContext) throws IOException { + if (!responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.REDIRECTION)) { + return; + } + + Response resp = requestContext.getClient().target(responseContext.getLocation()) + .request().method(requestContext.getMethod()); + responseContext.setEntityStream((InputStream) resp.getEntity()); + responseContext.setStatusInfo(resp.getStatusInfo()); + responseContext.setStatus(resp.getStatus()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java index 99893a429..7e9708564 100644 --- a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java @@ -37,7 +37,6 @@ public void filter(ClientRequestContext requestContext, ClientResponseContext re case 200: case 201: case 204: - case 301: return; case 304: throw new NotModifiedException(getBodyAsMessage(responseContext)); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 4edba9fcb..4652b4b99 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -6,6 +6,7 @@ import java.net.URI; import com.github.dockerjava.api.command.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,6 +29,7 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FollowRedirectsFilter; import com.github.dockerjava.core.util.JsonClientFilter; import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; import com.github.dockerjava.core.util.SelectiveLoggingFilter; @@ -49,6 +51,9 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.register(ResponseStatusExceptionFilter.class); clientConfig.register(JsonClientFilter.class); clientConfig.register(JacksonJsonProvider.class); + if (dockerClientConfig.followRedirectsFilterEnabled()) { + clientConfig.register(FollowRedirectsFilter.class); + } if (dockerClientConfig.isLoggingFilterEnabled()) { clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); From adb85a84ca0ea94d246e3d4d8000136ef7d3dffd Mon Sep 17 00:00:00 2001 From: Gabe Ki Date: Wed, 11 Feb 2015 15:13:47 -0800 Subject: [PATCH 0076/1399] fix unit tests --- .../dockerjava/core/DockerClientConfig.java | 7 ++++--- .../core/util/FollowRedirectsFilter.java | 18 +++++++++--------- .../jaxrs/DockerCmdExecFactoryImpl.java | 6 +++--- .../core/DockerClientConfigTest.java | 4 ++-- .../dockerjava/core/DockerClientImplTest.java | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index f4881c194..6b87a927a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -33,7 +33,7 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_READ_TIMEOUT_PROPERTY = "docker.io.readTimeout"; // this is really confusing, as there are two ways to spell it private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; - private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilterEnabled"; + private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilter"; private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; // connection pooling properties @@ -54,7 +54,7 @@ public class DockerClientConfig implements Serializable { m.put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY); m.put("DOCKER_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY); m.put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY); - m.put("DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY", DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY); + m.put("DOCKER_FOLLOW_REDIRECTS_FILTER_ENABLED", DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY); m.put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY); m.put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY); ENV_NAME_TO_IO_NAME = Collections.unmodifiableMap(m); @@ -186,6 +186,7 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_READ_TIMEOUT_PROPERTY, DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, + DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { @@ -379,7 +380,7 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) - .withFollowRedirectsFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "true"))) + .withFollowRedirectsFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY, "2"))) diff --git a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java index fd375eceb..b4431b1f4 100644 --- a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java @@ -21,17 +21,17 @@ */ public class FollowRedirectsFilter implements ClientResponseFilter { - @Override + @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { - if (!responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.REDIRECTION)) { - return; - } + if (!responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.REDIRECTION)) { + return; + } - Response resp = requestContext.getClient().target(responseContext.getLocation()) - .request().method(requestContext.getMethod()); - responseContext.setEntityStream((InputStream) resp.getEntity()); - responseContext.setStatusInfo(resp.getStatusInfo()); - responseContext.setStatus(resp.getStatus()); + Response resp = requestContext.getClient().target(responseContext.getLocation()) + .request().method(requestContext.getMethod()); + responseContext.setEntityStream((InputStream) resp.getEntity()); + responseContext.setStatusInfo(resp.getStatusInfo()); + responseContext.setStatus(resp.getStatus()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 4652b4b99..5bff4c661 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -48,12 +48,12 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.connectorProvider(new ApacheConnectorProvider()); clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); - clientConfig.register(ResponseStatusExceptionFilter.class); - clientConfig.register(JsonClientFilter.class); - clientConfig.register(JacksonJsonProvider.class); if (dockerClientConfig.followRedirectsFilterEnabled()) { clientConfig.register(FollowRedirectsFilter.class); } + clientConfig.register(ResponseStatusExceptionFilter.class); + clientConfig.register(JsonClientFilter.class); + clientConfig.register(JacksonJsonProvider.class); if (dockerClientConfig.isLoggingFilterEnabled()) { clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 4611f4307..64ab912d0 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,12 +16,12 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, new LocalDirectorySSLConfig("flim"), 20, 2); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2); } @Test public void string() throws Exception { - assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false}", + assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", EXAMPLE_CONFIG.toString()); } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 1f5604fe8..2a961e3b8 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, null, 20, 2); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config From f28972b235eaa7edad2b682f8b7f5c28cb900359 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 16 Feb 2015 20:42:13 +0100 Subject: [PATCH 0077/1399] Fix Issue #150 --- .../dockerjava/core/DockerClientConfig.java | 34 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 517 +++++++++--------- 2 files changed, 291 insertions(+), 260 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 7513c7f29..aed3028fd 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -65,12 +65,12 @@ public class DockerClientConfig implements Serializable { private final boolean loggingFilterEnabled; private final SSLConfig sslConfig; - private final int maxTotalConnections; - private final int maxPerRouteConnections; + private final Integer maxTotalConnections; + private final Integer maxPerRouteConnections; DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, SSLConfig sslConfig, - int maxTotalConns, int maxPerRouteConns) { + Integer maxTotalConns, Integer maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -251,6 +251,14 @@ public String getDockerCfgPath() { return dockerCfgPath; } + public Integer getMaxTotalConnections() { + return maxTotalConnections; + } + + public Integer getMaxPerRoutConnections() { + return maxPerRouteConnections; + } + private AuthConfig getAuthConfig() { AuthConfig authConfig = null; if (getUsername() != null && getPassword() != null && getEmail() != null @@ -372,9 +380,15 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) - .withMaxPerRouteConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY, "2"))) - .withMaxTotalConnections(Integer.valueOf(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY, "20"))) - ; + .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) + .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); + } + + private Integer integerValue(String value) { + if(value != null) + return Integer.valueOf(value); + else + return null; } public final DockerClientConfigBuilder withUri(String uri) { @@ -462,11 +476,5 @@ public DockerClientConfig build() { } } - public int getMaxTotalConnections() { - return maxTotalConnections; - } - - public int getMaxPerRoutConnections() { - return maxPerRouteConnections; - } +// } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 4edba9fcb..e874d9da4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -34,252 +34,275 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); - private Client client; - private WebTarget baseResource; - - @Override - public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - - ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); - clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); - - clientConfig.register(ResponseStatusExceptionFilter.class); - clientConfig.register(JsonClientFilter.class); - clientConfig.register(JacksonJsonProvider.class); - - if (dockerClientConfig.isLoggingFilterEnabled()) { - clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); - } - - if (dockerClientConfig.getReadTimeout() != null) { - int readTimeout = dockerClientConfig.getReadTimeout(); - clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); - } - - URI originalUri = dockerClientConfig.getUri(); - - SSLContext sslContext; - try { - sslContext = dockerClientConfig.getSslConfig().getSSLContext(); - } catch(Exception ex) { - throw new DockerClientException("Error in SSL Configuration", ex); - } - - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(originalUri, sslContext)); - connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); - connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); - clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); - - ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); - - if (sslContext != null) { - clientBuilder.sslContext(sslContext); - } - - client = clientBuilder.build(); - - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); - } - WebTarget webResource = client.target(dockerClientConfig.getUri()); - - if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" + dockerClientConfig.getVersion()); - } - } - - private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, SSLContext sslContext) { - RegistryBuilder registryBuilder = RegistryBuilder.create(); - registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory()); - if (sslContext != null) { - registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); - } - registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri)); - return registryBuilder.build(); - } - - protected WebTarget getBaseResource() { - checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); - return baseResource; - } - - @Override - public AuthCmd.Exec createAuthCmdExec() { - return new AuthCmdExec(getBaseResource()); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(getBaseResource()); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return new PingCmdExec(getBaseResource()); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return new VersionCmdExec(getBaseResource()); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return new PullImageCmdExec(getBaseResource()); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return new PushImageCmdExec(getBaseResource()); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { return new SaveImageCmdExec(getBaseResource()); } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return new SearchImagesCmdExec(getBaseResource()); - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return new ListImagesCmdExec(getBaseResource()); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return new InspectImageCmdExec(getBaseResource()); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return new ListContainersCmdExec(getBaseResource()); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return new StartContainerCmdExec(getBaseResource()); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return new InspectContainerCmdExec(getBaseResource()); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(getBaseResource()); - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return new WaitContainerCmdExec(getBaseResource()); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return new AttachContainerCmdExec(getBaseResource()); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return new ExecStartCmdExec(getBaseResource()); - } - - @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return new LogContainerCmdExec(getBaseResource()); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource()); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return new StopContainerCmdExec(getBaseResource()); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return new ContainerDiffCmdExec(getBaseResource()); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return new KillContainerCmdExec(getBaseResource()); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return new RestartContainerCmdExec(getBaseResource()); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return new CommitCmdExec(getBaseResource()); - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return new TopContainerCmdExec(getBaseResource()); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return new TagImageCmdExec(getBaseResource()); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return new PauseContainerCmdExec(getBaseResource()); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return new UnpauseContainerCmdExec(baseResource); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return new EventsCmdExec(getBaseResource()); - } - - @Override - public void close() throws IOException { - checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); - client.close(); - } + private static final Logger LOGGER = LoggerFactory + .getLogger(DockerCmdExecFactoryImpl.class.getName()); + private Client client; + private WebTarget baseResource; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + + ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new ApacheConnectorProvider()); + clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, + true); + + clientConfig.register(ResponseStatusExceptionFilter.class); + clientConfig.register(JsonClientFilter.class); + clientConfig.register(JacksonJsonProvider.class); + + if (dockerClientConfig.isLoggingFilterEnabled()) { + clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + } + + if (dockerClientConfig.getReadTimeout() != null) { + int readTimeout = dockerClientConfig.getReadTimeout(); + clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); + } + + URI originalUri = dockerClientConfig.getUri(); + + SSLContext sslContext; + try { + sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + } catch (Exception ex) { + throw new DockerClientException("Error in SSL Configuration", ex); + } + + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( + getSchemeRegistry(originalUri, sslContext)); + if (dockerClientConfig.getMaxTotalConnections() != null) + connManager + .setMaxTotal(dockerClientConfig.getMaxTotalConnections()); + + if (dockerClientConfig.getMaxPerRoutConnections() != null) + connManager.setDefaultMaxPerRoute(dockerClientConfig + .getMaxPerRoutConnections()); + + clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, + connManager); + + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( + clientConfig); + + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } + + client = clientBuilder.build(); + + if (originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory + .sanitizeUri(originalUri)); + } + WebTarget webResource = client.target(dockerClientConfig.getUri()); + + if (dockerClientConfig.getVersion() == null + || dockerClientConfig.getVersion().isEmpty()) { + baseResource = webResource; + } else { + baseResource = webResource.path("v" + + dockerClientConfig.getVersion()); + } + } + + private org.apache.http.config.Registry getSchemeRegistry( + final URI originalUri, SSLContext sslContext) { + RegistryBuilder registryBuilder = RegistryBuilder + .create(); + registryBuilder.register("http", + PlainConnectionSocketFactory.getSocketFactory()); + if (sslContext != null) { + registryBuilder.register("https", new SSLConnectionSocketFactory( + sslContext)); + } + registryBuilder.register("unix", new UnixConnectionSocketFactory( + originalUri)); + return registryBuilder.build(); + } + + protected WebTarget getBaseResource() { + checkNotNull(baseResource, + "Factory not initialized. You probably forgot to call init()!"); + return baseResource; + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return new AuthCmdExec(getBaseResource()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(getBaseResource()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return new PingCmdExec(getBaseResource()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return new VersionCmdExec(getBaseResource()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return new PullImageCmdExec(getBaseResource()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return new PushImageCmdExec(getBaseResource()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return new SaveImageCmdExec(getBaseResource()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return new SearchImagesCmdExec(getBaseResource()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return new ListImagesCmdExec(getBaseResource()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return new InspectImageCmdExec(getBaseResource()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return new ListContainersCmdExec(getBaseResource()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return new StartContainerCmdExec(getBaseResource()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return new InspectContainerCmdExec(getBaseResource()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return new WaitContainerCmdExec(getBaseResource()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return new AttachContainerCmdExec(getBaseResource()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return new LogContainerCmdExec(getBaseResource()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return new CopyFileFromContainerCmdExec(getBaseResource()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return new StopContainerCmdExec(getBaseResource()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return new ContainerDiffCmdExec(getBaseResource()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return new KillContainerCmdExec(getBaseResource()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return new RestartContainerCmdExec(getBaseResource()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return new CommitCmdExec(getBaseResource()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return new TopContainerCmdExec(getBaseResource()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return new TagImageCmdExec(getBaseResource()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return new PauseContainerCmdExec(getBaseResource()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return new UnpauseContainerCmdExec(baseResource); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return new EventsCmdExec(getBaseResource()); + } + + @Override + public void close() throws IOException { + checkNotNull(client, + "Factory not initialized. You probably forgot to call init()!"); + client.close(); + } } From 8f9c275e9534e365790fb239c760a166ccf07b41 Mon Sep 17 00:00:00 2001 From: Nate Rosenblum Date: Mon, 16 Feb 2015 14:34:26 -0800 Subject: [PATCH 0078/1399] Restore guava as a dependency The repackaged guava classes provided by Jersey are incomplete and attempting to export these repackaged types will lead to path lookup errors in consumers. Fixes #151 --- pom.xml | 7 +++++++ .../java/com/github/dockerjava/api/model/Device.java | 2 +- .../github/dockerjava/api/model/EventStreamItem.java | 2 +- .../dockerjava/api/model/PushEventStreamItem.java | 2 +- .../com/github/dockerjava/api/model/RestartPolicy.java | 2 +- .../com/github/dockerjava/core/DockerClientConfig.java | 2 +- .../com/github/dockerjava/core/DockerClientImpl.java | 2 +- .../com/github/dockerjava/core/KeystoreSSLConfig.java | 2 +- .../dockerjava/core/LocalDirectorySSLConfig.java | 2 +- .../dockerjava/core/command/AbstrAuthCfgDockerCmd.java | 2 +- .../github/dockerjava/core/command/AbstrDockerCmd.java | 2 +- .../core/command/AttachContainerCmdImpl.java | 2 +- .../dockerjava/core/command/BuildImageCmdImpl.java | 2 +- .../github/dockerjava/core/command/CommitCmdImpl.java | 2 +- .../dockerjava/core/command/ContainerDiffCmdImpl.java | 2 +- .../core/command/CopyFileFromContainerCmdImpl.java | 2 +- .../core/command/CreateContainerCmdImpl.java | 2 +- .../dockerjava/core/command/CreateImageCmdImpl.java | 2 +- .../dockerjava/core/command/ExecCreateCmdImpl.java | 2 +- .../dockerjava/core/command/ExecStartCmdImpl.java | 2 +- .../core/command/InspectContainerCmdImpl.java | 2 +- .../dockerjava/core/command/InspectImageCmdImpl.java | 2 +- .../dockerjava/core/command/KillContainerCmdImpl.java | 2 +- .../dockerjava/core/command/ListContainersCmdImpl.java | 4 ++-- .../dockerjava/core/command/ListImagesCmdImpl.java | 2 +- .../dockerjava/core/command/LogContainerCmdImpl.java | 2 +- .../dockerjava/core/command/PauseContainerCmdImpl.java | 2 +- .../dockerjava/core/command/PullImageCmdImpl.java | 2 +- .../dockerjava/core/command/PushImageCmdImpl.java | 2 +- .../core/command/RemoveContainerCmdImpl.java | 2 +- .../dockerjava/core/command/RemoveImageCmdImpl.java | 2 +- .../core/command/RestartContainerCmdImpl.java | 4 ++-- .../dockerjava/core/command/SaveImageCmdImpl.java | 2 +- .../dockerjava/core/command/SearchImagesCmdImpl.java | 2 +- .../dockerjava/core/command/StartContainerCmdImpl.java | 2 +- .../dockerjava/core/command/StopContainerCmdImpl.java | 4 ++-- .../dockerjava/core/command/TagImageCmdImpl.java | 2 +- .../dockerjava/core/command/TopContainerCmdImpl.java | 2 +- .../core/command/UnpauseContainerCmdImpl.java | 2 +- .../dockerjava/core/command/WaitContainerCmdImpl.java | 2 +- .../github/dockerjava/core/dockerfile/Dockerfile.java | 10 +++++----- .../core/dockerfile/DockerfileStatement.java | 4 ++-- .../dockerjava/core/util/guava/PercentEscaper.java | 2 +- .../dockerjava/core/util/guava/UnicodeEscaper.java | 2 +- .../github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 2 +- .../dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 2 +- .../com/github/dockerjava/jaxrs/EventsCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/PushImageCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/SaveImageCmdExec.java | 2 +- 50 files changed, 64 insertions(+), 57 deletions(-) diff --git a/pom.xml b/pom.xml index 82b7ce822..17bdc7280 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,7 @@ 0.3 1.51 2015-01-27T15-02-14 + 18.0 1.1.0 @@ -143,6 +144,12 @@ ${slf4j-api.version} + + com.google.guava + guava + ${guava.version} + + diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index 63d26b41f..574d1ad56 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.model; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 6e6ce035a..5dd9d65c8 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -7,7 +7,7 @@ import java.io.Serializable; -import jersey.repackaged.com.google.common.base.Objects; +import com.google.common.base.Objects; /** * Represents an event stream diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index f5e845b29..7230a7cef 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -5,7 +5,7 @@ import java.io.Serializable; -import jersey.repackaged.com.google.common.base.Objects; +import com.google.common.base.Objects; /** * Represents an item returned from push diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index d2dd6d944..bb933f18a 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -1,6 +1,6 @@ package com.github.dockerjava.api.model; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 2eb1ab2a1..aa5f99b0c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 522afe3bf..dd9e566da 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.Closeable; import java.io.File; diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index 7f141142e..ec5a2ba8a 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index a27cb01f5..bafe62212 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.security.Security; diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index c1ccab516..31259f1f0 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 300489a0a..751b02cb6 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; 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 65155a1a0..fc38ae7d9 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; 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 0634651b2..32b5b2f91 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -26,7 +26,7 @@ import com.github.dockerjava.core.GoLangMatchFileFilter; import com.github.dockerjava.core.dockerfile.Dockerfile; -import static jersey.repackaged.com.google.common.base.Preconditions.*; +import static com.google.common.base.Preconditions.*; /** * diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index df8b1a662..55fe5e2e2 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index abb6469de..36286423c 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index d335bf8cd..f4f2ae548 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; 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 7a41f1d41..0948bf166 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index 71c333e7c..daa883f94 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 3fac90138..65b86ed9a 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 70a95b85b..193a2cb69 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index de7c268c3..9215f233a 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index c2c91b996..0b477e80e 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.InspectImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index ba4da47ce..c6175a8a6 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 741da75e7..7144e767f 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index ed163bb81..998dded5d 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; 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 547165f11..d405a8026 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index a2fd73ee5..5ea60fe86 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PauseContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index 8dd3af41e..d1d4ee026 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index 1914f91dd..a775bffd5 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.PushImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 51dd4b0c0..7cd063956 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 938e2b81c..87e096aae 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index 3548e04f0..adcac9b4c 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.RestartContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 85f7cfe60..6a4596c7d 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -5,7 +5,7 @@ import java.io.InputStream; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; public class SaveImageCmdImpl extends AbstrAuthCfgDockerCmd implements SaveImageCmd { private String name; diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 164425fc9..82c94e49f 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; 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 44476e0ac..c3a5cadaa 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import org.apache.commons.lang.builder.ToStringBuilder; diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index bed0aab7f..e961bf8ba 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkArgument; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index 3e0370cb1..8655ddfe8 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.command.TagImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 713ac2f25..5f7190fb4 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index ce266162a..92d715bcc 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.UnpauseContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index ecfc89e4e..d6250cc6f 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import com.github.dockerjava.api.command.WaitContainerCmd; 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 72c6c7956..72e85c353 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -20,11 +20,11 @@ import java.util.Map; import java.util.UUID; -import jersey.repackaged.com.google.common.base.Function; -import jersey.repackaged.com.google.common.base.Objects; -import jersey.repackaged.com.google.common.base.Optional; -import jersey.repackaged.com.google.common.base.Predicate; -import jersey.repackaged.com.google.common.collect.Collections2; +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; /** * Parse a Dockerfile. diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index 1e2ddf1b0..fd22e0985 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -8,8 +8,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import jersey.repackaged.com.google.common.base.Objects; -import jersey.repackaged.com.google.common.base.Optional; +import com.google.common.base.Objects; +import com.google.common.base.Optional; /** * A statement present in a dockerfile. diff --git a/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java index e136ec7b8..1d726dca2 100644 --- a/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java +++ b/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java @@ -16,7 +16,7 @@ package com.github.dockerjava.core.util.guava; -import jersey.repackaged.com.google.common.base.Preconditions; +import com.google.common.base.Preconditions; /** * A {@code UnicodeEscaper} that escapes some set of Java characters using a diff --git a/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java index 9bee03a71..3631193fc 100644 --- a/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java +++ b/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java @@ -16,7 +16,7 @@ package com.github.dockerjava.core.util.guava; -import jersey.repackaged.com.google.common.base.Preconditions; +import com.google.common.base.Preconditions; /** diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index a33e11a15..ccb538069 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index ed36c62c0..ffbd8306c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -24,7 +24,7 @@ import com.github.dockerjava.api.model.EventStreamItem; import com.github.dockerjava.api.model.PushEventStreamItem; -import jersey.repackaged.com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList; public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index ced652d70..9df09ba78 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.IOException; import java.net.URI; diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 3c525baeb..751145426 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import static jersey.repackaged.com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; import java.util.concurrent.Callable; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 8a9b9ebc9..4d7be3f0a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -22,7 +22,7 @@ import com.github.dockerjava.api.model.PushEventStreamItem; // Shaded, but imported -import jersey.repackaged.com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList; public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index 16ad00122..49f50856c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -6,7 +6,7 @@ import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushEventStreamItem; -import jersey.repackaged.com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 09a71fedc4c03343ab214928ec72e40c84aa1b17 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 18 Feb 2015 20:39:07 +0100 Subject: [PATCH 0079/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63fc6e787..e16f9a350 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Change Log docker-java-1.0.0-SNAPSHOT --- + * [#152](https://github.com/docker-java/docker-java/pull/152) Restore guava as a dependency + * [#149](https://github.com/docker-java/docker-java/pull/149) Handle HTTP-Redirects #149 * [#148](https://github.com/docker-java/docker-java/pull/148) Save image functionality * [#142](https://github.com/docker-java/docker-java/pull/142) Reduce Logging Level * [#138](https://github.com/docker-java/docker-java/pull/138) Apache CXF interopabilty From 4bdfd6f1b5aa8230a87eacd3bac6414c53f8f2f0 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 18 Feb 2015 20:39:23 +0100 Subject: [PATCH 0080/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e16f9a350..a7765b417 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Change Log docker-java-1.0.0-SNAPSHOT --- * [#152](https://github.com/docker-java/docker-java/pull/152) Restore guava as a dependency - * [#149](https://github.com/docker-java/docker-java/pull/149) Handle HTTP-Redirects #149 + * [#149](https://github.com/docker-java/docker-java/pull/149) Handle HTTP-Redirects * [#148](https://github.com/docker-java/docker-java/pull/148) Save image functionality * [#142](https://github.com/docker-java/docker-java/pull/142) Reduce Logging Level * [#138](https://github.com/docker-java/docker-java/pull/138) Apache CXF interopabilty From 126fae13e1b87cbcac0277ab8b6a038e50808fc4 Mon Sep 17 00:00:00 2001 From: kalmanb Date: Thu, 19 Feb 2015 13:51:39 +1300 Subject: [PATCH 0081/1399] Add support for configuring ExtraHosts Extends HostConfig to support adding entries to /etc/hosts on startup. --- .../dockerjava/api/model/HostConfig.java | 15 +++++++++++- .../command/CreateContainerCmdImplTest.java | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) 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 5532fba3a..c72d078b1 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -53,12 +53,16 @@ public class HostConfig { @JsonProperty("Devices") private Device[] devices; + @JsonProperty("ExtraHosts") + private String[] extraHosts; + public HostConfig() { } public HostConfig(String[] binds, Links 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) { + Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices, + String[] extraHosts) { this.binds = binds; this.links = links; this.lxcConf = lxcConf; @@ -74,6 +78,7 @@ public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBind this.restartPolicy = restartPolicy; this.networkMode = networkMode; this.devices = devices; + this.extraHosts = extraHosts; } public String[] getBinds() { @@ -124,6 +129,10 @@ public Device[] getDevices() { return devices; } + public String[] getExtraHosts() { + return extraHosts; + } + public RestartPolicy getRestartPolicy() { return restartPolicy; } @@ -196,6 +205,10 @@ public void setDevices(Device[] devices) { this.devices = devices; } + public void setExtraHosts(String[] extraHosts) { + this.extraHosts = extraHosts; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index ed81a5296..ba05b2687 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -311,4 +311,27 @@ public void createContainerWithEntrypoint() throws DockerException { } + @Test + public void createContainerWithExtraHosts() throws DockerException { + + String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"}; + + HostConfig hostConfig = new HostConfig(); + hostConfig.setExtraHosts(extraHosts); + + 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().getExtraHosts()), + containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); + } + } From 30e2688b610ed0e12dcafa023159735b2d471fc3 Mon Sep 17 00:00:00 2001 From: kalmanb Date: Fri, 20 Feb 2015 11:28:23 +1300 Subject: [PATCH 0082/1399] Support for withExtraHosts on StartContainerCmd --- .../api/command/StartContainerCmd.java | 9 +++++++- .../core/command/StartContainerCmdImpl.java | 16 +++++++++++++ .../command/StartContainerCmdImplTest.java | 23 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) 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 40fb23a9f..b48e30508 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -40,6 +40,8 @@ public interface StartContainerCmd extends DockerCmd { public Device[] getDevices(); + public String[] getExtraHosts(); + public RestartPolicy getRestartPolicy(); public Capability[] getCapAdd(); @@ -107,6 +109,11 @@ public interface StartContainerCmd extends DockerCmd { */ public StartContainerCmd withDevices(Device... devices); + /** + * Add hostnames to /etc/hosts in the container + */ + public StartContainerCmd withExtraHosts(String... extraHosts); + /** * Set custom {@link RestartPolicy} for the container. Defaults to * {@link RestartPolicy#noRestart()} @@ -141,4 +148,4 @@ public interface StartContainerCmd extends DockerCmd { public static interface Exec extends DockerCmdExec { } -} \ No newline at end of file +} 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 c3a5cadaa..dba35fb99 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -65,6 +65,9 @@ public class StartContainerCmdImpl extends AbstrDockerCmd Date: Tue, 20 Jan 2015 23:36:34 +0100 Subject: [PATCH 0083/1399] add certificates for integration test on CI --- etc/certs/README.md | 175 ++++++++++++++++++++++++++++++++++++++ etc/certs/ca-key.pem | 30 +++++++ etc/certs/ca.pem | 20 +++++ etc/certs/ca.srl | 1 + etc/certs/cert.pem | 18 ++++ etc/certs/client.csr | 15 ++++ etc/certs/extfile.cnf | 1 + etc/certs/key.pem | 27 ++++++ etc/certs/server-cert.pem | 18 ++++ etc/certs/server-cert.txt | 13 +++ etc/certs/server-key.pem | 27 ++++++ etc/certs/server.csr | 16 ++++ 12 files changed, 361 insertions(+) create mode 100644 etc/certs/README.md create mode 100644 etc/certs/ca-key.pem create mode 100644 etc/certs/ca.pem create mode 100644 etc/certs/ca.srl create mode 100644 etc/certs/cert.pem create mode 100644 etc/certs/client.csr create mode 100644 etc/certs/extfile.cnf create mode 100644 etc/certs/key.pem create mode 100644 etc/certs/server-cert.pem create mode 100644 etc/certs/server-cert.txt create mode 100644 etc/certs/server-key.pem create mode 100644 etc/certs/server.csr diff --git a/etc/certs/README.md b/etc/certs/README.md new file mode 100644 index 000000000..165265a0d --- /dev/null +++ b/etc/certs/README.md @@ -0,0 +1,175 @@ +# Creating Certificates for Docker + +## Warning +> These certificates are only meant for integration tests on CI environments (like circleCI). Do not use them for any real machine. +> Since all keys are publicly available anybody could gain root access to your machine. + +### 1. Create the certificate files +There is an [excellent guide](https://docs.docker.com/articles/https/) on the official docker homepage. +This document contains the log on how the certificates in this folder were created. +It differs slightly form the official guide. + - Certificates are valid for 10 years instead of 1 year. + - Certificates use v3_req extension to support both `127.0.0.1` and `localhost` (see config file [server-cert.txt](server-cert.txt)). + +``` +$ cd ~ +``` + +``` +$ mkdir .docker +``` + +``` +$ cd .docker +``` + +``` +$ echo 01 > ca.srl +``` + +``` +$ openssl genrsa -des3 -out ca-key.pem 2048 +Generating RSA private key, 2048 bit long modulus +............................................+++ +..................+++ +e is 65537 (0x10001) +Enter pass phrase for ca-key.pem: docker-java +Verifying - Enter pass phrase for ca-key.pem: docker-java +``` + +``` +$ openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem +Enter pass phrase for ca-key.pem: docker-java +You are about to be asked to enter information that will be incorporated +into your certificate request. +What you are about to enter is what is called a Distinguished Name or a DN. +There are quite a few fields but you can leave some blank +For some fields there will be a default value, +If you enter '.', the field will be left blank. +----- +Country Name (2 letter code) [AU]: +State or Province Name (full name) [Some-State]: +Locality Name (eg, city) []: +Organization Name (eg, company) [Internet Widgits Pty Ltd]: docker-java +Organizational Unit Name (eg, section) []: +Common Name (e.g. server FQDN or YOUR name) []: +Email Address []: +``` + +``` +$ openssl genrsa -des3 -out server-key.pem 2048 +Generating RSA private key, 2048 bit long modulus +..........+++ +.........+++ +e is 65537 (0x10001) +Enter pass phrase for server-key.pem: docker-java +Verifying - Enter pass phrase for server-key.pem: docker-java +``` + +``` +$ openssl req -new -key server-key.pem -out server.csr -config server-cert.txt +Enter pass phrase for server-key.pem: docker-java +You are about to be asked to enter information that will be incorporated +into your certificate request. +What you are about to enter is what is called a Distinguished Name or a DN. +There are quite a few fields but you can leave some blank +For some fields there will be a default value, +If you enter '.', the field will be left blank. +----- +TypeCommonNameHere []: localhost +``` + +``` +$ openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem -extensions v3_req -extfile server-cert.txt +Signature ok +subject=/CN=localhost +Getting CA Private Key +Enter pass phrase for ca-key.pem: docker-java +``` + +``` +$ openssl genrsa -des3 -out key.pem 2048 +Generating RSA private key, 2048 bit long modulus +............................................+++ +.......................................................+++ +e is 65537 (0x10001) +Enter pass phrase for key.pem: docker-java +Verifying - Enter pass phrase for key.pem: docker-java +``` + +``` +$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr +Enter pass phrase for key.pem: docker-java +``` + +``` +$ echo extendedKeyUsage = clientAuth > extfile.cnf +``` + +``` +$ openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf +Signature ok +subject=/CN=client +Getting CA Private Key +Enter pass phrase for ca-key.pem: docker-java +``` + +``` +$ openssl rsa -in server-key.pem -out server-key.pem +Enter pass phrase for server-key.pem: docker-java +writing RSA key +``` + +``` +$ openssl rsa -in key.pem -out key.pem +Enter pass phrase for key.pem: docker-java +writing RSA key +``` + +Once you created all the files you can have a look at their content with the following command + +``` +openssl x509 -in .pem -inform pem -noout -text +``` + +### 2. Configuring the docker daemon +On linux the docker daemon allows to specify options in the file `/etc/default/docker`. +By adding the following line (or modifying an existing line) one can get the docker daemon to listen on both *unix socket* and *https*. +``` +DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://127.0.0.1:2376 --tlsverify --tlscacert=~/.docker/ca.pem --tlscert=~/.docker/server-cert.pem --tlskey=~/.docker/server-key.pem" +``` + +### 3. Restart the daemon and test the setup +After changing the daemon options it must be restarted + +``` +$ sudo service docker restart +``` + +To test the socket and the https connection: + +``` +$ docker -H tcp://127.0.0.1:2376 --tlsverify version +Client version: 1.4.1 +Client API version: 1.16 +Go version (client): go1.3.3 +Git commit (client): 5bc2ff8 +OS/Arch (client): linux/amd64 +Server version: 1.4.1 +Server API version: 1.16 +Go version (server): go1.3.3 +Git commit (server): 5bc2ff8 +``` + +``` +$ docker -H unix:///var/run/docker.sock version +Client version: 1.4.1 +Client API version: 1.16 +Go version (client): go1.3.3 +Git commit (client): 5bc2ff8 +OS/Arch (client): linux/amd64 +Server version: 1.4.1 +Server API version: 1.16 +Go version (server): go1.3.3 +Git commit (server): 5bc2ff8 +``` diff --git a/etc/certs/ca-key.pem b/etc/certs/ca-key.pem new file mode 100644 index 000000000..bf1b0e2d0 --- /dev/null +++ b/etc/certs/ca-key.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,A5E7732EBEA97F20 + +/KgdVVIFc++tLxcot9FCziUqi6uZMk2pFy676Vh9ZILuHE5t8WZ66sn+aXjsNb0T +L9Z67+Yx9E3Y7L2wl/NwwpYZctt9XWo8wR1fVucYf98PEbRWXlbS1GYK3bMtYPeU +iGxLOK/WU3uqItH9g2uxCeXf+wjP14kiFrzrrd1XrShxTUs/bqIbHd7+GJetgvpS +5UKXiISLUf+5EwuODVhe6zYg80P616HuitkKDekAM7PZz6YsVIhPNnxOlSIEIylS +sPK71Aiy6yu57Qp6Jm1E1JsPVcoEOAEtAUlMxxyVNhj5fQ35lX/OkkhJGXmKXfIl +U6YVBreAwSeuwv7ochmyIsoOHzw5QJGlm8ycMYaxrceh7J3cGT0+04WgLi9+ieZ/ +AseXPryryqhIgR4qN0/9vAnA++N+YtelzhIeXqJhtpMEc5yb7po/OJejMboFJyAa +5P4IvCXohfSVSMBwaB2Vh9xA+2d34hQS5AKFkzlfbMJU81HmCUh70CKYJ9PGSdh4 +itkSoc9iQ2e0RxOxhJSqjpYYbKcxL2PTkMTpxqDGiJQ8FfLWuDhpz5mUWSvt3a41 +zbypHsKntibKP8Ceem1vckIid0mnWaZolbOcHBzErsa/3BvO5ZP3q7HTf35yyy7o +VO1LXQqO8trYnkG2PiXk0eWUzTVgiGQYFoGdAdFOkF95y2LBRcgyBhQTfxIbqMW3 +Nr2wkSHU0JT1NLI0UKhVAB7/uLJKwGgLcYU9j4DAA4rT8sZF9zbdjLuSFx5dnV+h +g8H+QOKbvmGpvTIeDrxwSpgzu7mqmPcpf1gFHBTdYCV8QXF4u96VZlar6dnoYoVj +OdS96HYxC2gsrDJJ5Nls0deTWqdKxbnDRXs4Vu7yTO1B/nMnSgptksOoVq50SD1a +IrtA4d6aZzfr1U647nWXTdaeDJ2acq4u8fM8JZNbMj0/Y7HJa3BQz+55yCQb+iFE +1VOzm1D9xcU8NCBgquT4C6FcPIQQpyq50B7lez8SEyAvqPnoMlqAulF6qo+0ZtZC +MaS+C2dlNUUjVOV7qDsracSY6esf5WF40nc1jzNflV+Pwqk7ISDkv4GiiH+yXq8t +hrP2sAiWHd2oHw1RCoEW7UgWAyW72wAOFTwnvQBCkVmxk/kBgrNDU+8SBmClqSod +CEWOcb6apore20xXmhq8mEddW2Xjk+U1dLRkBBp5oaopbYQ25LO+PZIpIJr1mcCi +6D42EHmCGQovkaL4G40IhXDrU98u2J72be8i/B7sQ8s3A5d7CwJwICG5PoiM7MJU +dfwWPmpKVAt38PQ4fWmZjw3pUnU2qyXGUc5TV6J8ZhU5yFvx4P7n7/Zd1QaZ34ar +A3XcHoAidu8O/C1N/bdSttJHniirTIYYgiqVTtjT66qALSeDCab3JT9C7Zfxr39+ +YamKTXu+dMw7C91Cg9ETiNcNvNsjVK1cMVmcwirJjSlK1Wr1cRbFkWg55uVSuO52 +r08qGAHge9gekW1Rcc/RKp0qv193PYCYMzKUoW28MEspHPbs84fhGIiK8v/OF9Pg +nu0T8r+Xzr2a7TSSTsO77WTjXrEfgjrddfUhsIiSNWVePL86iNkZoB5QrWH7DgKW +-----END RSA PRIVATE KEY----- diff --git a/etc/certs/ca.pem b/etc/certs/ca.pem new file mode 100644 index 000000000..0cf1b2b9c --- /dev/null +++ b/etc/certs/ca.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDQzCCAiugAwIBAgIJAN94VLe4RxmkMA0GCSqGSIb3DQEBCwUAMDgxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMRQwEgYDVQQKDAtkb2NrZXItamF2 +YTAeFw0xNTAxMjAyMTE5MzBaFw0yNTAxMTcyMTE5MzBaMDgxCzAJBgNVBAYTAkFV +MRMwEQYDVQQIDApTb21lLVN0YXRlMRQwEgYDVQQKDAtkb2NrZXItamF2YTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANiZy9f+AHejo9s9Ve1WwXQeKR28 +s2SbSpf82+kMtLHL0/r0HIDwhA9uOSglqpFY21vVWFYGY+Mh8Z4bgoyUOFIM/WQn +fgS2trYjfRZuZeR8u57dVyqLyzMV7eWdPBbnU1rTavwvsQMwWWwKF+AXhKpUoDtT +N+gQyqTQYdEsyhQS/HzC7fH3QC0deSrUS5yjX9qIEr3dZwE93BK2wqUFEy9JvyQ5 +DIh5N6HpRKzFcH/zHd/GPeXXnWKVCO5plDn/XTv85a5PesyFV2Zi//0g3UWgpzFC +2sTh5Brj7kamlVbOLBpQTV2LFY38c3MNYbiNTzKtkAQgVtHA4YS5ym3z8PcCAwEA +AaNQME4wHQYDVR0OBBYEFJME9p4vpy900Ryw/E/Mz750ZK9xMB8GA1UdIwQYMBaA +FJME9p4vpy900Ryw/E/Mz750ZK9xMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBANZPR1572nkOKEsxZkV1jou64NqZLGGVjXEdjJP56R5G8cyoBoZfqiT0 +J2/IxU7UZ5n65C79FLeLnAq/0GuWw07BREzAZjBZmBOe3Ma3qZi47MESIEEJ06XL +g4/rGFbeDlV9otVhKQ27U//4qodLUNzZBq+VrQNUfSk8vqEb0iGKHSSLTV6DZx8w +Yb79ZFA53+LOloKKbrGQsSKshSDUxnl+19jVXMUgvvrcyEE20I30wB0ZVE5pPME7 +tAqBFjqe+SR+gxwVXrpRSPhjZfqDhSOvsbZwuJqNVqE1sVnZCbwcnvIGGRu8TWej +JARvyGHOlwoE3kVH+4VKeYQ7PcL5wck= +-----END CERTIFICATE----- diff --git a/etc/certs/ca.srl b/etc/certs/ca.srl new file mode 100644 index 000000000..75016ea36 --- /dev/null +++ b/etc/certs/ca.srl @@ -0,0 +1 @@ +03 diff --git a/etc/certs/cert.pem b/etc/certs/cert.pem new file mode 100644 index 000000000..7063ef997 --- /dev/null +++ b/etc/certs/cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC2zCCAcOgAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQGEwJBVTET +MBEGA1UECAwKU29tZS1TdGF0ZTEUMBIGA1UECgwLZG9ja2VyLWphdmEwHhcNMTUw +MTIwMjEzNjIzWhcNMjUwMTE3MjEzNjIzWjARMQ8wDQYDVQQDDAZjbGllbnQwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZlY8JUY4VqGyi/h9b0WHvqjgt +y+nyQd9vdgY6IvjsLDcl0fjp4knFxSpl1U0oLA1JnElT3Qgv1zv4GYvc/DUbld7d +5B1jQzOYbUWgOzRa/903wpEXn9waBU2mwtyObzmXvmZ6XUA+fgx3EFnimflzEkjm +vYskH2lW0pbbt4/3cCeD282DEmmzaOOkFR8agV6aE4T/x+BRFkVgR1T8Dfiu6Yyy +CJ57OO7kcCGoAPIEe3dGi5UGQVKuDjlohZKApg6E2ISINVvbxsHqKkGU9lNRqxkg +P6qV8LAhypo5sEqeAvlnIgOrhpb0c+zzoqgV0d+s2gU2GVa6SvT0OcidwyzjAgMB +AAGjFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQCL +2T/pu5weRuXcPEvBvmyOfEZZp0bzfGw0DYsp5XKARV7M6qJPPTpjqLm3AbjPqsv2 +fn0GQq8hWThveJhYps6mnhAsYC5rlfxFH+JC2i1EfhTIjWCP7WKdjXJr6hmhrVNc +7cxyQjWh/vSAk4nRcH3fNLUF1HNhZBuB1aOniTWTeoTgd7sIQjVpX4V6avOEcSGo +mylt3fqHO5X/CONFJnvv0SHFOCGr9WX/9Sq0GlpHoEK80gBVQt/O22U1PGZ2kYaT +Z/Fs2r85ltC/POPTCyQ3oKk4j2YF7HwJhJ2gP8jwKl4aX1iypwpCa/d9hvCFn8Wh +bEv9E557EH9PjLyqlnwi +-----END CERTIFICATE----- diff --git a/etc/certs/client.csr b/etc/certs/client.csr new file mode 100644 index 000000000..447487249 --- /dev/null +++ b/etc/certs/client.csr @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICVjCCAT4CAQAwETEPMA0GA1UEAwwGY2xpZW50MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA2ZWPCVGOFahsov4fW9Fh76o4Lcvp8kHfb3YGOiL47Cw3 +JdH46eJJxcUqZdVNKCwNSZxJU90IL9c7+BmL3Pw1G5Xe3eQdY0MzmG1FoDs0Wv/d +N8KRF5/cGgVNpsLcjm85l75mel1APn4MdxBZ4pn5cxJI5r2LJB9pVtKW27eP93An +g9vNgxJps2jjpBUfGoFemhOE/8fgURZFYEdU/A34rumMsgieezju5HAhqADyBHt3 +RouVBkFSrg45aIWSgKYOhNiEiDVb28bB6ipBlPZTUasZID+qlfCwIcqaObBKngL5 +ZyIDq4aW9HPs86KoFdHfrNoFNhlWukr09DnIncMs4wIDAQABoAAwDQYJKoZIhvcN +AQELBQADggEBAJ+IARXkgVRRj2sARH4D+1cwD5WSZwlTr5dsB5myGlNx7crNrWeu +Rqhu2r3xh8b5FlIbggC+aR8U5ikeBHfiRYXV3lt41+AKriKqNR348AAw/WLWPEDG +V6WWieVyicTdN2yMH3tWcisIsqTiVGWDcagVhRmAPP0VBdQ8OyTJCIjIiOhG0LDg +LlEiFuO7npc5ywXJjfh4TjFsyfSjTJv3UYY7zWYgfalWit9OeDbMhgGOwOwOFyDj +lOpQKeBxDwhnH5DC90OmbjK4FkMbQhrTXvURfUts/wz2SLqkQVB8FWuVc0RwUhnX +s2KWbehobjOpK3WkOgDfLGY72HnhU5IbP9Q= +-----END CERTIFICATE REQUEST----- diff --git a/etc/certs/extfile.cnf b/etc/certs/extfile.cnf new file mode 100644 index 000000000..74dedb380 --- /dev/null +++ b/etc/certs/extfile.cnf @@ -0,0 +1 @@ +extendedKeyUsage = clientAuth diff --git a/etc/certs/key.pem b/etc/certs/key.pem new file mode 100644 index 000000000..4319223e8 --- /dev/null +++ b/etc/certs/key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA2ZWPCVGOFahsov4fW9Fh76o4Lcvp8kHfb3YGOiL47Cw3JdH4 +6eJJxcUqZdVNKCwNSZxJU90IL9c7+BmL3Pw1G5Xe3eQdY0MzmG1FoDs0Wv/dN8KR +F5/cGgVNpsLcjm85l75mel1APn4MdxBZ4pn5cxJI5r2LJB9pVtKW27eP93Ang9vN +gxJps2jjpBUfGoFemhOE/8fgURZFYEdU/A34rumMsgieezju5HAhqADyBHt3RouV +BkFSrg45aIWSgKYOhNiEiDVb28bB6ipBlPZTUasZID+qlfCwIcqaObBKngL5ZyID +q4aW9HPs86KoFdHfrNoFNhlWukr09DnIncMs4wIDAQABAoIBAAT2o2+r+5jE4c2K +DH8UtK457NQmnayYEhfB0nyLBbClhZCITKxRLCulxsTR69OpxZfTR9zw4tnsiAKt +2oHtAu0hKxdWt9Dm3Itymq8ACr60rYAzIQov7F5vlojiUxOwt9idUEskS23hhDlH +FzXTG1yjoyQYWM83JDkFzskuU8tqKcdZUGHxwDqWaLpCJRCqaXGBbwBsiBE0WpD4 +U2Iq32Cbcf2KK/iI2CpEhEVSLZAHuh1Ovv4l2kb3PSFV1x4zSOJjHO6LM+4nAgmx +1XcVH+Qpw7oRoRpEajBss6XlIvRRohhXRlzUDi5T6smkoo69pXn1OFaav6U8BwVN +2nIrnJECgYEA8Wn9OBnxgJvVji+Wdc92IoHgSB8Y/xPuI4a2go84AHd0Ek7GzE6g +o52eq1v+7+Uj2y/xTIvcGEfOz8/oeOzWJqsLpi34CeqhewwWHNogAD2Xg6DpCHmc +ARzKKod9djwU0y5+/8YBsfpSM6ZKzbnP5HzblA+oIllAY50VJvp+HhsCgYEA5rr8 +8EsjnuNo+/RuVp4vATP2ML6D/ILHQEZR6tPgfjaiEZfMm22yX6J8F/kNVHO2c1Pt +94A+dKa3QyQBieb27u1+N0iUOkAYvnExkaazkVwOH4sXwn4EzxGFTdwwSW5Uenl4 +8Qry08mnnJwKP38TlNrw3Q9PbZNFFlXLdaAteNkCgYEAjhmFI3Ch5sHTgk4gklf7 +gXRRQCKN5BcnJWI2K8OBg0TM3bng6oGdrLEqpFMSTMLjyDEAJ75rXx9lbI1EmWlO +5JPp13dXeP7S7kq++VyrWXjnpmMgyAxM95qqpT37a40R9Px5ZLR4avqdSCmp/k5R +QHz+Arj0jsNaU0gzGy527eECgYEAu1Mk+JKIoP9QxP52dqyGzRs6zehfkCs9SdnN +uDG9GbuRaWctHyO4phxtU6lIQUCQ6KFDmqXsDxkrwL8C4Ms7wE/hIVEzxvczH6sW +64HEWEe8z69F4wodLWC0MbqLGZMR0z28CzcwXvJhuqyVRWgOpdP7qf48JmJivPd6 +8EzTnkECgYA5x137xZgFZGYOdRF4yCLkbZ8weDKbcTotUgNSFR2xMYzytzWmEg5D +rvjhGXmhqvxNTzEJehWVVJoQHFW0aJhC7ML2VP56DQ7p2gM75HrojZpdoUzwF73T ++E6W/Nddm6N8tuQ/q/rIrsgF6/FJ9H5D9ZeK69En3QwC4xUgHlWQGA== +-----END RSA PRIVATE KEY----- diff --git a/etc/certs/server-cert.pem b/etc/certs/server-cert.pem new file mode 100644 index 000000000..1edc7b796 --- /dev/null +++ b/etc/certs/server-cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC5TCCAc2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQGEwJBVTET +MBEGA1UECAwKU29tZS1TdGF0ZTEUMBIGA1UECgwLZG9ja2VyLWphdmEwHhcNMTUw +MTIwMjEzMTQ4WhcNMjUwMTE3MjEzMTQ4WjAUMRIwEAYDVQQDEwlsb2NhbGhvc3Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDECxOHu9oVQX2IGivToPdC +gcVcewBOQJClLDmnGdfP99gtBdNaa59cXnPudd+r24lfnIs98XUbAWZoYFYTmj1s +jukyL1jwH2zcPVmcTKWz6zTbComxaNQJRHZGPIeR1qJIiJHIMa0Xt9y0w/SH0qHw +Ts69PkRCILaUGRhsms5qYJ91fsRzYO4jXYR3F0vEEoUzhlI7qw4n3QaTOVbZ154v +3VEvlrECCLVpE4KUcccgenNNoEeqTdkiAe4ywupHjkzo3ThcWSfv+a+oRRmQlhsD +BPL2RxyNiu2NvML6WyMPKQNvyV7s6kyDKmpbLg3Y0QV/VhneZ90+bPG/VslpMPzb +AgMBAAGjHjAcMBoGA1UdEQQTMBGHBH8AAAGCCWxvY2FsaG9zdDANBgkqhkiG9w0B +AQsFAAOCAQEAInNXInEzAA9AbEOsNXKyAXHJQWCUK6+tCQkxNIiGKaRWtEYLmrpx +1xx7xTACZihpK+vRyG4MUNkHIoVqNi/Jg4Z0cJq3lU3FnCpU0TUY2avj8iWbn2Ke +B5SFnPyi2JSZhw8ZsssA6/cs7EoTbQYSi1CO7SoKXj8RvQJcYWc8dx3Ydkq05pIT +e897LxrHjrpiGK+a+2ghw9amfnXmElYneKP5WrpZcIiHAD3Fp6ecvYkLGLf1G5D/ +bjjMUfbsYMjeZFVG6wzTJ8tBDeJkovpb2vPpuLM+raYkqGDiUBD2Kqgyq1uL6ZLc +PYmsXVGiosG7QpVxDsaYy8DQa/4FeQWC1g== +-----END CERTIFICATE----- diff --git a/etc/certs/server-cert.txt b/etc/certs/server-cert.txt new file mode 100644 index 000000000..4ce34a14b --- /dev/null +++ b/etc/certs/server-cert.txt @@ -0,0 +1,13 @@ +[req] +distinguished_name = req_distinguished_name +req_extensions = v3_req + +[req_distinguished_name] +commonName = TypeCommonNameHere + +[v3_req] +subjectAltName = @alt_names + +[alt_names] +IP.1 = 127.0.0.1 +DNS.1 = localhost diff --git a/etc/certs/server-key.pem b/etc/certs/server-key.pem new file mode 100644 index 000000000..7490cbcb1 --- /dev/null +++ b/etc/certs/server-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAxAsTh7vaFUF9iBor06D3QoHFXHsATkCQpSw5pxnXz/fYLQXT +WmufXF5z7nXfq9uJX5yLPfF1GwFmaGBWE5o9bI7pMi9Y8B9s3D1ZnEyls+s02wqJ +sWjUCUR2RjyHkdaiSIiRyDGtF7fctMP0h9Kh8E7OvT5EQiC2lBkYbJrOamCfdX7E +c2DuI12EdxdLxBKFM4ZSO6sOJ90GkzlW2deeL91RL5axAgi1aROClHHHIHpzTaBH +qk3ZIgHuMsLqR45M6N04XFkn7/mvqEUZkJYbAwTy9kccjYrtjbzC+lsjDykDb8le +7OpMgypqWy4N2NEFf1YZ3mfdPmzxv1bJaTD82wIDAQABAoIBAEpDT+CpHpHSvzTh +hRyj60Z8VkEULyd1edW4DRbpyUD0yCU2AbxM7I9XEF+Ss2osvbtEV9LdNtlGDH8Z +j0HZuc73zArAuNYtcVV0wA9fUZ34SYt4UHSuGzRvhMZSg6CRR+RmJ6NIfiNv+OFZ +IbaZ6dJYaCR0A/Nw5PjxELmDYxIUYcXKZAwjVP+GLvOmjE/xSD1kwEVeIzmtgEeX +UixqI8KgDpASuf0N21fJ67pcAIohrmsWzjeSXMFINFCMuUuqAKCuPpUthybHjMy/ +7vjEI7ViEcpcHd7IW5h+RTl3r4hnQaNbbbcwGWmc+8u7qOcPJe6cEBXD8ud6dZUz +wdLdRwECgYEA8z9Vw/Ms2NQwQA4FUcnoQQ4pnK5bJIPLAa7MaomEYfVciMU1oWcI +4gspTelHSSY4+D/AlyLD5FgDpi0YfeYQJjcZVs2m/5mZn5BFqQKAmmMWtBxo6RSO +VF6SyfNsqpQTsFY0dp9HKCDVo0mtTKFizLBDrmSCroGv3fb6KodH25sCgYEAzlI0 +3Lan70ABn3cO4iGfQvvrUw2A/ZX01lVtDJzq8LJ+IXy9zev4C+ZOUT/8/L/D4K3W +hO1px7WrUSaMr5F9scXC0PYfMNoMn9YzfxEYCMQA5dCWnUhf6t2ESUFeh1Qt3b7j +kz7U2/pSk7VXithwITKKEgicG0EBABHuyio0l8ECgYEAjF90YwwmSUrKPWzZ7QUT +ntdJdD26IyxbLrFtDd4mI1GxAMyt0mLfYXMHdwq0NKZ2IezIe294lIGmOXO0upLV +pvgNC2bKhJ5jZQ2g5ZOoG3ArXe03LarLKC0bkKeFgjrJ0e0tgXcRXTr1jrGp7JsF +pRHjPPSL5aC5mOI6I+jFsxkCgYAV6uG2uKiqX9BMUmeAWjYC9aQQFJUpWy7BPh3x +gxHqM+v2PrwjDfgxu2uCchu79dsnGRB62oWsM35ZhpDXbcs+gVWqwRqbI+7HZAfg +bb5x3/CAeWImnzOhTZrp9UnHcofU0Jx4Xepa3AK9sjv0gf2XaTkFpWh/9K3Yhg8p +5sXjgQKBgGv3a1VpQ0YG3PoN7l8Pjzg6/IYslxUkZwdyUqeTJD3hRDbQybXIhJGw +0GbAkxTkXwFFQpRplCj5wk6U0M/JZRW3IhiuHovmZd/WSvl3EgzLT/5U3kYE3K6V +ZH1Hgs1SCQhQXIWm/QerI1KlNg4PKhctPohSc1ttW3hQUBh1reTR +-----END RSA PRIVATE KEY----- diff --git a/etc/certs/server.csr b/etc/certs/server.csr new file mode 100644 index 000000000..f4fc6d384 --- /dev/null +++ b/etc/certs/server.csr @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIChjCCAW4CAQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAxAsTh7vaFUF9iBor06D3QoHFXHsATkCQpSw5pxnX +z/fYLQXTWmufXF5z7nXfq9uJX5yLPfF1GwFmaGBWE5o9bI7pMi9Y8B9s3D1ZnEyl +s+s02wqJsWjUCUR2RjyHkdaiSIiRyDGtF7fctMP0h9Kh8E7OvT5EQiC2lBkYbJrO +amCfdX7Ec2DuI12EdxdLxBKFM4ZSO6sOJ90GkzlW2deeL91RL5axAgi1aROClHHH +IHpzTaBHqk3ZIgHuMsLqR45M6N04XFkn7/mvqEUZkJYbAwTy9kccjYrtjbzC+lsj +DykDb8le7OpMgypqWy4N2NEFf1YZ3mfdPmzxv1bJaTD82wIDAQABoC0wKwYJKoZI +hvcNAQkOMR4wHDAaBgNVHREEEzARhwR/AAABgglsb2NhbGhvc3QwDQYJKoZIhvcN +AQELBQADggEBAGaf5ZlZMuUmLzdyWQEm90YPu9jpqrFocu2GUmHLEuW23/p3JRHX +gljn8VJkHaaAtP8gqPnk6Fn2BZJZrqVsjg+KoLxHuKUC0K2ZdYoFBl4usmfpQqe9 +3F0qUvScHaqdxff6OKORD1hXqCYF6V1WGwb2cTSbYr1xy/ehK+VhhPd+zTaQg0Es +CcacEJTYd61gIsW2FD0XkokUUokNLj0FL9dt2ANgaefJPKBH/Pp/2hTiXEhEjIm6 +MkQVjnMbx/5/5k48yhpwPEl0FdiyLQdbzT03sHbrDKCeAdOJgOibZUnJYCJ8/1vu +AH28ajlCUMvKsUE+mtDU/VYvci758n5CiYc= +-----END CERTIFICATE REQUEST----- From 22d4b2ac665ee410284a5b3cae574dac8ff1d1a2 Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Sat, 21 Feb 2015 23:30:53 +0100 Subject: [PATCH 0084/1399] add configuration for circle CI --- circle.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++ circle.yml | 28 ++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 circle.sh create mode 100644 circle.yml diff --git a/circle.sh b/circle.sh new file mode 100755 index 000000000..c84ca3fe6 --- /dev/null +++ b/circle.sh @@ -0,0 +1,45 @@ +#!/bin/bash -ex + +case "$1" in + pre_machine) + # copy certificates to default directory ~/.docker + mkdir .docker + cp $CIRCLE_PROJECT_REPONAME/etc/certs/* .docker + + # configure docker deamon to use SSL and provide the path to the certificates + docker_opts='DOCKER_OPTS="$DOCKER_OPTS -H tcp://127.0.0.1:2376 --tlsverify --tlscacert='$HOME'/.docker/ca.pem --tlscert='$HOME'/.docker/server-cert.pem --tlskey='$HOME'/.docker/server-key.pem"' + sudo sh -c "echo '$docker_opts' >> /etc/default/docker" + + # debug output + cat /etc/default/docker + ls -la $HOME/.docker + ;; + + post_machine) + # fix permissions on docker.log so it can be collected as an artifact + sudo chown ubuntu:ubuntu /var/log/upstart/docker.log + + # validate that docker is working + docker version + ;; + + dependencies) + mvn clean install -T 2 -Dmaven.javadoc.skip=true -DskipTests=true -B -V + ;; + + test) + mvn clean verify + ;; + + collect_artifacts) + # collect artifacts into the artifacts dir + cp target/*.jar $CIRCLE_ARTIFACTS + ;; + + collect_test_reports) + mkdir -p $CIRCLE_TEST_REPORTS/surefire + mkdir -p $CIRCLE_TEST_REPORTS/failsafe + cp target/surefire-reports/TEST-*.xml $CIRCLE_TEST_REPORTS/surefire + cp target/failsafe-reports/TEST-*.xml $CIRCLE_TEST_REPORTS/failsafe + ;; +esac diff --git a/circle.yml b/circle.yml new file mode 100644 index 000000000..d8a80371c --- /dev/null +++ b/circle.yml @@ -0,0 +1,28 @@ +dependencies: + override: + - ./circle.sh dependencies + +test: + override: + - ./circle.sh test + post: + - ./circle.sh collect_artifacts + - ./circle.sh collect_test_reports + +machine: + pre: + - ls -la docker-java + - $CIRCLE_PROJECT_REPONAME/circle.sh pre_machine + post: + - $CIRCLE_PROJECT_REPONAME/circle.sh post_machine + services: + - docker + environment: + MAVEN_OPTS: -Xmx128m + DOCKER_HOST: tcp://127.0.0.1:2376 + DOCKER_CERT_PATH: $HOME/.docker + DOCKER_TLS_VERIFY: 1 + +general: + artifacts: + - /var/log/upstart/docker.log From dc52e605dc345b09250f4792f1af7b2f2ee7f3bf Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Sat, 21 Feb 2015 23:32:40 +0100 Subject: [PATCH 0085/1399] exclude tests which are failing in circle CI --- pom.xml | 1 + .../github/dockerjava/core/command/BuildImageCmdImplTest.java | 2 +- .../dockerjava/core/command/ContainerDiffCmdImplTest.java | 2 +- .../github/dockerjava/core/command/ExecCreateCmdImplTest.java | 2 +- .../github/dockerjava/core/command/ExecStartCmdImplTest.java | 2 +- .../dockerjava/core/command/KillContainerCmdImplTest.java | 2 +- .../github/dockerjava/core/command/ListImagesCmdImplTest.java | 2 +- .../dockerjava/core/command/RemoveContainerCmdImplTest.java | 2 +- .../github/dockerjava/core/command/RemoveImageCmdImplTest.java | 2 +- .../dockerjava/core/command/StopContainerCmdImplTest.java | 2 +- 10 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 17bdc7280..9ce4d6ef4 100644 --- a/pom.xml +++ b/pom.xml @@ -386,6 +386,7 @@ integration + ignoreInCircleCi **/*Test.java 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 8be2f8f8e..f3cefb2f4 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -162,7 +162,7 @@ public void testInvalidDockerIgnorePattern() { dockerClient.buildImageCmd(baseDir).withNoCache().exec(); } - @Test + @Test(groups = "ignoreInCircleCi") public void testDockerIgnore() throws DockerException, IOException { File baseDir = new File(Thread.currentThread().getContextClassLoader() diff --git a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java index 8d6f92545..58c95486c 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -46,7 +46,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void testContainerDiff() throws DockerException { CreateContainerResponse container = dockerClient .createContainerCmd("busybox").withCmd("touch", "/test" ).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java index 338763e6c..028f4cac1 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -36,7 +36,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void execCreateTest() { String containerName = "generated_" + new SecureRandom().nextInt(); 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 497c44c1e..80619efeb 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -37,7 +37,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void execStartTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); diff --git a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java index 419d6e029..33d80ef2d 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -49,7 +49,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void killContainer() throws DockerException { CreateContainerResponse container = dockerClient diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 34a5984d9..05bf94837 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -58,7 +58,7 @@ public void listImages() throws DockerException { assertThat(img.getRepoTags(), not(emptyArray())); } - @Test + @Test(groups = "ignoreInCircleCi") public void listDanglingImages() throws DockerException { String imageId = createDanglingImage(); List images = dockerClient.listImagesCmd() diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java index 9c23d70e2..b6fe173ae 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -50,7 +50,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void removeContainer() throws DockerException { CreateContainerResponse container = dockerClient diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java index a2a190f6f..af6bc39cc 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -51,7 +51,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void removeImage() throws DockerException, InterruptedException { CreateContainerResponse container = dockerClient diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java index d46814281..3cf643c4e 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -49,7 +49,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void testStopContainer() throws DockerException { CreateContainerResponse container = dockerClient From abd73f5c7cfa65a733ad7dec434b997a59cf4dba Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Sat, 21 Feb 2015 23:33:23 +0100 Subject: [PATCH 0086/1399] do not validate isMemoryLimit() since it is host dependent --- .../java/com/github/dockerjava/core/command/InfoCmdImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index a0a272f2c..d1de7076b 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -68,6 +68,5 @@ public void info() throws DockerException { assertTrue(dockerInfo.getImages() > 0); assertTrue(dockerInfo.getNFd() > 0); assertTrue(dockerInfo.getNGoroutines() > 0); - assertTrue(dockerInfo.isMemoryLimit()); } } From 977a98ff5fbd9899326caa96a84fcfbd69adb25b Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Sat, 21 Feb 2015 23:34:00 +0100 Subject: [PATCH 0087/1399] add missing toString() --- .../dockerjava/api/command/InspectContainerResponse.java | 5 +++++ 1 file changed, 5 insertions(+) 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 5ac4f44e9..80d526342 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -153,6 +153,11 @@ public String getMountLabel() { return mountLabel; } + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) public class NetworkSettings { From cc3e6dcc6a97294c05aaec5be705573750f9f7b7 Mon Sep 17 00:00:00 2001 From: Stephan Classen Date: Sun, 22 Feb 2015 00:53:58 +0100 Subject: [PATCH 0088/1399] add circle.md --- circle.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 circle.md diff --git a/circle.md b/circle.md new file mode 100644 index 000000000..f5cbc0ed8 --- /dev/null +++ b/circle.md @@ -0,0 +1,51 @@ +# docker-java on circleCI + +The build including tests and integration tests can be automatically run on [circleCI](https://circleci.com/). + +## Setup +1. create an account on circle CI using your github account. +2. select docker-java from the github projects listed in your profile. +3. go to the project settings for docker-java (click on the gear-wheel icon beside the docker-java title). +4. open the *Environemnt variable* page. +5. add the following environment variables: + - DOCKER_EMAIL + - DOCKER_PASSWORD + - DOCKER_USERNAME + +## Ignored Tests +ExecCreateCmdImplTest.execCreateTest + + - Exec is not supported by the lxc driver + +ExecStartCmdImplTest.execStartTest + + - Exec is not supported by the lxc driver + +KillContainerCmdImplTest.killContainer + + - Killed container has ExitCode 0 + +ListImagesCmdImplTest.listDanglingImages + + - caused by [docker#9939](https://github.com/docker/docker/issues/9939) + +RemoveContainerCmdImplTest.removeContainer + + - caused by [docker#9939](https://github.com/docker/docker/issues/9939) + +RemoveImageCmdImplTest.removeImage + + - caused by [docker#9939](https://github.com/docker/docker/issues/9939) + +ContainerDiffCmdImplTest.testContainerDiff + + - too many diffs [{"Kind":0,"Path":"/dev"} ,{"Kind":1,"Path":"/dev/fuse"} ,{"Kind":1,"Path":"/dev/ptmx"} ,{"Kind":1,"Path":"/dev/tty"} ,{"Kind":1,"Path":"/dev/tty1"} ,{"Kind":1,"Path":"/dev/stdout"} ,{"Kind":1,"Path":"/dev/urandom"} ,{"Kind":1,"Path":"/dev/full"} ,{"Kind":1,"Path":"/dev/kmsg"} ,{"Kind":1,"Path":"/dev/null"} ,{"Kind":1,"Path":"/dev/stdin"} ,{"Kind":1,"Path":"/dev/stderr"} ,{"Kind":1,"Path":"/dev/zero"} ,{"Kind":1,"Path":"/dev/fd"} ,{"Kind":1,"Path":"/dev/random"} ,{"Kind":1,"Path":"/test"} ] + +BuildImageCmdImplTest.testDockerIgnore + + - ignore is not working + +StopContainerCmdImplTest.testStopContainer + + - Stopped container has ExitCode 0 + From a4a19fe1b04203717c9c9cffb91e3fdaaf0caa88 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 22 Feb 2015 20:24:33 +0100 Subject: [PATCH 0089/1399] [maven-release-plugin] prepare release docker-java-1.0.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 17bdc7280..d8e43cfa6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.0.0-SNAPSHOT + 1.0.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.0.0 From f73c4933360b515b33f356a129dc5de8615f73f0 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 22 Feb 2015 20:24:38 +0100 Subject: [PATCH 0090/1399] [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 d8e43cfa6..f947cd102 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.0.0 + 1.0.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.0.0 + HEAD From b61918d478e2cb9522131da635eff085b3a2fd4c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 22 Feb 2015 20:32:02 +0100 Subject: [PATCH 0091/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7765b417..782a174ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Change Log === -docker-java-1.0.0-SNAPSHOT +docker-java-1.0.0 --- * [#152](https://github.com/docker-java/docker-java/pull/152) Restore guava as a dependency * [#149](https://github.com/docker-java/docker-java/pull/149) Handle HTTP-Redirects From 63fe62f25843c7481c5638da23dad244f2542a48 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 22 Feb 2015 20:32:42 +0100 Subject: [PATCH 0092/1399] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 717b1b655..aa171e410 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Run build without integration tests: com.github.docker-java docker-java - 0.10.5 + 1.0.0 ### Latest SNAPSHOT version @@ -69,7 +69,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT ## Documentation From 238c4dd3d95807c8f47cd93c4329d86c22d4056c Mon Sep 17 00:00:00 2001 From: kalmanb Date: Mon, 23 Feb 2015 17:45:21 +1300 Subject: [PATCH 0093/1399] Adding volumes that was commented for some reason --- pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pom.xml b/pom.xml index 17bdc7280..43300cee9 100644 --- a/pom.xml +++ b/pom.xml @@ -397,10 +397,6 @@ org.apache.maven.plugins maven-source-plugin - - org.apache.maven.plugins - maven-javadoc-plugin - @@ -426,10 +422,6 @@ org.apache.maven.plugins maven-source-plugin - - org.apache.maven.plugins - maven-javadoc-plugin - From 3a7240ebb9750bd9484e6b7de240fca28f98b80c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 23 Feb 2015 20:04:37 +0100 Subject: [PATCH 0094/1399] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 782a174ca..fe196f17f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Change Log === +docker-java-SNAPSHOT +--- + * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts + docker-java-1.0.0 --- From a4e02ea17f2dd942fc093817ec64fcaadd71d1c2 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 23 Feb 2015 20:10:44 +0100 Subject: [PATCH 0095/1399] Update CHANGELOG.md --- CHANGELOG.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe196f17f..fc73713cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,11 @@ Change Log === -docker-java-SNAPSHOT +SNAPSHOT --- * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts -docker-java-1.0.0 +v1.0.0 --- * [#152](https://github.com/docker-java/docker-java/pull/152) Restore guava as a dependency * [#149](https://github.com/docker-java/docker-java/pull/149) Handle HTTP-Redirects @@ -18,7 +18,7 @@ docker-java-1.0.0 * [#131](https://github.com/docker-java/docker-java/pull/128) Utility classes and streamed JSON representations * [#128](https://github.com/docker-java/docker-java/pull/128) Allow unauthorized pullImageCmd -docker-java-0.10.5 +v0.10.5 --- * [#125](https://github.com/docker-java/docker-java/pull/125) Unixsocket support * [#123](https://github.com/docker-java/docker-java/pull/123) support DOCKER_TLS_VERIFY to detect ssl @@ -30,7 +30,7 @@ docker-java-0.10.5 * [#114](https://github.com/docker-java/docker-java/pull/114) Fix CreateContainerCmdImpl.withVolumesFrom() * [#111](https://github.com/docker-java/docker-java/pull/111) Allow to send empty messages in StartContainerCmd -docker-java-0.10.4 +v0.10.4 --- * [#109](https://github.com/docker-java/docker-java/pull/109) Support tag in push image command @@ -45,7 +45,7 @@ docker-java-0.10.4 * [#90](https://github.com/docker-java/docker-java/pull/90) Update DockerClientBuilder.java * [#88](https://github.com/docker-java/docker-java/pull/88) Add support for private repositories and pull/push authentication -docker-java-0.10.3 +v0.10.3 --- * [#87](https://github.com/docker-java/docker-java/pull/87) Improve adding of port bindings @@ -60,7 +60,7 @@ docker-java-0.10.3 * [#73](https://github.com/docker-java/docker-java/pull/73) Improve parsing and serialization of Link * [#70](https://github.com/docker-java/docker-java/pull/70) Improve instantiation and serialization of Bind -docker-java-0.10.2 +v0.10.2 --- * [#69](https://github.com/docker-java/docker-java/pull/69) Use canonical form of Docker folder when building TAR files @@ -74,14 +74,14 @@ docker-java-0.10.2 * [#56](https://github.com/docker-java/docker-java/pull/56) Update README.md * [#58](https://github.com/docker-java/docker-java/pull/58) Code clear and bug fix -docker-java-0.10.1 +v0.10.1 --- * [#49](https://github.com/docker-java/docker-java/pull/49) Allow user to check where volume is binded on host * [#47](https://github.com/docker-java/docker-java/pull/47) let CompressArchiveUtil preserve executable flags * [#46](https://github.com/docker-java/docker-java/pull/46) Fixes to AttachContainerCmd and CreateContainerCmd. -docker-java-0.10.0 +v0.10.0 --- * [#45](https://github.com/docker-java/docker-java/pull/45) Fix Issue #44 Adjusting DNS property type to be a String array as specified by the Doc... @@ -89,7 +89,7 @@ docker-java-0.10.0 * [#37](https://github.com/docker-java/docker-java/pull/37) Starts v0.10.0 * [#35](https://github.com/docker-java/docker-java/pull/35) Exposing the withTTY method for container creation. -docker-java-0.9.1 +v0.9.1 --- * [#31](https://github.com/docker-java/docker-java/pull/31) Change VolumesFrom to handle array @@ -98,13 +98,13 @@ docker-java-0.9.1 * [#19](https://github.com/docker-java/docker-java/pull/19) Add missing options to BuildCmd and set them to match Docker client. * [#16](https://github.com/docker-java/docker-java/pull/16) Build image improvements -docker-java-0.9.0 +v0.9.0 --- * [#14](https://github.com/docker-java/docker-java/pull/14) Use RegEx to match ADD command from Dockerfile. * [#9](https://github.com/docker-java/docker-java/pull/9) Add a build command accepting a tar as a InputStream, so we can build the Dockerfile TAR on the fly without a temporary folder. -docker-java-0.8.2 +v0.8.2 --- * [#2](https://github.com/docker-java/docker-java/pull/2) Move to new maven coordinate com.github.docker-java:docker-java @@ -126,11 +126,11 @@ docker-java-0.8.2 * [#37](https://github.com/docker-java/docker-java/pull/37) Starts v0.10.0 * [#32](https://github.com/docker-java/docker-java/pull/32) -docker-java-0.8.1 +v0.8.1 --- -docker-java-0.8.1 +v0.8.1 --- * [#28](https://github.com/docker-java/docker-java/pull/28) Improves use of docker-java in unit tests From decbe7121188c19be3309b171ce75bb1ff9536f3 Mon Sep 17 00:00:00 2001 From: docker-java-maintain Date: Mon, 23 Feb 2015 20:42:08 +0100 Subject: [PATCH 0096/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc73713cb..29c1ef3d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ Change Log === -SNAPSHOT +Latest SNAPSHOT --- * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts From 9be273fc57a968c166ea7e9db9250acaf8524dca Mon Sep 17 00:00:00 2001 From: docker-java-maintain Date: Mon, 23 Feb 2015 21:24:46 +0100 Subject: [PATCH 0097/1399] Update circle.md --- circle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.md b/circle.md index f5cbc0ed8..d2d671d84 100644 --- a/circle.md +++ b/circle.md @@ -6,7 +6,7 @@ The build including tests and integration tests can be automatically run on [cir 1. create an account on circle CI using your github account. 2. select docker-java from the github projects listed in your profile. 3. go to the project settings for docker-java (click on the gear-wheel icon beside the docker-java title). -4. open the *Environemnt variable* page. +4. open the *Environment variable* page. 5. add the following environment variables: - DOCKER_EMAIL - DOCKER_PASSWORD From 1098c29b0ffc534114b3fb8efbd1634daa4f40c5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 23 Feb 2015 21:31:39 +0100 Subject: [PATCH 0098/1399] Fixing imports --- .../github/dockerjava/api/DockerClient.java | 2 +- .../dockerjava/api/command/BuildImageCmd.java | 1 - .../dockerjava/api/command/SaveImageCmd.java | 2 -- .../core/command/BuildImageCmdImpl.java | 25 +++---------------- .../dockerjava/jaxrs/BuildImageCmdExec.java | 5 +--- .../jaxrs/CopyFileFromContainerCmdExec.java | 1 - .../dockerjava/jaxrs/LogContainerCmdExec.java | 1 - .../github/dockerjava/jaxrs/PingCmdExec.java | 1 - .../dockerjava/jaxrs/SaveImageCmdExec.java | 18 ++++--------- .../jaxrs/StartContainerCmdExec.java | 1 - 10 files changed, 10 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index c2b15cf34..d905ef105 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -110,4 +110,4 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( @Override public void close() throws IOException; -} \ 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 8a1e62115..d9e45b4b5 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.model.EventStreamItem; -import com.github.dockerjava.api.model.PushEventStreamItem; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index b8a5af4a2..8b26c24a9 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -2,9 +2,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.PushEventStreamItem; -import java.io.IOException; import java.io.InputStream; public interface SaveImageCmd extends DockerCmd{ 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 32b5b2f91..40f4fcfd0 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -1,33 +1,14 @@ package com.github.dockerjava.core.command; +import static com.google.common.base.Preconditions.checkNotNull; + import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.filefilter.TrueFileFilter; - -import com.github.dockerjava.api.DockerClientException; + import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.core.CompressArchiveUtil; -import com.github.dockerjava.core.GoLangFileMatch; -import com.github.dockerjava.core.GoLangFileMatchException; -import com.github.dockerjava.core.GoLangMatchFileFilter; import com.github.dockerjava.core.dockerfile.Dockerfile; -import static com.google.common.base.Preconditions.*; - /** * * Build an image from Dockerfile. diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index ffbd8306c..431980468 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; - - import static javax.ws.rs.client.Entity.entity; import java.io.IOException; @@ -20,9 +18,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.PushImageCmd; + import com.github.dockerjava.api.model.EventStreamItem; -import com.github.dockerjava.api.model.PushEventStreamItem; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 3061df53a..5126aaed3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -6,7 +6,6 @@ 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; diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index ad1d61853..b279ebdcf 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -3,7 +3,6 @@ import java.io.InputStream; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index f8a172a11..65bdc04b1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -1,7 +1,6 @@ package com.github.dockerjava.jaxrs; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index 49f50856c..d5087d7fe 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -1,22 +1,14 @@ package com.github.dockerjava.jaxrs; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.github.dockerjava.api.command.PushImageCmd; -import com.github.dockerjava.api.command.SaveImageCmd; -import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.PushEventStreamItem; -import com.google.common.collect.ImmutableList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.InputStream; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; -import static javax.ws.rs.client.Entity.entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.SaveImageCmd; public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 661317266..8ca1a42fc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -4,7 +4,6 @@ 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; From 8462173378da554529af48cc10ac866fcbbd8fce Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 23 Feb 2015 21:35:28 +0100 Subject: [PATCH 0099/1399] Disable test cleanup exceptions stacktraces --- .../client/AbstractDockerClientTest.java | 9 +-- .../core/TestDockerCmdExecFactory.java | 78 ++++++++++--------- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index f5519283c..1e61b9a7d 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -39,8 +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()) @@ -51,8 +50,6 @@ public void beforeTest() { // need to block until image is pulled completely asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); - - assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); } @@ -90,7 +87,7 @@ public void afterMethod(ITestResult result) { try { dockerClient.removeContainerCmd(container).withForce().exec(); } catch (DockerException ignore) { - ignore.printStackTrace(); + //ignore.printStackTrace(); } } @@ -99,7 +96,7 @@ public void afterMethod(ITestResult result) { try { dockerClient.removeImageCmd(image).withForce().exec(); } catch (DockerException ignore) { - ignore.printStackTrace(); + //ignore.printStackTrace(); } } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 5e7f2974d..1c9342dd9 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -11,24 +11,25 @@ import com.github.dockerjava.jaxrs.BuildImageCmdExec; /** - * Special {@link DockerCmdExecFactory} implementation that collects container and image creations - * while test execution for the purpose of automatically cleanup. + * Special {@link DockerCmdExecFactory} implementation that collects container + * and image creations while test execution for the purpose of automatically + * cleanup. * * @author marcus - * + * */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { - + private List containerNames = new ArrayList(); - + private List imageNames = new ArrayList(); - + private DockerCmdExecFactory delegate; - + public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { this.delegate = delegate; } - + @Override public void init(DockerClientConfig dockerClientConfig) { delegate.init(dockerClientConfig); @@ -38,19 +39,20 @@ public void init(DockerClientConfig dockerClientConfig) { public void close() throws IOException { delegate.close(); } - + @Override public CreateContainerCmd.Exec createCreateContainerCmdExec() { return new CreateContainerCmd.Exec() { @Override public CreateContainerResponse exec(CreateContainerCmd command) { - CreateContainerResponse createContainerResponse = delegate.createCreateContainerCmdExec().exec(command); + CreateContainerResponse createContainerResponse = delegate + .createCreateContainerCmdExec().exec(command); containerNames.add(createContainerResponse.getId()); return createContainerResponse; } }; } - + @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { return new RemoveContainerCmd.Exec() { @@ -62,21 +64,20 @@ public Void exec(RemoveContainerCmd command) { } }; } - + @Override public CreateImageCmd.Exec createCreateImageCmdExec() { return new CreateImageCmd.Exec() { @Override public CreateImageResponse exec(CreateImageCmd command) { - CreateImageResponse createImageResponse = delegate.createCreateImageCmdExec().exec(command); + CreateImageResponse createImageResponse = delegate + .createCreateImageCmdExec().exec(command); imageNames.add(createImageResponse.getId()); return createImageResponse; } }; } - - - + @Override public RemoveImageCmd.Exec createRemoveImageCmdExec() { return new RemoveImageCmd.Exec() { @@ -88,25 +89,26 @@ public Void exec(RemoveImageCmd command) { } }; } - + @Override public BuildImageCmd.Exec createBuildImageCmdExec() { return new BuildImageCmd.Exec() { @Override - public BuildImageCmd.Response exec(BuildImageCmd command) { + public BuildImageCmd.Response exec(BuildImageCmd command) { // can't detect image id here so tagging it String tag = command.getTag(); - if(tag == null || "".equals(tag.trim())) { + if (tag == null || "".equals(tag.trim())) { tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); command.withTag(tag); } - InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); + InputStream inputStream = delegate.createBuildImageCmdExec() + .exec(command); imageNames.add(tag); return new BuildImageCmdExec.ResponseImpl(inputStream); } - }; + }; } - + @Override public Exec createAuthCmdExec() { return delegate.createAuthCmdExec(); @@ -122,12 +124,12 @@ public PingCmd.Exec createPingCmdExec() { return delegate.createPingCmdExec(); } - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return delegate.createExecCmdExec(); - } + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return delegate.createExecCmdExec(); + } - @Override + @Override public VersionCmd.Exec createVersionCmdExec() { return delegate.createVersionCmdExec(); } @@ -141,9 +143,11 @@ public PullImageCmd.Exec createPullImageCmdExec() { public PushImageCmd.Exec createPushImageCmdExec() { return delegate.createPushImageCmdExec(); } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { return delegate.createSaveImageCmdExec(); } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return delegate.createSaveImageCmdExec(); + } @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { @@ -185,12 +189,12 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return delegate.createAttachContainerCmdExec(); } - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return delegate.createExecStartCmdExec(); - } + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return delegate.createExecStartCmdExec(); + } - @Override + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } @@ -253,11 +257,9 @@ public EventsCmd.Exec createEventsCmdExec() { public List getContainerNames() { return new ArrayList(containerNames); } - + public List getImageNames() { return new ArrayList(imageNames); } - - } From f0c4acb174ae535fe188d80d55d2030bb6a62240 Mon Sep 17 00:00:00 2001 From: docker-java-maintain Date: Tue, 24 Feb 2015 06:44:00 +0100 Subject: [PATCH 0100/1399] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aa171e410..2036bc94b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![Build Status](https://travis-ci.org/docker-java/docker-java.svg?branch=master)](https://travis-ci.org/docker-java/docker-java) +[![Circle CI](https://circleci.com/gh/docker-java/docker-java.svg?style=svg)](https://circleci.com/gh/docker-java/docker-java) # docker-java Java API client for [Docker](http://docs.docker.io/ "Docker") From ec8f1f9b0e636b5155035a25ebbd3377dcab0d92 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 24 Feb 2015 15:53:56 +0300 Subject: [PATCH 0101/1399] Added InspectExec command --- .../github/dockerjava/api/DockerClient.java | 2 + .../api/command/DockerCmdExecFactory.java | 2 + .../api/command/InspectContainerResponse.java | 8 ++ .../api/command/InspectExecCmd.java | 16 ++++ .../api/command/InspectExecResponse.java | 93 +++++++++++++++++++ .../dockerjava/core/DockerClientImpl.java | 7 +- .../core/command/InspectExecCmdImpl.java | 41 ++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 5 + .../dockerjava/jaxrs/InspectExecCmdExec.java | 24 +++++ .../core/TestDockerCmdExecFactory.java | 7 +- 10 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java create mode 100644 src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index d905ef105..16e70b6c7 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -78,6 +78,8 @@ public CreateImageCmd createImageCmd(String repository, public ExecStartCmd execStartCmd(String containerId); + public InspectExecCmd inspectExecCmd(String execId); + public LogContainerCmd logContainerCmd(String containerId); public CopyFileFromContainerCmd copyFileFromContainerCmd( 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 ca2bbcae0..8b9880747 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -51,6 +51,8 @@ public interface DockerCmdExecFactory extends Closeable { public ExecStartCmd.Exec createExecStartCmdExec(); + public InspectExecCmd.Exec createInspectExecCmdExec(); + public LogContainerCmd.Exec createLogContainerCmdExec(); public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); 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 80d526342..c86e13c54 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; +import java.util.List; import java.util.Map; import com.github.dockerjava.api.model.*; @@ -66,6 +67,9 @@ public class InspectContainerResponse { @JsonProperty("ResolvConfPath") private String resolvConfPath; + @JsonProperty("ExecIDs") + private List execIds; + @JsonProperty("State") private ContainerState state; @@ -153,6 +157,10 @@ public String getMountLabel() { return mountLabel; } + public List getExecIds() { + return execIds; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java new file mode 100644 index 000000000..13882b8f7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -0,0 +1,16 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.NotFoundException; + +public interface InspectExecCmd extends DockerCmd { + public String getExecId(); + public InspectExecCmd withExecId(String execId); + + /** + * @throws NotFoundException if no such exec has been found + */ + @Override + public InspectExecResponse exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec {} +} diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java new file mode 100644 index 000000000..2eee14f29 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -0,0 +1,93 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class InspectExecResponse { + @JsonProperty("ID") + private String id; + + @JsonProperty("OpenStdin") + private boolean openStdin; + + @JsonProperty("OpenStderr") + private boolean openStderr; + + @JsonProperty("OpenStdout") + private boolean openStdout; + + @JsonProperty("Running") + private boolean running; + + public String getId() { + return id; + } + + public boolean isOpenStdin() { + return openStdin; + } + + public boolean isOpenStderr() { + return openStderr; + } + + public boolean isOpenStdout() { + return openStdout; + } + + public boolean isRunning() { + return running; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public class ProcessConfig { + @JsonProperty("arguments") + private List arguments; + + @JsonProperty("entrypoint") + private String entryPoint; + + @JsonProperty("privileged") + private boolean privileged; + + @JsonProperty("tty") + private boolean tty; + + @JsonProperty("user") + private String user; + + public List getArguments() { + return arguments; + } + + public String getEntryPoint() { + return entryPoint; + } + + public boolean isPrivileged() { + return privileged; + } + + public boolean isTty() { + return tty; + } + + public String getUser() { + return user; + } + + @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 dd9e566da..8f561dffa 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -224,7 +224,12 @@ public ExecStartCmd execStartCmd(String containerId) { return new ExecStartCmdImpl(getDockerCmdExecFactory().createExecStartCmdExec(), containerId); } - @Override + @Override + public InspectExecCmd inspectExecCmd(String execId) { + return new InspectExecCmdImpl(getDockerCmdExecFactory().createInspectExecCmdExec(), execId); + } + + @Override public LogContainerCmd logContainerCmd(String containerId) { return new LogContainerCmdImpl(getDockerCmdExecFactory() .createLogContainerCmdExec(), containerId); diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java new file mode 100644 index 000000000..1fd728622 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.DockerCmdExec; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.google.common.base.Preconditions; + +public class InspectExecCmdImpl extends AbstrDockerCmd implements InspectExecCmd { + private String execId; + + public InspectExecCmdImpl(InspectExecCmd.Exec execution, String execId) { + super(execution); + withExecId(execId); + } + + @Override + public String getExecId() { + return execId; + } + + @Override + public InspectExecCmd withExecId(String execId) { + Preconditions.checkNotNull(execId, "execId was not specified"); + this.execId = execId; + return this; + } + + @Override + public String toString() { + return "inspect " + execId; + } + + /** + * @throws NotFoundException No such exec + */ + @Override + public InspectExecResponse exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 9df09ba78..f1f178dc9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -221,6 +221,11 @@ public ExecStartCmd.Exec createExecStartCmdExec() { return new ExecStartCmdExec(getBaseResource()); } + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return new InspectExecCmdExec(getBaseResource()); + } + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return new LogContainerCmdExec(getBaseResource()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java new file mode 100644 index 000000000..b9ee33d61 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectExecResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class InspectExecCmdExec extends AbstrDockerCmdExec implements InspectExecCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); + + public InspectExecCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InspectExecResponse execute(InspectExecCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/json").resolveTemplate("id", command.getExecId()); + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectExecResponse.class); + } +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 1c9342dd9..869a12fcf 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -194,7 +194,12 @@ public ExecStartCmd.Exec createExecStartCmdExec() { return delegate.createExecStartCmdExec(); } - @Override + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return delegate.createInspectExecCmdExec(); + } + + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } From bcfcb47c479e691ff358bfbdfc59ea86ad096968 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Tue, 24 Feb 2015 16:44:11 +0300 Subject: [PATCH 0102/1399] Added missing ExitCode field --- .../github/dockerjava/api/command/InspectExecResponse.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java index 2eee14f29..1532f7d55 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -23,6 +23,9 @@ public class InspectExecResponse { @JsonProperty("Running") private boolean running; + @JsonProperty("ExitCode") + private int exitCode; + public String getId() { return id; } @@ -43,6 +46,10 @@ public boolean isRunning() { return running; } + public int getExitCode() { + return exitCode; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); From 553b39453324ad4a8d85101e520fe2cffd718352 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Feb 2015 20:55:41 +0100 Subject: [PATCH 0103/1399] Fix issue #158 --- .../com/github/dockerjava/api/model/Info.java | 57 +++++++++++++++++-- .../core/command/InfoCmdImplTest.java | 1 + 2 files changed, 54 insertions(+), 4 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 7fe6ae798..fb63f2ff0 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -25,6 +25,9 @@ public class Info { @JsonProperty("Debug") private boolean debug; + + @JsonProperty("DockerRootDir") + private String DockerRootDir; @JsonProperty("Driver") private String driver; @@ -34,9 +37,12 @@ public class Info { @JsonProperty("ExecutionDriver") private String executionDriver; + + @JsonProperty("ID") + private String ID; @JsonProperty("IPv4Forwarding") - private String IPv4Forwarding; + private boolean IPv4Forwarding; @JsonProperty("Images") private int images; @@ -52,9 +58,21 @@ public class Info { @JsonProperty("KernelVersion") private String kernelVersion; + + @JsonProperty("Labels") + private String Labels; @JsonProperty("MemoryLimit") private boolean memoryLimit; + + @JsonProperty("MemTotal") + private long memTotal; + + @JsonProperty("Name") + private String name; + + @JsonProperty("NCPU") + private int NCPU; @JsonProperty("NEventsListener") private long nEventListener; @@ -64,12 +82,15 @@ public class Info { @JsonProperty("NGoroutines") private int NGoroutines; + + @JsonProperty("OperatingSystem") + private String OperatingSystem; @JsonProperty("Sockets") private String[] sockets; @JsonProperty("SwapLimit") - private int swapLimit; + private boolean swapLimit; public boolean isDebug() { return debug; @@ -78,6 +99,10 @@ public boolean isDebug() { public int getContainers() { return containers; } + + public String getDockerRootDir() { + return DockerRootDir; + } public String getDriver() { return driver; @@ -90,8 +115,12 @@ public List getDriverStatuses() { public int getImages() { return images; } + + public String getID() { + return ID; + } - public String getIPv4Forwarding() { + public boolean getIPv4Forwarding() { return IPv4Forwarding; } @@ -110,6 +139,10 @@ public String getInitSha1() { public String getKernelVersion() { return kernelVersion; } + + public String getLabels() { + return Labels; + } public String[] getSockets() { return sockets; @@ -122,6 +155,18 @@ public boolean isMemoryLimit() { public long getnEventListener() { return nEventListener; } + + public long getMemTotal() { + return memTotal; + } + + public String getName() { + return name; + } + + public int getNCPU() { + return NCPU; + } public int getNFd() { return NFd; @@ -130,8 +175,12 @@ public int getNFd() { public int getNGoroutines() { return NGoroutines; } + + public String getOperatingSystem() { + return OperatingSystem; + } - public int getSwapLimit() { + public boolean getSwapLimit() { return swapLimit; } diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index d1de7076b..7170c12f3 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -68,5 +68,6 @@ public void info() throws DockerException { assertTrue(dockerInfo.getImages() > 0); assertTrue(dockerInfo.getNFd() > 0); assertTrue(dockerInfo.getNGoroutines() > 0); + assertTrue(dockerInfo.getNCPU() > 0); } } From 5bed982f2bb31d9e7971bd3123f343288f72653c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Feb 2015 21:04:31 +0100 Subject: [PATCH 0104/1399] Fix race condition --- .../dockerjava/core/command/StartContainerCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 22307b07b..37d805aa2 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -283,7 +283,7 @@ public void startContainerWithLinking() throws DockerException { } CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("true") + .createContainerCmd("busybox").withCmd("sleep", "9999") .withName("container2").exec(); LOG.info("Created container2 {}", container2.toString()); From 0f018636539da923a9529fb4f373c8ee0dcc058b Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 24 Feb 2015 21:17:11 +0100 Subject: [PATCH 0105/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29c1ef3d8..ead9068e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- + * [#159](https://github.com/docker-java/docker-java/pull/159) Add missing Info fields * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts From 1e2c99acb1123cd358d0bad774d48b14adc9a91a Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Mon, 2 Mar 2015 14:13:28 +0300 Subject: [PATCH 0106/1399] Added a test for InspectExec command --- .../core/command/InspectExecCmdImplTest.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java new file mode 100644 index 000000000..aacc51f60 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -0,0 +1,96 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +@Test(groups = "integration") +public class InspectExecCmdImplTest extends AbstractDockerClientTest { + @BeforeTest + public void beforeTest() throws DockerException { + 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 inspectExecTest() { + 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(); + + ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout() + .withAttachStderr() + .withCmd("touch", "/marker").exec(); + LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); + assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); + ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout() + .withAttachStderr() + .withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); + assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); + + // Check that file does not exist + InputStream response1 = dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()) + .exec(); + asString(response1); // consume + + InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + assertThat(first.getExitCode(), is(1)); + + // Create the file + InputStream response2 = dockerClient.execStartCmd(container.getId()) + .withExecId(touchFileCmdCreateResponse.getId()) + .exec(); + asString(response2); + + InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); + assertThat(second.getExitCode(), is(0)); + + // Check that file does exist now + InputStream response3 = dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()) + .exec(); + asString(response3); + + InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + assertThat(third.getExitCode(), is(0)); + + } +} From c88167b52d46926523522be25f5626885ba51783 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Wed, 4 Mar 2015 08:56:21 +0000 Subject: [PATCH 0107/1399] PushImageCmd assumes that you have an auth config setup for the host that you are pushing to, which is not mandatory. This generates an exception because if fails the precondition of the config not being null. Signed-off-by: Nigel Magnay --- .../com/github/dockerjava/core/DockerClientImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index dd9e566da..5f085490a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -126,8 +126,13 @@ public PullImageCmd pullImageCmd(String repository) { @Override public PushImageCmd pushImageCmd(String name) { - return new PushImageCmdImpl(getDockerCmdExecFactory() - .createPushImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); + PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory() + .createPushImageCmdExec(), name); + + AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); + if( cfg != null ) + cmd.withAuthConfig(cfg); + return cmd; } @Override From 2b4ca239d7033d20fd1516184f1fe31bdd902d9d Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Fri, 6 Feb 2015 14:30:22 +0000 Subject: [PATCH 0108/1399] Add some utility classes for splitting up "tag parameters" passed at various points (e.g: 10.0.0.1:8000/mybuild:1234) Signed-off-by: Nigel Magnay --- .../dockerjava/api/model/Identifier.java | 59 +++++++++++++++++++ .../dockerjava/api/model/Repository.java | 46 +++++++++++++++ .../dockerjava/api/model/IdentifierTest.java | 39 ++++++++++++ .../dockerjava/api/model/RepositoryTest.java | 18 ++++++ 4 files changed, 162 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/model/Identifier.java create mode 100644 src/main/java/com/github/dockerjava/api/model/Repository.java create mode 100644 src/test/java/com/github/dockerjava/api/model/IdentifierTest.java create mode 100644 src/test/java/com/github/dockerjava/api/model/RepositoryTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/Identifier.java b/src/main/java/com/github/dockerjava/api/model/Identifier.java new file mode 100644 index 000000000..498104e29 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.api.model; + + +import com.google.common.base.Objects; +import com.google.common.base.Optional; + +/** + * Created by magnayn on 22/07/2014. + */ +public class Identifier { + public final Repository repository; + public final Optional tag; + + public Identifier(Repository repository, String tag) { + this.repository = repository; + + if( tag == null ) + this.tag = Optional.absent(); + else + this.tag = Optional.of(tag); + } + + + /** + * Return an identifier that correctly splits up the repository and tag. + * There can be > 1 ":" + * fred/jim --> fred/jim, [] + * fred/jim:123 --> fred/jim, 123 + * fred:123/jim:123 --> fred:123/jim, 123 + * + * + * @param identifier as a string + * @return parsed identifier. + */ + public static Identifier fromCompoundString(String identifier) { + String[] parts = identifier.split("/"); + if( parts.length != 2 ) { + String[] rhs = identifier.split(":"); + if( rhs.length != 2 ) + return new Identifier( new Repository(identifier), null); + else + return new Identifier( new Repository(rhs[0]), rhs[1]); + } + + String[] rhs = parts[1].split(":"); + if( rhs.length != 2 ) + return new Identifier( new Repository(identifier), null); + + return new Identifier( new Repository(parts[0] + "/" + rhs[0]), rhs[1]); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("repository", repository) + .add("tag", tag) + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/Repository.java b/src/main/java/com/github/dockerjava/api/model/Repository.java new file mode 100644 index 000000000..673eabee2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Repository.java @@ -0,0 +1,46 @@ +package com.github.dockerjava.api.model; + +import com.google.common.base.Objects; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * A repository or image name. + */ +public class Repository { + public final String name; + + /** + * Name may be eg. 'busybox' or '10.0.0.1:5000/fred' + * @param name Repository name + */ + public Repository(String name) { + this.name = name; + } + + /** + * Return the URL portion (repository). + * Note that this might not actually BE a repository location. + * @return + * @throws java.net.MalformedURLException + */ + public URL getURL() throws MalformedURLException { + return new URL("http://" + name); + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("name", name) + .toString(); + } + + + public String getPath() { + if( !name.contains("/") ) + return name; + + return name.substring(name.indexOf("/") + 1 ); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java new file mode 100644 index 000000000..d57c0b572 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.api.model; + +import junit.framework.TestCase; + + +public class IdentifierTest extends TestCase { + + public void testFromCompoundString() throws Exception { + + Identifier i1 = Identifier.fromCompoundString("10.0.0.1/jim"); + Identifier i2 = Identifier.fromCompoundString("10.0.0.1/jim:123"); + Identifier i3 = Identifier.fromCompoundString("10.0.0.1:123/jim:124"); + Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); + + assertTrue(!i1.tag.isPresent()); + assertEquals(i1.repository.name, "10.0.0.1/jim"); + + assertTrue(i2.tag.isPresent()); + assertEquals(i2.tag.get(), "123"); + assertEquals(i2.repository.name, "10.0.0.1/jim"); + + assertTrue(i3.tag.isPresent()); + assertEquals(i3.tag.get(), "124"); + assertEquals(i3.repository.name, "10.0.0.1:123/jim"); + assertEquals(i3.repository.getURL().getPort(), 123); + assertEquals(i3A.tag.get(), "latest"); + + + Identifier i4 = Identifier.fromCompoundString("centos:latest"); + assertTrue(i4.tag.isPresent()); + assertEquals(i4.tag.get(), "latest"); + + Identifier i5 = Identifier.fromCompoundString("busybox"); + assertTrue(!i5.tag.isPresent()); + + Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); + assertEquals(i6.repository.getPath(), "my-test-image"); + } +} \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java new file mode 100644 index 000000000..8a40de28b --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.model; + +import junit.framework.TestCase; + +public class RepositoryTest extends TestCase { + public void testRepository() throws Exception { + + Repository repo = new Repository("10.0.0.1/jim"); + Repository repo1 = new Repository("10.0.0.1:1234/jim"); + Repository repo2 = new Repository("busybox"); + + assertEquals("jim", repo.getPath()); + assertEquals("jim", repo1.getPath()); + assertEquals("busybox", repo2.getPath()); + + assertEquals(1234, repo1.getURL().getPort()); + } +} \ No newline at end of file From 81b30b2625b87b7cd46ed8a78b47bcf11fba24a9 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Mon, 23 Feb 2015 16:55:46 +0000 Subject: [PATCH 0109/1399] Convenience function for pushing by full tag. Signed-off-by: Nigel Magnay --- .../github/dockerjava/api/DockerClient.java | 3 +++ .../dockerjava/core/DockerClientImpl.java | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index d905ef105..1a3a285fa 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.Identifier; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { @@ -29,6 +30,8 @@ public interface DockerClient extends Closeable { public PushImageCmd pushImageCmd(String name); + public PushImageCmd pushImageCmd(Identifier identifier); + public CreateImageCmd createImageCmd(String repository, InputStream imageStream); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index dd9e566da..06009d875 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -10,6 +10,7 @@ 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.Identifier; import com.github.dockerjava.core.command.*; /** @@ -129,8 +130,21 @@ public PushImageCmd pushImageCmd(String name) { return new PushImageCmdImpl(getDockerCmdExecFactory() .createPushImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); } - - @Override + + @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 ) + cmd.withAuthConfig(cfg); + + return cmd; + } + + @Override public SaveImageCmd saveImageCmd(String name) { return new SaveImageCmdImpl(getDockerCmdExecFactory() .createSaveImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); From c2b14dc5947d6a89461ef12076efc64f9220a7e1 Mon Sep 17 00:00:00 2001 From: Ales Justin Date: Fri, 6 Mar 2015 15:27:03 +0100 Subject: [PATCH 0110/1399] Close in finally. --- .../com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 8 +++++--- .../com/github/dockerjava/jaxrs/PushImageCmdExec.java | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 431980468..b34926c6c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -79,9 +79,11 @@ public Iterable getItems() throws IOException { // and then do other configuration, if any, and read: Iterator items = reader.readValues(proxy); - proxy.close(); - - return ImmutableList.copyOf(items); + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 4d7be3f0a..e0120c2f5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -74,9 +74,11 @@ public Iterable getItems() throws IOException { // and then do other configuration, if any, and read: Iterator items = reader.readValues(proxy); - proxy.close(); - - return ImmutableList.copyOf(items); + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } } @Override From 037c2f3b6fd6374f932343a016c4defd79d073cc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Mar 2015 20:19:03 +0100 Subject: [PATCH 0111/1399] Ignore test in circle CI --- .../github/dockerjava/core/command/InspectExecCmdImplTest.java | 3 ++- 1 file changed, 2 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 aacc51f60..2deddca09 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.command.InspectExecResponse; import com.github.dockerjava.client.AbstractDockerClientTest; + import org.testng.ITestResult; import org.testng.annotations.*; @@ -39,7 +40,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void inspectExecTest() { String containerName = "generated_" + new SecureRandom().nextInt(); From cb3ee13d661ef283538a01c9132c9f54c3c1929b Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 20:21:09 +0100 Subject: [PATCH 0112/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ead9068e3..4961c3205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- + * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command * [#159](https://github.com/docker-java/docker-java/pull/159) Add missing Info fields * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts From 78226ccd88dd6310ea3d1a2ed6b13dae9468aa6c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 20:57:03 +0100 Subject: [PATCH 0113/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4961c3205..f068a5f63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- + * [#165](https://github.com/docker-java/docker-java/pull/165) PushImageCmd assumes that you have an auth config setup * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command * [#159](https://github.com/docker-java/docker-java/pull/159) Add missing Info fields * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts From b8034385ec062976750e05bcb56c9d39aabef2fd Mon Sep 17 00:00:00 2001 From: efj Date: Wed, 4 Mar 2015 17:47:20 +0100 Subject: [PATCH 0114/1399] Implemented AuthConfigurations for the Build command. Required when creating an image with a FROM command, using a private registry. --- .../dockerjava/api/command/BuildImageCmd.java | 10 +++++++-- .../api/model/AuthConfigurations.java | 21 +++++++++++++++++++ .../dockerjava/api/model/EventStreamItem.java | 4 +++- .../api/model/PushEventStreamItem.java | 4 +++- .../core/command/BuildImageCmdImpl.java | 14 +++++++++++++ .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 10 +++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 16 ++++++++++---- 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java 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 d9e45b4b5..62d8abed6 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.model.EventStreamItem; - 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. @@ -26,6 +27,8 @@ public interface BuildImageCmd extends DockerCmd{ public boolean isQuiet(); + public AuthConfigurations getBuildAuthConfigs(); + public BuildImageCmd withTarInputStream(InputStream tarInputStream); public BuildImageCmd withNoCache(); @@ -40,10 +43,13 @@ public interface BuildImageCmd extends DockerCmd{ public BuildImageCmd withQuiet(boolean quiet); + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); + public static interface Exec extends DockerCmdExec { } 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/model/AuthConfigurations.java b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java new file mode 100644 index 000000000..5a62c7587 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java @@ -0,0 +1,21 @@ +package com.github.dockerjava.api.model; + +import java.util.Map; +import java.util.TreeMap; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AuthConfigurations { + + @JsonProperty("configs") + private Map configs = new TreeMap<>(); + + public void addConfig(AuthConfig authConfig){ + configs.put(authConfig.getServerAddress(), authConfig); + } + + public Map getConfigs(){ + return this.configs; + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 5dd9d65c8..010ed9af7 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -15,7 +15,9 @@ @JsonIgnoreProperties(ignoreUnknown=true) public class EventStreamItem implements Serializable { - @JsonProperty("stream") + private static final long serialVersionUID = 638778515773898651L; + + @JsonProperty("stream") private String stream; // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index 7230a7cef..c8aac4c9c 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -13,7 +13,9 @@ @JsonIgnoreProperties(ignoreUnknown=true) public class PushEventStreamItem implements Serializable { - @JsonProperty("status") + private static final long serialVersionUID = -5187169652557467828L; + + @JsonProperty("status") private String status; @JsonProperty("progress") 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 40f4fcfd0..9f57bd74a 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -7,6 +7,7 @@ import java.io.InputStream; import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.dockerfile.Dockerfile; /** @@ -22,6 +23,7 @@ public class BuildImageCmdImpl extends AbstrDockerCmd, RES_T> implements DockerCmdExec { @@ -38,6 +39,15 @@ protected String registryAuth(AuthConfig authConfig) { throw new RuntimeException(e); } } + + protected String registryConfigs(AuthConfigurations authConfigs) { + try { + return Base64.encodeBase64String(new ObjectMapper() + .writeValueAsString(authConfigs).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } @Override public RES_T exec(CMD_T command) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index b34926c6c..405192adb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -6,6 +6,7 @@ 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; @@ -18,9 +19,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.github.dockerjava.api.command.BuildImageCmd; - +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.EventStreamItem; - import com.google.common.collect.ImmutableList; public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { @@ -55,14 +55,22 @@ protected ResponseImpl execute(BuildImageCmd command) { LOGGER.debug("POST: {}", webResource); - InputStream is = webResource - .request() + InputStream is = resourceWithOptionalAuthConfig(command, webResource.request()) .accept(MediaType.TEXT_PLAIN) .post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class); return new ResponseImpl(is); } + + private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + public static class ResponseImpl extends BuildImageCmd.Response { private final InputStream proxy; From 0fd5a8d8556c52e4fc36eb486ffcab00d757172a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 22:12:34 +0100 Subject: [PATCH 0115/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f068a5f63..9abc7be8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Latest SNAPSHOT * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command * [#159](https://github.com/docker-java/docker-java/pull/159) Add missing Info fields * [#156](https://github.com/docker-java/docker-java/pull/156) Add support for configuring ExtraHosts + * [#146](https://github.com/docker-java/docker-java/pull/146) Create Identifier type v1.0.0 From c42720a1e479248b9c46527f2475e187b569b9e1 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 22:48:33 +0100 Subject: [PATCH 0116/1399] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2036bc94b..ab181a531 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ For code examples, please look at the [Wiki](https://github.com/docker-java/dock There are a couple of configuration items, all of which have sensible defaults: -* `url` The Docker URL, e.g. `https://localhost:2376`. +* `url` The Docker URL, e.g. `https://localhost:2376` or `unix:///var/run/docker.sock` * `version` The API version, e.g. `1.16`. * `username` Your registry username (required to push containers). * `password` Your registry password. From 920c9009c3cb42b80286018bad06d443a9e92d95 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 22:56:51 +0100 Subject: [PATCH 0117/1399] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ab181a531..830ce6b03 100644 --- a/README.md +++ b/README.md @@ -31,11 +31,13 @@ If you do not have access to a Docker server or just want to execute the build q $ mvn clean install -DskipITs By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java -client uses TCP/IP to connect to the Docker server, so you will need to make sure that your Docker server is +client uses TCP/IP to connect to the Docker server by default, so you will need to make sure that your Docker server is listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock" +However you can force docker-java to use UNIX socket communication by configure the following url: ```unix:///var/run/docker.sock``` + More details setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ Now make sure that docker is up: From f38e9350cad4c627645b0a9d45cd4afc747db77c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Mar 2015 22:57:38 +0100 Subject: [PATCH 0118/1399] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 830ce6b03..b7e9c6217 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,9 @@ listening on TCP port. To allow Docker server to use TCP add the following line DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock" -However you can force docker-java to use UNIX socket communication by configure the following url: ```unix:///var/run/docker.sock``` +However you can force docker-java to use UNIX socket communication by configure the following url: + + unix:///var/run/docker.sock More details setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ From 73602ad9ca862dd2350f242de25a5a2257073792 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Mon, 9 Mar 2015 13:33:58 +0000 Subject: [PATCH 0119/1399] Since docker 1.5.0, it has been allowable to specify files other than 'Dockerfile' for building images. Alter the BuildImageCmd so that you can either specify the directory (which assumes Dockerfile, for backwards compat) or the actual file you wish to use. Signed-off-by: Nigel Magnay --- .../dockerjava/api/command/BuildImageCmd.java | 5 ++- .../dockerjava/core/DockerClientImpl.java | 4 +- .../core/command/BuildImageCmdImpl.java | 39 +++++++++++++------ 3 files changed, 34 insertions(+), 14 deletions(-) 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 62d8abed6..becaeccc6 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.command; +import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -26,9 +27,11 @@ public interface BuildImageCmd extends DockerCmd{ public boolean hasRemoveEnabled(); public boolean isQuiet(); - + public AuthConfigurations getBuildAuthConfigs(); + public BuildImageCmd withDockerfile(File dockerfile); + public BuildImageCmd withTarInputStream(InputStream tarInputStream); public BuildImageCmd withNoCache(); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 4adf50793..0dd560af3 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -292,9 +292,9 @@ public CommitCmd commitCmd(String containerId) { } @Override - public BuildImageCmd buildImageCmd(File dockerFolder) { + public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { return new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec(), dockerFolder); + .createBuildImageCmdExec(), dockerFileOrFolder); } @Override 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 9f57bd74a..c793ed6e6 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -25,19 +25,18 @@ public class BuildImageCmdImpl extends AbstrDockerCmd Date: Mon, 16 Mar 2015 22:37:45 +0100 Subject: [PATCH 0120/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9abc7be8a..f8841d766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- + * [#170](https://github.com/docker-java/docker-java/pull/170) Allow to specify alternative files other than 'Dockerfile' for building images * [#165](https://github.com/docker-java/docker-java/pull/165) PushImageCmd assumes that you have an auth config setup * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command * [#159](https://github.com/docker-java/docker-java/pull/159) Add missing Info fields From 6a890723d26a6c65303a2c3c7432360a1cde6788 Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Thu, 19 Mar 2015 11:25:56 +0100 Subject: [PATCH 0121/1399] SaveImageCmd assumes that you have an auth config setup --- .../com/github/dockerjava/core/DockerClientImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 0dd560af3..d83c26d2d 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -151,9 +151,13 @@ public PushImageCmd pushImageCmd(Identifier identifier) { @Override public SaveImageCmd saveImageCmd(String name) { - return new SaveImageCmdImpl(getDockerCmdExecFactory() - .createSaveImageCmdExec(), name).withAuthConfig(dockerClientConfig.effectiveAuthConfig(name)); - + SaveImageCmdImpl cmd = new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name); + + AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); + if (cfg != null) + cmd.withAuthConfig(cfg); + + return cmd; } @Override From fc3f7b750ea91d5259883b35a051b25d78324c08 Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Thu, 19 Mar 2015 11:47:11 +0100 Subject: [PATCH 0122/1399] SaveImageCmd API doesn't support X-Registry-Auth header --- .../com/github/dockerjava/api/command/SaveImageCmd.java | 7 +------ .../java/com/github/dockerjava/core/DockerClientImpl.java | 8 +------- .../github/dockerjava/core/command/SaveImageCmdImpl.java | 2 +- .../com/github/dockerjava/jaxrs/SaveImageCmdExec.java | 2 -- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 8b26c24a9..957ae05cd 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.model.AuthConfig; import java.io.InputStream; @@ -21,10 +20,6 @@ public interface SaveImageCmd extends DockerCmd{ */ public SaveImageCmd withTag(String tag); - public AuthConfig getAuthConfig(); - - public SaveImageCmd withAuthConfig(AuthConfig authConfig); - /** * @throws com.github.dockerjava.api.NotFoundException No such image */ @@ -34,4 +29,4 @@ public static interface Exec extends DockerCmdExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index d83c26d2d..3ee08823c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -151,13 +151,7 @@ public PushImageCmd pushImageCmd(Identifier identifier) { @Override public SaveImageCmd saveImageCmd(String name) { - SaveImageCmdImpl cmd = new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name); - - AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); - if (cfg != null) - cmd.withAuthConfig(cfg); - - return cmd; + return new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name); } @Override diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 6a4596c7d..30bb13b2f 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -7,7 +7,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -public class SaveImageCmdImpl extends AbstrAuthCfgDockerCmd implements SaveImageCmd { +public class SaveImageCmdImpl extends AbstrDockerCmd implements SaveImageCmd { private String name; private String tag; diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index d5087d7fe..e9918d2af 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -23,11 +23,9 @@ protected InputStream execute(SaveImageCmd command) { WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get") .queryParam("tag", command.getTag()); - final String registryAuth = registryAuth(command.getAuthConfig()); LOGGER.trace("GET: {}", webResource); InputStream is = webResource .request() - .header("X-Registry-Auth", registryAuth) .accept(MediaType.APPLICATION_JSON) .get().readEntity(InputStream.class); From 749a9af324ef90cd27d12c70486a8a1156569332 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 20 Mar 2015 21:46:02 +0100 Subject: [PATCH 0123/1399] Fix pull image test to work with 1.17 --- .../dockerjava/core/command/PullImageCmdImplTest.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 861c10783..f9968a449 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -109,16 +109,9 @@ public void testPullImage() throws DockerException, IOException { public void testPullNonExistingImage() throws DockerException, IOException { // does not throw an exception - InputStream is = dockerClient.pullImageCmd("nonexisting/foo").exec(); + InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); // stream needs to be fully read in order to close the underlying connection - this.asString(is); - - try { - dockerClient.pullImageCmd("non-existing/foo").exec(); - fail("expected InternalServerErrorException"); - } catch (InternalServerErrorException ignored) { - } - + asString(is); } } From d57bed76f52d4feb69880bcbc6d26e09844bf292 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 20 Mar 2015 21:48:24 +0100 Subject: [PATCH 0124/1399] Fix issue # 171 with nested ENV variables in Dockerfile --- .../core/dockerfile/DockerfileStatement.java | 4 ++-- .../dockerjava/core/command/BuildImageCmdImplTest.java | 9 +++++++++ src/test/resources/testEnv/Dockerfile | 10 ++++++++++ src/test/resources/testEnv/subFolder/testrun.sh | 3 +++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/testEnv/Dockerfile create mode 100755 src/test/resources/testEnv/subFolder/testrun.sh diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index fd22e0985..a1bcc271f 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -38,11 +38,11 @@ protected String filterForEnvironmentVars(Map environmentMap, // handle: $VARIABLE case currentResourceContent = currentResourceContent.replaceAll( - "\\$" + variable, replacementValue); + "\\$" + variable, Matcher.quoteReplacement(replacementValue)); // handle ${VARIABLE} case currentResourceContent = currentResourceContent.replaceAll( - "\\$\\{" + variable + "\\}", replacementValue); + "\\$\\{" + variable + "\\}", Matcher.quoteReplacement(replacementValue)); } 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 f3cefb2f4..4c69d86e8 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -111,6 +111,15 @@ public void testDockerBuilderAddFolder() throws DockerException, String response = dockerfileBuild(baseDir); assertThat(response, containsString("Successfully executed testAddFolder.sh")); } + + @Test + public void testDockerBuilderEnv() throws DockerException, + IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("testEnv").getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testrun.sh")); + } private String dockerfileBuild(File baseDir) { diff --git a/src/test/resources/testEnv/Dockerfile b/src/test/resources/testEnv/Dockerfile new file mode 100644 index 000000000..a0a084633 --- /dev/null +++ b/src/test/resources/testEnv/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:latest + +ENV varA ./subFolder +ENV varB $varA/testrun.sh + +ADD $varB /tmp/ + +RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh + +CMD ["testrun.sh"] diff --git a/src/test/resources/testEnv/subFolder/testrun.sh b/src/test/resources/testEnv/subFolder/testrun.sh new file mode 100755 index 000000000..14259aa77 --- /dev/null +++ b/src/test/resources/testEnv/subFolder/testrun.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Successfully executed testrun.sh" \ No newline at end of file From 408a320adefea160881dbf5036eaab09aa21a4f9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 20 Mar 2015 23:49:56 +0100 Subject: [PATCH 0125/1399] Fix issue #176 --- .../dockerjava/core/DockerClientConfig.java | 4 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 543 +++++++++--------- 2 files changed, 286 insertions(+), 261 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index aa5f99b0c..05491ec6f 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -459,7 +459,9 @@ public final DockerClientConfigBuilder withFollowRedirectsFilter(boolean followR } public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { - this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); + if(dockerCertPath != null) { + this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); + } return this; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index f1f178dc9..bc3afecad 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -36,265 +36,288 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); - private Client client; - private WebTarget baseResource; - - @Override - public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - - ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); - clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); - - clientConfig.register(ResponseStatusExceptionFilter.class); - clientConfig.register(JsonClientFilter.class); - clientConfig.register(JacksonJsonProvider.class); - - if (dockerClientConfig.followRedirectsFilterEnabled()) { - clientConfig.register(FollowRedirectsFilter.class); - } - - if (dockerClientConfig.isLoggingFilterEnabled()) { - clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); - } - - if (dockerClientConfig.getReadTimeout() != null) { - int readTimeout = dockerClientConfig.getReadTimeout(); - clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); - } - - URI originalUri = dockerClientConfig.getUri(); - - SSLContext sslContext; - try { - sslContext = dockerClientConfig.getSslConfig().getSSLContext(); - } catch(Exception ex) { - throw new DockerClientException("Error in SSL Configuration", ex); - } - - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(originalUri, sslContext)); - - if(dockerClientConfig.getMaxTotalConnections() != null) - connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); - if(dockerClientConfig.getMaxPerRoutConnections() != null) - connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); - - clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); - - ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); - - if (sslContext != null) { - clientBuilder.sslContext(sslContext); - } - - client = clientBuilder.build(); - - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); - } - WebTarget webResource = client.target(dockerClientConfig.getUri()); - - if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" + dockerClientConfig.getVersion()); - } - } - - private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, SSLContext sslContext) { - RegistryBuilder registryBuilder = RegistryBuilder.create(); - registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory()); - if (sslContext != null) { - registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); - } - registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri)); - return registryBuilder.build(); - } - - protected WebTarget getBaseResource() { - checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); - return baseResource; - } - - @Override - public AuthCmd.Exec createAuthCmdExec() { - return new AuthCmdExec(getBaseResource()); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(getBaseResource()); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return new PingCmdExec(getBaseResource()); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return new VersionCmdExec(getBaseResource()); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return new PullImageCmdExec(getBaseResource()); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return new PushImageCmdExec(getBaseResource()); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { return new SaveImageCmdExec(getBaseResource()); } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return new SearchImagesCmdExec(getBaseResource()); - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return new ListImagesCmdExec(getBaseResource()); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return new InspectImageCmdExec(getBaseResource()); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return new ListContainersCmdExec(getBaseResource()); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return new StartContainerCmdExec(getBaseResource()); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return new InspectContainerCmdExec(getBaseResource()); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(getBaseResource()); - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return new WaitContainerCmdExec(getBaseResource()); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return new AttachContainerCmdExec(getBaseResource()); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return new ExecStartCmdExec(getBaseResource()); - } - - @Override - public InspectExecCmd.Exec createInspectExecCmdExec() { - return new InspectExecCmdExec(getBaseResource()); - } - - @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return new LogContainerCmdExec(getBaseResource()); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource()); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return new StopContainerCmdExec(getBaseResource()); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return new ContainerDiffCmdExec(getBaseResource()); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return new KillContainerCmdExec(getBaseResource()); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return new RestartContainerCmdExec(getBaseResource()); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return new CommitCmdExec(getBaseResource()); - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return new TopContainerCmdExec(getBaseResource()); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return new TagImageCmdExec(getBaseResource()); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return new PauseContainerCmdExec(getBaseResource()); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return new UnpauseContainerCmdExec(baseResource); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return new EventsCmdExec(getBaseResource()); - } - - @Override - public void close() throws IOException { - checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); - client.close(); - } + private static final Logger LOGGER = LoggerFactory + .getLogger(DockerCmdExecFactoryImpl.class.getName()); + private Client client; + private WebTarget baseResource; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + + ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new ApacheConnectorProvider()); + clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, + true); + + clientConfig.register(ResponseStatusExceptionFilter.class); + clientConfig.register(JsonClientFilter.class); + clientConfig.register(JacksonJsonProvider.class); + + if (dockerClientConfig.followRedirectsFilterEnabled()) { + clientConfig.register(FollowRedirectsFilter.class); + } + + if (dockerClientConfig.isLoggingFilterEnabled()) { + clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + } + + if (dockerClientConfig.getReadTimeout() != null) { + int readTimeout = dockerClientConfig.getReadTimeout(); + clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); + } + + URI originalUri = dockerClientConfig.getUri(); + + SSLContext sslContext = null; + + if (dockerClientConfig.getSslConfig() != null) { + try { + sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + } catch (Exception ex) { + throw new DockerClientException("Error in SSL Configuration", + ex); + } + } + + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( + getSchemeRegistry(originalUri, sslContext)); + + if (dockerClientConfig.getMaxTotalConnections() != null) + connManager + .setMaxTotal(dockerClientConfig.getMaxTotalConnections()); + if (dockerClientConfig.getMaxPerRoutConnections() != null) + connManager.setDefaultMaxPerRoute(dockerClientConfig + .getMaxPerRoutConnections()); + + clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, + connManager); + + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( + clientConfig); + + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } + + client = clientBuilder.build(); + + if (originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory + .sanitizeUri(originalUri)); + } + WebTarget webResource = client.target(dockerClientConfig.getUri()); + + if (dockerClientConfig.getVersion() == null + || dockerClientConfig.getVersion().isEmpty()) { + baseResource = webResource; + } else { + baseResource = webResource.path("v" + + dockerClientConfig.getVersion()); + } + } + + private org.apache.http.config.Registry getSchemeRegistry( + final URI originalUri, SSLContext sslContext) { + RegistryBuilder registryBuilder = RegistryBuilder + .create(); + registryBuilder.register("http", + PlainConnectionSocketFactory.getSocketFactory()); + if (sslContext != null) { + registryBuilder.register("https", new SSLConnectionSocketFactory( + sslContext)); + } + registryBuilder.register("unix", new UnixConnectionSocketFactory( + originalUri)); + return registryBuilder.build(); + } + + protected WebTarget getBaseResource() { + checkNotNull(baseResource, + "Factory not initialized. You probably forgot to call init()!"); + return baseResource; + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return new AuthCmdExec(getBaseResource()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(getBaseResource()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return new PingCmdExec(getBaseResource()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return new VersionCmdExec(getBaseResource()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return new PullImageCmdExec(getBaseResource()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return new PushImageCmdExec(getBaseResource()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return new SaveImageCmdExec(getBaseResource()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return new SearchImagesCmdExec(getBaseResource()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return new ListImagesCmdExec(getBaseResource()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return new InspectImageCmdExec(getBaseResource()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return new ListContainersCmdExec(getBaseResource()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return new StartContainerCmdExec(getBaseResource()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return new InspectContainerCmdExec(getBaseResource()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return new WaitContainerCmdExec(getBaseResource()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return new AttachContainerCmdExec(getBaseResource()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return new InspectExecCmdExec(getBaseResource()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return new LogContainerCmdExec(getBaseResource()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return new CopyFileFromContainerCmdExec(getBaseResource()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return new StopContainerCmdExec(getBaseResource()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return new ContainerDiffCmdExec(getBaseResource()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return new KillContainerCmdExec(getBaseResource()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return new RestartContainerCmdExec(getBaseResource()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return new CommitCmdExec(getBaseResource()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return new TopContainerCmdExec(getBaseResource()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return new TagImageCmdExec(getBaseResource()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return new PauseContainerCmdExec(getBaseResource()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return new UnpauseContainerCmdExec(baseResource); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return new EventsCmdExec(getBaseResource()); + } + + @Override + public void close() throws IOException { + checkNotNull(client, + "Factory not initialized. You probably forgot to call init()!"); + client.close(); + } } From 8523236da4be5c9280d4a528365db0ed3b18c9e8 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 22 Mar 2015 21:23:09 +0300 Subject: [PATCH 0126/1399] Fix httpclient dep As i see PoolingHttpClientConnectionManager used from DockerCmdExecFactoryImpl.class appeared only in httpclient 4.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9f9ab3a68..7e22a91e3 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ 2.1.2 - 4.2.5 + 4.3.6 1.5 1.8 2.3 From 7f68a267a37d9f22300b531f80229c970b797645 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 23 Mar 2015 21:33:30 +0100 Subject: [PATCH 0127/1399] Cleanup POM.xml --- pom.xml | 66 ++++++++++++--------------------------------------------- 1 file changed, 14 insertions(+), 52 deletions(-) diff --git a/pom.xml b/pom.xml index 7e22a91e3..ba60602ad 100644 --- a/pom.xml +++ b/pom.xml @@ -47,28 +47,22 @@ 1.7 1.7 - 1.6.1 - 2.11 - 1.9 - 2.1.2 - - 4.3.6 + 4.3.1 1.5 1.8 2.3 2.6 1.7.5 - 1.3.9 - 0.3 + 1.51 2015-01-27T15-02-14 18.0 - - 1.1.0 - 5.12.1 + + 1.1.0 + 5.12.1 1.3 1.6 2.3.3 @@ -89,22 +83,21 @@ jackson-jaxrs-json-provider ${jackson-jaxrs.version} - - - - - org.glassfish.jersey.connectors jersey-apache-connector ${jersey.version} + + org.apache.httpcomponents + httpclient + ${httpclient.version} + org.glassfish.jersey.core jersey-client ${jersey.version} - de.gesellix unix-socket-factory @@ -131,31 +124,16 @@ commons-io ${commons-io.version} - - - com.github.jnr - jnr-unixsocket - ${jnr.unixsocket.version} - - org.slf4j slf4j-api ${slf4j-api.version} - com.google.guava guava ${guava.version} - - - - - - - org.bouncycastle bcpkix-jdk15on @@ -166,21 +144,21 @@ ch.qos.logback logback-core - ${version.logback} + ${logback.version} test ch.qos.logback logback-classic - ${version.logback} + ${logback.version} test org.testng testng - ${version.testng} + ${testng.version} test @@ -211,23 +189,7 @@ test - - - - com.github.jnr - jffi - 1.2.7 - - - com.github.jnr - jffi - native - 1.2.7 - - - - - + ossrh From 59ca504fa0524d275c177c546dc02f15bc3e15d9 Mon Sep 17 00:00:00 2001 From: Matt Austin Date: Wed, 25 Mar 2015 01:09:19 -0400 Subject: [PATCH 0128/1399] Add support for cpuset in CreateContainerCmd --- .../dockerjava/api/command/CreateContainerCmd.java | 4 ++++ .../core/command/CreateContainerCmdImpl.java | 12 ++++++++++++ 2 files changed, 16 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 88a6caf03..c6a1234cb 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -62,6 +62,10 @@ public interface CreateContainerCmd extends DockerCmd{ public CreateContainerCmd withCpuShares(int cpuShares); + public String getCpuset(); + + public CreateContainerCmd withCpuset(String cpuset); + public boolean isAttachStdin(); public CreateContainerCmd withAttachStdin(boolean attachStdin); 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 0948bf166..ac32960a9 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -32,6 +32,7 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd Date: Wed, 25 Mar 2015 20:53:43 +0100 Subject: [PATCH 0129/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8841d766..7c6599585 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Change Log === Latest SNAPSHOT --- + + * [#179](https://github.com/docker-java/docker-java/pull/170) Add support for cpuset in CreateContainerCmd * [#170](https://github.com/docker-java/docker-java/pull/170) Allow to specify alternative files other than 'Dockerfile' for building images * [#165](https://github.com/docker-java/docker-java/pull/165) PushImageCmd assumes that you have an auth config setup * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command From a9c478bd6eb3f7afae5f0a62013b701eb614eb5c Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Wed, 25 Mar 2015 19:58:18 +0000 Subject: [PATCH 0130/1399] Dockerfiles not called 'dockerfile' Pass the name of the Dockerfile to docker. Adjust the TAR file to build from the correct path Implement some tests to show it working with a nonstandard name. Signed-off-by: Nigel Magnay --- .../github/dockerjava/api/DockerClient.java | 4 +- .../dockerjava/api/command/BuildImageCmd.java | 6 ++- .../dockerjava/core/DockerClientImpl.java | 6 +++ .../core/command/BuildImageCmdImpl.java | 40 +++++++++++++++---- .../core/dockerfile/Dockerfile.java | 6 ++- .../dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++ .../core/command/BuildImageCmdImplTest.java | 28 +++++++++++++ .../subdirectory/Dockerfile-nonstandard | 12 ++++++ 8 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index c4e4859c4..9e275eb35 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -98,7 +98,9 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public CommitCmd commitCmd(String containerId); - public BuildImageCmd buildImageCmd(File dockerFolder); + public BuildImageCmd buildImageCmd(); + + public BuildImageCmd buildImageCmd(File dockerFileOrFolder); public BuildImageCmd buildImageCmd(InputStream tarInputStream); 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 becaeccc6..1f26d37d7 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -28,8 +28,12 @@ public interface BuildImageCmd extends DockerCmd{ public boolean isQuiet(); + public String getPathToDockerfile(); + public AuthConfigurations getBuildAuthConfigs(); - + + public BuildImageCmd withBaseDirectory(File baseDirectory); + public BuildImageCmd withDockerfile(File dockerfile); public BuildImageCmd withTarInputStream(InputStream tarInputStream); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 0dd560af3..de3d9e238 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -291,6 +291,12 @@ public CommitCmd commitCmd(String containerId) { .createCommitCmdExec(), containerId); } + @Override + public BuildImageCmd buildImageCmd() { + return new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec()); + } + @Override public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { return new BuildImageCmdImpl(getDockerCmdExecFactory() 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 c793ed6e6..180befd03 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -9,6 +9,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.dockerfile.Dockerfile; +import com.google.common.base.Optional; /** * @@ -24,6 +25,8 @@ public class BuildImageCmdImpl extends AbstrDockerCmd filesToAdd = new ArrayList(); public InputStream buildDockerFolderTar() { + return buildDockerFolderTar(getDockerFolder()); + } + + public InputStream buildDockerFolderTar(File directory) { // ARCHIVE TAR File dockerFolderTar = null; @@ -173,7 +177,7 @@ public InputStream buildDockerFolderTar() { try { String archiveNameWithOutExtension = UUID.randomUUID().toString(); - dockerFolderTar = CompressArchiveUtil.archiveTARFiles(getDockerFolder(), + dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, archiveNameWithOutExtension); return FileUtils.openInputStream(dockerFolderTar); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 405192adb..5c2b87fc6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -35,6 +35,7 @@ public BuildImageCmdExec(WebTarget baseResource) { @Override protected ResponseImpl execute(BuildImageCmd command) { WebTarget webResource = getBaseResource().path("/build"); + String dockerFilePath = command.getPathToDockerfile(); if(command.getTag() != null) { webResource = webResource.queryParam("t", command.getTag()); @@ -48,6 +49,9 @@ protected ResponseImpl execute(BuildImageCmd command) { if (command.isQuiet()) { webResource = webResource.queryParam("q", "true"); } + if( dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { + webResource = webResource.queryParam("dockerfile", dockerFilePath); + } webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); 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 4c69d86e8..c1a70ef28 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -76,6 +76,34 @@ public void testNginxDockerfileBuilder() { equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); } + @Test + public void testNonstandard1() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); + + InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + } + + @Test + public void testNonstandard2() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard").getFile()); + File dockerFile = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); + + + InputStream response = dockerClient.buildImageCmd() + .withBaseDirectory(baseDir) + .withDockerfile(dockerFile) + .withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + } + @Test public void testDockerBuilderAddUrl() { File baseDir = new File(Thread.currentThread().getContextClassLoader() diff --git a/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard b/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard new file mode 100644 index 000000000..2d0fa24cb --- /dev/null +++ b/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard @@ -0,0 +1,12 @@ +# Nginx +# +# VERSION 0.0.1 + +FROM ubuntu:latest +MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com" + +# make sure the package repository is up to date +RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list +RUN apt-get update + +RUN apt-get install -y inotify-tools nginx apache2 openssh-server \ No newline at end of file From 0366cdf82e1bed9525768ab71d2ee8c7f869c1d1 Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Sat, 28 Mar 2015 22:51:28 +0100 Subject: [PATCH 0131/1399] Fix logger for SaveImageCmd and SaveImageCmdImplTest classes --- src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java | 2 +- .../github/dockerjava/core/command/SaveImageCmdImplTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index e9918d2af..b1eccd8f2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -12,7 +12,7 @@ public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory - .getLogger(PushImageCmdExec.class); + .getLogger(SaveImageCmdExec.class); public SaveImageCmdExec(WebTarget baseResource) { super(baseResource); diff --git a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java index b62594bed..859a76cc2 100644 --- a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java @@ -27,7 +27,7 @@ @Test(groups = "integration") public class SaveImageCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory - .getLogger(PushImageCmdImplTest.class); + .getLogger(SaveImageCmdImplTest.class); String username; From 6ac275300dbfecb12ded3863a38405e630379906 Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Tue, 31 Mar 2015 10:26:32 +0100 Subject: [PATCH 0132/1399] We are now on a modern version of guava, so remove code that is a copy of guava clasess, and simplify. Signed-off-by: Nigel Magnay --- .../api/command/TopContainerResponse.java | 7 +- .../core/dockerfile/Dockerfile.java | 38 +-- .../core/dockerfile/DockerfileStatement.java | 6 +- .../dockerjava/core/util/guava/Guava.java | 45 --- .../core/util/guava/PercentEscaper.java | 245 -------------- .../core/util/guava/UnicodeEscaper.java | 304 ------------------ .../dockerjava/jaxrs/ListImagesCmdExec.java | 4 +- 7 files changed, 9 insertions(+), 640 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/core/util/guava/Guava.java delete mode 100644 src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java delete mode 100644 src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index 89aa36451..c92ffa4ce 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -1,9 +1,8 @@ package com.github.dockerjava.api.command; -import static com.github.dockerjava.core.util.guava.Guava.join; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Joiner; /** * @@ -32,12 +31,12 @@ public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("["); for(String[] fields: processes) { - buffer.append("[" + join(fields, "; ", true) + "]"); + buffer.append("[" + Joiner.on("; ").skipNulls().join(fields) + "]"); } buffer.append("]"); return "TopContainerResponse{" + - "titles=" + join(titles, "; ", true) + + "titles=" + Joiner.on("; ").skipNulls().join(titles) + ", processes=" + buffer.toString() + '}'; } 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 72e85c353..d1930ee7e 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -66,31 +66,7 @@ public Optional apply(String input) { } } - /** - * Not needed in modern guava - */ - private static class MissingOptionalFilter - implements Predicate> { - - @Override - public boolean apply(Optional optional) { - return (optional.orNull() != null); - } - } - - /** - * Not needed in modern guava - */ - private static class OptionalItemTransformer - implements Function, DockerfileStatement> { - - @Override - public DockerfileStatement apply(Optional optional) { - return optional.orNull(); - } - } - - public Collection getStatements() throws IOException { + public Iterable getStatements() throws IOException { Collection dockerFileContent = FileUtils.readLines(dockerFile); if (dockerFileContent.size() <= 0) { @@ -101,17 +77,7 @@ public Collection getStatements() throws IOException { Collection> optionals = Collections2 .transform(dockerFileContent, new LineTransformer()); - // Modern guava would be done here, - // With simply return Optional.presentInstances( optionals ); - // - // So this entire function could simply be - // return Optional.presentInstances( Collections2.transform( FileUtils.readLines(dockerFile), new LineTransformer() ) ); - // - // Until the dawn of that day, do it manually - - return Collections2.transform(Collections2.filter(optionals, new MissingOptionalFilter()), - new OptionalItemTransformer()); - + return Optional.presentInstances(optionals); } public List getIgnores() throws IOException { diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index a1bcc271f..c048f77dd 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -188,15 +188,13 @@ public static Optional createFromLine(String cmd) line = Add.create(cmd); - // if (line.isPresent()) { : Newer guava - if (line.orNull() != null) { + if (line.isPresent()) { return line; } line = Env.create(cmd); - // if (line.isPresent()) { : Newer guava - if (line.orNull() != null) { + if (line.isPresent()) { return line; } diff --git a/src/main/java/com/github/dockerjava/core/util/guava/Guava.java b/src/main/java/com/github/dockerjava/core/util/guava/Guava.java deleted file mode 100644 index 84e27b34e..000000000 --- a/src/main/java/com/github/dockerjava/core/util/guava/Guava.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * 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.core.util.guava; - -public class Guava { - - static final String URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS = - "-._~" + // Unreserved characters. - "!$'()*,;&=" + // The subdelim characters (excluding '+'). - "@:"; // The gendelim characters permitted in paths. - - public static PercentEscaper urlPathSegmentEscaper() { - return URL_PATH_SEGMENT_ESCAPER; - } - - private static final PercentEscaper URL_PATH_SEGMENT_ESCAPER = - new PercentEscaper(URL_PATH_OTHER_SAFE_CHARS_LACKING_PLUS + "+", false); - - public static String join(String[] joins, String sep, boolean skipNulls) { - StringBuilder sb = new StringBuilder(); - for(int i = 0; i < joins.length; i++) { - if(skipNulls && joins[i] == null) { - continue; - } - sb.append(joins[i]); - if(i < joins.length -1) { - sb.append(sep); - } - } - return sb.toString(); - } -} diff --git a/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java deleted file mode 100644 index 1d726dca2..000000000 --- a/src/main/java/com/github/dockerjava/core/util/guava/PercentEscaper.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * 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.core.util.guava; - -import com.google.common.base.Preconditions; - -/** - * A {@code UnicodeEscaper} that escapes some set of Java characters using a - * UTF-8 based percent encoding scheme. The set of safe characters (those which - * remain unescaped) can be specified on construction. - * - *

This class is primarily used for creating URI escapers in UrlEscapers - * but can be used directly if required. While URI escapers impose - * specific semantics on which characters are considered 'safe', this class has - * a minimal set of restrictions. - * - *

When escaping a String, the following rules apply: - *

    - *
  • All specified safe characters remain unchanged. - *
  • If {@code plusForSpace} was specified, the space character " " is - * converted into a plus sign {@code "+"}. - *
  • All other characters are converted into one or more bytes using UTF-8 - * encoding and each byte is then represented by the 3-character string - * "%XX", where "XX" is the two-digit, uppercase, hexadecimal representation - * of the byte value. - *
- * - *

For performance reasons the only currently supported character encoding of - * this class is UTF-8. - * - *

Note: This escaper produces uppercase hexadecimal sequences. From - * RFC 3986:
- * "URI producers and normalizers should use uppercase hexadecimal digits - * for all percent-encodings." - * - * @author David Beaumont - * @since 15.0 - */ -public final class PercentEscaper extends UnicodeEscaper { - - // In some escapers spaces are escaped to '+' - private static final char[] PLUS_SIGN = { '+' }; - - // Percent escapers output upper case hex digits (uri escapers require this). - private static final char[] UPPER_HEX_DIGITS = - "0123456789ABCDEF".toCharArray(); - - /** - * If true we should convert space to the {@code +} character. - */ - private final boolean plusForSpace; - - /** - * An array of flags where for any {@code char c} if {@code safeOctets[c]} is - * true then {@code c} should remain unmodified in the output. If - * {@code c > safeOctets.length} then it should be escaped. - */ - private final boolean[] safeOctets; - - /** - * Constructs a percent escaper with the specified safe characters and - * optional handling of the space character. - * - *

Not that it is allowed, but not necessarily desirable to specify {@code %} - * as a safe character. This has the effect of creating an escaper which has no - * well defined inverse but it can be useful when escaping additional characters. - * - * @param safeChars a non null string specifying additional safe characters - * for this escaper (the ranges 0..9, a..z and A..Z are always safe and - * should not be specified here) - * @param plusForSpace true if ASCII space should be escaped to {@code +} - * rather than {@code %20} - * @throws IllegalArgumentException if any of the parameters were invalid - */ - public PercentEscaper(String safeChars, boolean plusForSpace) { - // TODO(user): Switch to static factory methods for creation now that class is final. - // TODO(user): Support escapers where alphanumeric chars are not safe. - Preconditions.checkNotNull(safeChars); // eager for GWT. - // Avoid any misunderstandings about the behavior of this escaper - if (safeChars.matches(".*[0-9A-Za-z].*")) { - throw new IllegalArgumentException( - "Alphanumeric characters are always 'safe' and should not be " + - "explicitly specified"); - } - safeChars += "abcdefghijklmnopqrstuvwxyz" + - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + - "0123456789"; - // Avoid ambiguous parameters. Safe characters are never modified so if - // space is a safe character then setting plusForSpace is meaningless. - if (plusForSpace && safeChars.contains(" ")) { - throw new IllegalArgumentException( - "plusForSpace cannot be specified when space is a 'safe' character"); - } - this.plusForSpace = plusForSpace; - this.safeOctets = createSafeOctets(safeChars); - } - - /** - * Creates a boolean array with entries corresponding to the character values - * specified in safeChars set to true. The array is as small as is required to - * hold the given character information. - */ - private static boolean[] createSafeOctets(String safeChars) { - int maxChar = -1; - char[] safeCharArray = safeChars.toCharArray(); - for (char c : safeCharArray) { - maxChar = Math.max(c, maxChar); - } - boolean[] octets = new boolean[maxChar + 1]; - for (char c : safeCharArray) { - octets[c] = true; - } - return octets; - } - - /* - * Overridden for performance. For unescaped strings this improved the - * performance of the uri escaper from ~760ns to ~400ns as measured by - * CharEscapersBenchmark. - */ - @Override - protected int nextEscapeIndex(CharSequence csq, int index, int end) { - Preconditions.checkNotNull(csq); - for (; index < end; index++) { - char c = csq.charAt(index); - if (c >= safeOctets.length || !safeOctets[c]) { - break; - } - } - return index; - } - - /* - * Overridden for performance. For unescaped strings this improved the - * performance of the uri escaper from ~400ns to ~170ns as measured by - * CharEscapersBenchmark. - */ - @Override - public String escape(String s) { - Preconditions.checkNotNull(s); - int slen = s.length(); - for (int index = 0; index < slen; index++) { - char c = s.charAt(index); - if (c >= safeOctets.length || !safeOctets[c]) { - return escapeSlow(s, index); - } - } - return s; - } - - /** - * Escapes the given Unicode code point in UTF-8. - */ - @Override - protected char[] escape(int cp) { - // We should never get negative values here but if we do it will throw an - // IndexOutOfBoundsException, so at least it will get spotted. - if (cp < safeOctets.length && safeOctets[cp]) { - return null; - } else if (cp == ' ' && plusForSpace) { - return PLUS_SIGN; - } else if (cp <= 0x7F) { - // Single byte UTF-8 characters - // Start with "%--" and fill in the blanks - char[] dest = new char[3]; - dest[0] = '%'; - dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; - dest[1] = UPPER_HEX_DIGITS[cp >>> 4]; - return dest; - } else if (cp <= 0x7ff) { - // Two byte UTF-8 characters [cp >= 0x80 && cp <= 0x7ff] - // Start with "%--%--" and fill in the blanks - char[] dest = new char[6]; - dest[0] = '%'; - dest[3] = '%'; - dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[2] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[1] = UPPER_HEX_DIGITS[0xC | cp]; - return dest; - } else if (cp <= 0xffff) { - // Three byte UTF-8 characters [cp >= 0x800 && cp <= 0xffff] - // Start with "%E-%--%--" and fill in the blanks - char[] dest = new char[9]; - dest[0] = '%'; - dest[1] = 'E'; - dest[3] = '%'; - dest[6] = '%'; - dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[2] = UPPER_HEX_DIGITS[cp]; - return dest; - } else if (cp <= 0x10ffff) { - char[] dest = new char[12]; - // Four byte UTF-8 characters [cp >= 0xffff && cp <= 0x10ffff] - // Start with "%F-%--%--%--" and fill in the blanks - dest[0] = '%'; - dest[1] = 'F'; - dest[3] = '%'; - dest[6] = '%'; - dest[9] = '%'; - dest[11] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[10] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[8] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[7] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[5] = UPPER_HEX_DIGITS[cp & 0xF]; - cp >>>= 4; - dest[4] = UPPER_HEX_DIGITS[0x8 | (cp & 0x3)]; - cp >>>= 2; - dest[2] = UPPER_HEX_DIGITS[cp & 0x7]; - return dest; - } else { - // If this ever happens it is due to bug in UnicodeEscaper, not bad input. - throw new IllegalArgumentException( - "Invalid unicode character value " + cp); - } - } -} diff --git a/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java b/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java deleted file mode 100644 index 3631193fc..000000000 --- a/src/main/java/com/github/dockerjava/core/util/guava/UnicodeEscaper.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (C) 2008 The Guava Authors - * - * 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.core.util.guava; - -import com.google.common.base.Preconditions; - - -/** - * An Escaper that converts literal text into a format safe for - * inclusion in a particular context (such as an XML document). Typically (but - * not always), the inverse process of "unescaping" the text is performed - * automatically by the relevant parser. - * - *

For example, an XML escaper would convert the literal string {@code - * "Foo"} into {@code "Foo<Bar>"} to prevent {@code ""} from - * being confused with an XML tag. When the resulting XML document is parsed, - * the parser API will return this text as the original literal string {@code - * "Foo"}. - * - *

Note: This class is similar to CharEscaper but with one - * very important difference. A CharEscaper can only process Java - * UTF16 characters in - * isolation and may not cope when it encounters surrogate pairs. This class - * facilitates the correct escaping of all Unicode characters. - * - *

As there are important reasons, including potential security issues, to - * handle Unicode correctly if you are considering implementing a new escaper - * you should favor using UnicodeEscaper wherever possible. - * - *

A {@code UnicodeEscaper} instance is required to be stateless, and safe - * when used concurrently by multiple threads. - * - *

Several popular escapers are defined as constants in classes like - * com.google.common.html.HtmlEscapers, com.google.common.xml.XmlEscapers, - * and SourceCodeEscapers. To create - * your own escapers extend this class and implement the #escape(int) - * method. - * - * @author David Beaumont - * @since 15.0 - */ -public abstract class UnicodeEscaper { - /** The amount of padding (chars) to use when growing the escape buffer. */ - private static final int DEST_PAD = 32; - - /** Constructor for use by subclasses. */ - protected UnicodeEscaper() {} - - /** - * Returns the escaped form of the given Unicode code point, or {@code null} - * if this code point does not need to be escaped. When called as part of an - * escaping operation, the given code point is guaranteed to be in the range - * {@code 0 <= cp <= Character#MAX_CODE_POINT}. - * - *

If an empty array is returned, this effectively strips the input - * character from the resulting text. - * - *

If the character does not need to be escaped, this method should return - * {@code null}, rather than an array containing the character representation - * of the code point. This enables the escaping algorithm to perform more - * efficiently. - * - *

If the implementation of this method cannot correctly handle a - * particular code point then it should either throw an appropriate runtime - * exception or return a suitable replacement character. It must never - * silently discard invalid input as this may constitute a security risk. - * - * @param cp the Unicode code point to escape if necessary - * @return the replacement characters, or {@code null} if no escaping was - * needed - */ - protected abstract char[] escape(int cp); - - /** - * Scans a sub-sequence of characters from a given CharSequence, - * returning the index of the next character that requires escaping. - * - *

Note: When implementing an escaper, it is a good idea to override - * this method for efficiency. The base class implementation determines - * successive Unicode code points and invokes #escape(int) for each of - * them. If the semantics of your escaper are such that code points in the - * supplementary range are either all escaped or all unescaped, this method - * can be implemented more efficiently using CharSequence#charAt(int). - * - *

Note however that if your escaper does not escape characters in the - * supplementary range, you should either continue to validate the correctness - * of any surrogate characters encountered or provide a clear warning to users - * that your escaper does not validate its input. - * - *

See com.google.common.net.PercentEscaper for an example. - * - * @param csq a sequence of characters - * @param start the index of the first character to be scanned - * @param end the index immediately after the last character to be scanned - * @throws IllegalArgumentException if the scanned sub-sequence of {@code csq} - * contains invalid surrogate pairs - */ - protected int nextEscapeIndex(CharSequence csq, int start, int end) { - int index = start; - while (index < end) { - int cp = codePointAt(csq, index, end); - if (cp < 0 || escape(cp) != null) { - break; - } - index += Character.isSupplementaryCodePoint(cp) ? 2 : 1; - } - return index; - } - - /** - * Returns the escaped form of a given literal string. - * - *

If you are escaping input in arbitrary successive chunks, then it is not - * generally safe to use this method. If an input string ends with an - * unmatched high surrogate character, then this method will throw - * IllegalArgumentException. You should ensure your input is valid UTF-16 before calling this - * method. - * - *

Note: When implementing an escaper it is a good idea to override - * this method for efficiency by inlining the implementation of - * #nextEscapeIndex(CharSequence, int, int) directly. Doing this for - * com.google.common.net.PercentEscaper more than doubled the - * performance for unescaped strings (as measured by CharEscapersBenchmark}. - * - * @param string the literal string to be escaped - * @return the escaped form of {@code string} - * @throws NullPointerException if {@code string} is null - * @throws IllegalArgumentException if invalid surrogate characters are - * encountered - */ - public String escape(String string) { - Preconditions.checkNotNull(string); - int end = string.length(); - int index = nextEscapeIndex(string, 0, end); - return index == end ? string : escapeSlow(string, index); - } - - /** - * Returns the escaped form of a given literal string, starting at the given - * index. This method is called by the #escape(String) method when it - * discovers that escaping is required. It is protected to allow subclasses - * to override the fastpath escaping function to inline their escaping test. - * See CharEscaperBuilder for an example usage. - * - *

This method is not reentrant and may only be invoked by the top level - * #escape(String) method. - * - * @param s the literal string to be escaped - * @param index the index to start escaping from - * @return the escaped form of {@code string} - * @throws NullPointerException if {@code string} is null - * @throws IllegalArgumentException if invalid surrogate characters are - * encountered - */ - protected final String escapeSlow(String s, int index) { - int end = s.length(); - - // Get a destination buffer and setup some loop variables. - char[] dest = new char[1024]; - int destIndex = 0; - int unescapedChunkStart = 0; - - while (index < end) { - int cp = codePointAt(s, index, end); - if (cp < 0) { - throw new IllegalArgumentException( - "Trailing high surrogate at end of input"); - } - // It is possible for this to return null because nextEscapeIndex() may - // (for performance reasons) yield some false positives but it must never - // give false negatives. - char[] escaped = escape(cp); - int nextIndex = index + (Character.isSupplementaryCodePoint(cp) ? 2 : 1); - if (escaped != null) { - int charsSkipped = index - unescapedChunkStart; - - // This is the size needed to add the replacement, not the full - // size needed by the string. We only regrow when we absolutely must. - int sizeNeeded = destIndex + charsSkipped + escaped.length; - if (dest.length < sizeNeeded) { - int destLength = sizeNeeded + (end - index) + DEST_PAD; - dest = growBuffer(dest, destIndex, destLength); - } - // If we have skipped any characters, we need to copy them now. - if (charsSkipped > 0) { - s.getChars(unescapedChunkStart, index, dest, destIndex); - destIndex += charsSkipped; - } - if (escaped.length > 0) { - System.arraycopy(escaped, 0, dest, destIndex, escaped.length); - destIndex += escaped.length; - } - // If we dealt with an escaped character, reset the unescaped range. - unescapedChunkStart = nextIndex; - } - index = nextEscapeIndex(s, nextIndex, end); - } - - // Process trailing unescaped characters - no need to account for escaped - // length or padding the allocation. - int charsSkipped = end - unescapedChunkStart; - if (charsSkipped > 0) { - int endIndex = destIndex + charsSkipped; - if (dest.length < endIndex) { - dest = growBuffer(dest, destIndex, endIndex); - } - s.getChars(unescapedChunkStart, end, dest, destIndex); - destIndex = endIndex; - } - return new String(dest, 0, destIndex); - } - - /** - * Returns the Unicode code point of the character at the given index. - * - *

Unlike Character#codePointAt(CharSequence, int) or - * String#codePointAt(int) this method will never fail silently when - * encountering an invalid surrogate pair. - * - *

The behaviour of this method is as follows: - *

    - *
  1. If {@code index >= end}, IndexOutOfBoundsException is thrown. - *
  2. If the character at the specified index is not a surrogate, it is - * returned. - *
  3. If the first character was a high surrogate value, then an attempt is - * made to read the next character. - *
      - *
    1. If the end of the sequence was reached, the negated value of - * the trailing high surrogate is returned. - *
    2. If the next character was a valid low surrogate, the code point - * value of the high/low surrogate pair is returned. - *
    3. If the next character was not a low surrogate value, then - * IllegalArgumentException is thrown. - *
    - *
  4. If the first character was a low surrogate value, - * IllegalArgumentException is thrown. - *
- * - * @param seq the sequence of characters from which to decode the code point - * @param index the index of the first character to decode - * @param end the index beyond the last valid character to decode - * @return the Unicode code point for the given index or the negated value of - * the trailing high surrogate character at the end of the sequence - */ - protected static int codePointAt(CharSequence seq, int index, int end) { - Preconditions.checkNotNull(seq); - if (index < end) { - char c1 = seq.charAt(index++); - if (c1 < Character.MIN_HIGH_SURROGATE || - c1 > Character.MAX_LOW_SURROGATE) { - // Fast path (first test is probably all we need to do) - return c1; - } else if (c1 <= Character.MAX_HIGH_SURROGATE) { - // If the high surrogate was the last character, return its inverse - if (index == end) { - return -c1; - } - // Otherwise look for the low surrogate following it - char c2 = seq.charAt(index); - if (Character.isLowSurrogate(c2)) { - return Character.toCodePoint(c1, c2); - } - throw new IllegalArgumentException( - "Expected low surrogate but got char '" + c2 + - "' with value " + (int) c2 + " at index " + index + - " in '" + seq + "'"); - } else { - throw new IllegalArgumentException( - "Unexpected low surrogate character '" + c1 + - "' with value " + (int) c1 + " at index " + (index - 1) + - " in '" + seq + "'"); - } - } - throw new IndexOutOfBoundsException("Index exceeds specified range"); - } - - /** - * Helper method to grow the character buffer as needed, this only happens - * once in a while so it's ok if it's in a method call. If the index passed - * in is 0 then no copying will be done. - */ - private static char[] growBuffer(char[] dest, int index, int size) { - char[] copy = new char[size]; - if (index > 0) { - System.arraycopy(dest, 0, copy, 0, index); - } - return copy; - } -} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 001ba1d09..59e08fb60 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; -import static com.github.dockerjava.core.util.guava.Guava.urlPathSegmentEscaper; - import java.util.List; import javax.ws.rs.client.WebTarget; @@ -14,6 +12,8 @@ import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { From 6987a1f9ac4624bef3e03da145637cb0e4263fbb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 1 Apr 2015 20:38:46 +0200 Subject: [PATCH 0133/1399] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c6599585..88c44bb7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,8 @@ Change Log === Latest SNAPSHOT --- - - * [#179](https://github.com/docker-java/docker-java/pull/170) Add support for cpuset in CreateContainerCmd + * [#180](https://github.com/docker-java/docker-java/pull/180) Dockerfiles not called 'dockerfile' + * [#179](https://github.com/docker-java/docker-java/pull/179) Add support for cpuset in CreateContainerCmd * [#170](https://github.com/docker-java/docker-java/pull/170) Allow to specify alternative files other than 'Dockerfile' for building images * [#165](https://github.com/docker-java/docker-java/pull/165) PushImageCmd assumes that you have an auth config setup * [#161](https://github.com/docker-java/docker-java/pull/161) Inspect exec command From fd0bf88c129becb1991963d33b302623fa970c05 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 1 Apr 2015 20:49:50 +0200 Subject: [PATCH 0134/1399] exclude tests from circleCI --- .../dockerjava/core/command/BuildImageCmdImplTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 c1a70ef28..bd8a56d2d 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -76,7 +76,8 @@ public void testNginxDockerfileBuilder() { equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); } - @Test + + @Test(groups = "ignoreInCircleCi") public void testNonstandard1() { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); @@ -87,7 +88,7 @@ public void testNonstandard1() { assertThat(fullLog, containsString("Successfully built")); } - @Test + @Test(groups = "ignoreInCircleCi") public void testNonstandard2() { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard").getFile()); From 376e7edb218fad8d26f84a0cc7d3420f47deb145 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 1 Apr 2015 22:41:23 +0200 Subject: [PATCH 0135/1399] Introduce WrappedResponseInputStream to close underlying Response --- .../api/command/AttachContainerCmd.java | 3 + .../api/command/CopyFileFromContainerCmd.java | 3 + .../dockerjava/api/command/ExecStartCmd.java | 3 + .../api/command/LogContainerCmd.java | 3 + .../dockerjava/api/command/PullImageCmd.java | 7 + .../dockerjava/api/command/SaveImageCmd.java | 3 + .../jaxrs/AttachContainerCmdExec.java | 7 +- .../dockerjava/jaxrs/BuildImageCmdExec.java | 131 +++++++++--------- .../jaxrs/CopyFileFromContainerCmdExec.java | 6 +- .../dockerjava/jaxrs/EventsCmdExec.java | 3 +- .../dockerjava/jaxrs/ExecStartCmdExec.java | 9 +- .../dockerjava/jaxrs/LogContainerCmdExec.java | 4 +- .../dockerjava/jaxrs/PullImageCmdExec.java | 9 +- .../dockerjava/jaxrs/PushImageCmdExec.java | 8 +- .../dockerjava/jaxrs/SaveImageCmdExec.java | 8 +- .../util/WrappedResponseInputStream.java | 70 ++++++++++ .../core/command/LogContainerCmdImplTest.java | 35 +++++ 17 files changed, 233 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java 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 aeee749e3..abdec8f58 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -55,6 +55,9 @@ public interface AttachContainerCmd extends DockerCmd{ 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 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 8d2bfbb41..5e85d9984 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -19,6 +19,9 @@ public interface CopyFileFromContainerCmd extends DockerCmd { 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 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 bcc7a072e..7ccb90cff 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -23,6 +23,9 @@ public interface ExecStartCmd extends DockerCmd { 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 */ 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 36a41beb5..74512b390 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -56,6 +56,9 @@ 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 */ @Override 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 27d5b978a..c39617dde 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -29,5 +29,12 @@ public interface PullImageCmd extends DockerCmd{ public static interface Exec extends DockerCmdExec { } + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent + * connection leaks. + */ + @Override + public InputStream exec(); } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 957ae05cd..48c5f3191 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -21,6 +21,9 @@ public interface SaveImageCmd extends DockerCmd{ public SaveImageCmd withTag(String tag); /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent + * connection leaks. + * * @throws com.github.dockerjava.api.NotFoundException No such image */ public InputStream exec() throws NotFoundException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 1fafd1f0e..de4bb3f0c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class AttachContainerCmdExec extends AbstrDockerCmdExec implements @@ -36,9 +37,11 @@ protected InputStream execute(AttachContainerCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource.request() + Response response = webResource.request() .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(null, Response.class).readEntity(InputStream.class); + .post(null, Response.class); + + return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 5c2b87fc6..18aceb4ea 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -21,13 +21,16 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.EventStreamItem; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; import com.google.common.collect.ImmutableList; -public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { - +public class BuildImageCmdExec extends + AbstrDockerCmdExec implements + BuildImageCmd.Exec { + private static final Logger LOGGER = LoggerFactory .getLogger(BuildImageCmdExec.class); - + public BuildImageCmdExec(WebTarget baseResource) { super(baseResource); } @@ -35,72 +38,76 @@ public BuildImageCmdExec(WebTarget baseResource) { @Override protected ResponseImpl execute(BuildImageCmd command) { WebTarget webResource = getBaseResource().path("/build"); - String dockerFilePath = command.getPathToDockerfile(); - - if(command.getTag() != null) { + String dockerFilePath = command.getPathToDockerfile(); + + if (command.getTag() != null) { webResource = webResource.queryParam("t", command.getTag()); } - if (command.hasNoCacheEnabled()) { - webResource = webResource.queryParam("nocache", "true"); - } - if (command.hasRemoveEnabled()) { - webResource = webResource.queryParam("rm", "true"); - } - if (command.isQuiet()) { - webResource = webResource.queryParam("q", "true"); - } - if( dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webResource = webResource.queryParam("dockerfile", dockerFilePath); - } - - - webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); - webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024*1024); - - - LOGGER.debug("POST: {}", webResource); - InputStream is = resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.TEXT_PLAIN) - .post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class); - - return new ResponseImpl(is); - + if (command.hasNoCacheEnabled()) { + webResource = webResource.queryParam("nocache", "true"); + } + if (command.hasRemoveEnabled()) { + webResource = webResource.queryParam("rm", "true"); + } + if (command.isQuiet()) { + webResource = webResource.queryParam("q", "true"); + } + if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { + webResource = webResource.queryParam("dockerfile", dockerFilePath); + } + + webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, + RequestEntityProcessing.CHUNKED); + webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, + 1024 * 1024); + + LOGGER.debug("POST: {}", webResource); + Response response = resourceWithOptionalAuthConfig(command, + webResource.request()) + .accept(MediaType.TEXT_PLAIN) + .post(entity(command.getTarInputStream(), "application/tar"), + Response.class); + + return new ResponseImpl(new WrappedResponseInputStream(response)); + } - private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + private Invocation.Builder resourceWithOptionalAuthConfig( + BuildImageCmd command, Invocation.Builder request) { AuthConfigurations authConfigs = command.getBuildAuthConfigs(); if (authConfigs != null) { - request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + request = request.header("X-Registry-Config", + registryConfigs(authConfigs)); } return request; } - - public static class ResponseImpl extends BuildImageCmd.Response { - - private final InputStream proxy; - - public ResponseImpl(InputStream proxy) { - this.proxy = proxy; - } - - @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(EventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); - - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } - } - - @Override - public int read() throws IOException { - return proxy.read(); - } - } + + public static class ResponseImpl extends BuildImageCmd.Response { + + private final InputStream proxy; + + public ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(EventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } + } + + @Override + public int read() throws IOException { + return proxy.read(); + } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 5126aaed3..0a738be83 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -6,11 +6,13 @@ 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.CopyFileFromContainerCmd; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements CopyFileFromContainerCmd.Exec { @@ -29,7 +31,9 @@ protected InputStream execute(CopyFileFromContainerCmd command) { LOGGER.trace("POST: " + webResource.toString()); - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON)).readEntity(InputStream.class); + Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON)); + + 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 751145426..78d26fead 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -20,6 +20,7 @@ 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; public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); @@ -66,7 +67,7 @@ public Void call() throws Exception { Response response = null; try { response = webTarget.request().get(Response.class); - InputStream inputStream = response.readEntity(InputStream.class); + 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)); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index effd39045..cbac951d3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -1,12 +1,15 @@ package com.github.dockerjava.jaxrs; import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + import java.io.InputStream; import static javax.ws.rs.client.Entity.entity; @@ -26,9 +29,11 @@ protected InputStream execute(ExecStartCmd command) { LOGGER.trace("POST: {}", webResource); - return webResource + Response response = webResource .request() .accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + .post(entity(command, MediaType.APPLICATION_JSON), Response.class); + + return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index b279ebdcf..7d031bddd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { @@ -28,7 +29,8 @@ protected InputStream execute(LogContainerCmd command) { .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); LOGGER.trace("GET: {}", webResource); - return webResource.request().get().readEntity(InputStream.class); + + return new WrappedResponseInputStream(webResource.request().get()); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index 725483f85..bd89d22f6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -5,12 +5,14 @@ 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.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class PullImageCmdExec extends AbstrDockerCmdExec implements @@ -31,9 +33,10 @@ protected InputStream execute(PullImageCmd command) { .queryParam("registry", command.getRegistry()); LOGGER.trace("POST: {}", webResource); - return resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null) - .readEntity(InputStream.class); + Response response = resourceWithOptionalAuthConfig(command, webResource.request()) + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); + + return new WrappedResponseInputStream(response); } private Invocation.Builder resourceWithOptionalAuthConfig( diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index e0120c2f5..7fc88d91b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -21,6 +21,7 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushEventStreamItem; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; // Shaded, but imported import com.google.common.collect.ImmutableList; @@ -40,15 +41,14 @@ protected ResponseImpl execute(PushImageCmd command) { final String registryAuth = registryAuth(command.getAuthConfig()); LOGGER.trace("POST: {}", webResource); - InputStream is = webResource + javax.ws.rs.core.Response response = webResource .request() .header("X-Registry-Auth", registryAuth) .accept(MediaType.APPLICATION_JSON) .post( - entity(Response.class, MediaType.APPLICATION_JSON)).readEntity( - InputStream.class); + entity(Response.class, MediaType.APPLICATION_JSON)); - return new ResponseImpl(is); + return new ResponseImpl(new WrappedResponseInputStream(response)); } private String name(PushImageCmd command) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index b1eccd8f2..8d70e2f6f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -4,11 +4,13 @@ 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.SaveImageCmd; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory @@ -24,11 +26,11 @@ protected InputStream execute(SaveImageCmd command) { .queryParam("tag", command.getTag()); LOGGER.trace("GET: {}", webResource); - InputStream is = webResource + Response response = webResource .request() .accept(MediaType.APPLICATION_JSON) - .get().readEntity(InputStream.class); + .get(); - return is; + return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java new file mode 100644 index 000000000..bf40dbfc0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -0,0 +1,70 @@ +package com.github.dockerjava.jaxrs.util; + +import java.io.IOException; +import java.io.InputStream; + +import javax.ws.rs.core.Response; + +/** + * 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. + * + * @author marcus + */ +public class WrappedResponseInputStream extends InputStream { + + private Response response; + private InputStream delegate; + + public WrappedResponseInputStream(Response response) { + this.response = response; + this.delegate = response.readEntity(InputStream.class); + } + + public int read() throws IOException { + return delegate.read(); + } + + public int hashCode() { + return delegate.hashCode(); + } + + public int read(byte[] b) throws IOException { + return delegate.read(b); + } + + public boolean equals(Object obj) { + return delegate.equals(obj); + } + + public int read(byte[] b, int off, int len) throws IOException { + return delegate.read(b, off, len); + } + + public long skip(long n) throws IOException { + return delegate.skip(n); + } + + public int available() throws IOException { + return delegate.available(); + } + + public void close() throws IOException { + response.close(); + delegate.close(); + } + + public void mark(int readlimit) { + delegate.mark(readlimit); + } + + public void reset() throws IOException { + delegate.reset(); + } + + public boolean markSupported() { + return delegate.markSupported(); + } + +} 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 842992198..94a27b1d3 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -79,6 +79,41 @@ public void logNonExistingContainer() throws Exception { } catch (NotFoundException e) { } } + + @Test + public void multipleLogContainer() 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)); + + InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + response.close(); + + //String log = asString(response); + + response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + //log = asString(response); + response.close(); + + response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + String log = asString(response); + + assertThat(log, endsWith(snippet)); + } } From e08695bafaa71e8381c8ba4158a37528665a8571 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 1 Apr 2015 22:54:29 +0200 Subject: [PATCH 0136/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88c44bb7d..6c338660f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Change Log === Latest SNAPSHOT --- + + * [#185](https://github.com/docker-java/docker-java/pull/185) Introduce WrappedResponseInputStream to close underlying Response * [#180](https://github.com/docker-java/docker-java/pull/180) Dockerfiles not called 'dockerfile' * [#179](https://github.com/docker-java/docker-java/pull/179) Add support for cpuset in CreateContainerCmd * [#170](https://github.com/docker-java/docker-java/pull/170) Allow to specify alternative files other than 'Dockerfile' for building images From 3214f5f42ae0bb0f2d63c6f57568571101ffacab Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 1 Apr 2015 23:22:24 +0200 Subject: [PATCH 0137/1399] Added withPull method to BuilImageCmd --- .../dockerjava/api/command/BuildImageCmd.java | 8 +++++++- .../core/command/BuildImageCmdImpl.java | 18 ++++++++++++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) 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 1f26d37d7..ec013d424 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -25,8 +25,10 @@ public interface BuildImageCmd extends DockerCmd{ public boolean hasNoCacheEnabled(); public boolean hasRemoveEnabled(); - + public boolean isQuiet(); + + public boolean hasPullEnabled(); public String getPathToDockerfile(); @@ -50,6 +52,10 @@ public interface BuildImageCmd extends DockerCmd{ public BuildImageCmd withQuiet(boolean quiet); + public BuildImageCmd withPull(); + + public BuildImageCmd withPull(boolean pull); + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); public static interface Exec extends DockerCmdExec { 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 180befd03..046565d3f 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -24,6 +24,8 @@ public class BuildImageCmdImpl extends AbstrDockerCmd Date: Wed, 1 Apr 2015 23:25:50 +0200 Subject: [PATCH 0138/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c338660f..a033ccb4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- + * [#186](https://github.com/docker-java/docker-java/pull/186) Added withPull method to BuilImageCmd * [#185](https://github.com/docker-java/docker-java/pull/185) Introduce WrappedResponseInputStream to close underlying Response * [#180](https://github.com/docker-java/docker-java/pull/180) Dockerfiles not called 'dockerfile' * [#179](https://github.com/docker-java/docker-java/pull/179) Add support for cpuset in CreateContainerCmd From ca54f9c758087bce519f5b59fdd5c4a0482dc313 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 1 Apr 2015 23:38:03 +0200 Subject: [PATCH 0139/1399] Deprecate StartContainerCmd methods in favor of using CreateContainerCmd --- .../api/command/StartContainerCmd.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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 b48e30508..de70b97cb 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -12,7 +12,9 @@ import com.github.dockerjava.api.model.RestartPolicy; /** - * Start a container + * Start a container. + * + * TODO: Almost all methods are deprecated as they have corresponding siblings in {@link CreateContainerCmd} now. */ public interface StartContainerCmd extends DockerCmd { @@ -48,13 +50,16 @@ public interface StartContainerCmd extends DockerCmd { public Capability[] getCapDrop(); + @Deprecated public StartContainerCmd withBinds(Bind... binds); /** * Add link to another container. */ + @Deprecated public StartContainerCmd withLinks(Link... links); + @Deprecated public StartContainerCmd withLxcConf(LxcConf... lxcConf); /** @@ -63,6 +68,7 @@ public interface StartContainerCmd extends DockerCmd { * * @see #withPortBindings(PortBinding...) */ + @Deprecated public StartContainerCmd withPortBindings(Ports portBindings); /** @@ -70,24 +76,31 @@ public interface StartContainerCmd extends DockerCmd { * This corresponds to the --publish (-p) * option of the docker run CLI command. */ + @Deprecated public StartContainerCmd withPortBindings(PortBinding... portBindings); + @Deprecated public StartContainerCmd withPrivileged(Boolean privileged); + @Deprecated public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts); /** * Set custom DNS servers */ + @Deprecated public StartContainerCmd withDns(String... dns); /** * Set custom DNS search domains */ + @Deprecated public StartContainerCmd withDnsSearch(String... dnsSearch); + @Deprecated public StartContainerCmd withVolumesFrom(String volumesFrom); + @Deprecated public StartContainerCmd withContainerId(String containerId); /** @@ -102,22 +115,26 @@ public interface StartContainerCmd extends DockerCmd { * as D-bus and is therefore considered insecure. * */ + @Deprecated public StartContainerCmd withNetworkMode(String networkMode); /** * Add host devices to the container */ + @Deprecated public StartContainerCmd withDevices(Device... devices); /** * Add hostnames to /etc/hosts in the container */ + @Deprecated public StartContainerCmd withExtraHosts(String... extraHosts); /** * Set custom {@link RestartPolicy} for the container. Defaults to * {@link RestartPolicy#noRestart()} */ + @Deprecated public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy); /** @@ -126,6 +143,7 @@ public interface StartContainerCmd extends DockerCmd { * 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); /** @@ -134,6 +152,7 @@ public interface StartContainerCmd extends DockerCmd { * 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); /** From 912b2f7013b96158ca1695b9a82e68aff9a6e97b Mon Sep 17 00:00:00 2001 From: Ritesh Patel Date: Wed, 1 Apr 2015 17:32:56 -0700 Subject: [PATCH 0140/1399] Add docker stats support Add docker stats support for 1.5+ --- .../github/dockerjava/api/DockerClient.java | 2 + .../api/command/DockerCmdExecFactory.java | 3 + .../dockerjava/api/command/StatsCallback.java | 13 ++ .../dockerjava/api/command/StatsCmd.java | 22 +++ .../dockerjava/api/model/Statistics.java | 51 +++++++ .../dockerjava/core/DockerClientImpl.java | 6 + .../dockerjava/core/command/StatsCmdImpl.java | 61 ++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 5 + .../github/dockerjava/jaxrs/StatsCmdExec.java | 90 ++++++++++++ .../client/AbstractDockerClientTest.java | 2 +- .../core/TestDockerCmdExecFactory.java | 5 + .../core/command/StatsCmdImplTest.java | 133 ++++++++++++++++++ 12 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/StatsCallback.java create mode 100644 src/main/java/com/github/dockerjava/api/command/StatsCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/model/Statistics.java create mode 100644 src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 9e275eb35..723c1bad3 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -114,6 +114,8 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public EventsCmd eventsCmd(EventCallback eventCallback); + public StatsCmd statsCmd(StatsCallback statsCallback); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 8b9880747..294d50994 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -78,6 +78,9 @@ public interface DockerCmdExecFactory extends Closeable { public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); public EventsCmd.Exec createEventsCmdExec(); + + public StatsCmd.Exec createStatsCmdExec(); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCallback.java b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java new file mode 100644 index 000000000..610c0f831 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java @@ -0,0 +1,13 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Statistics; + +/** + * Stats callback + */ +public interface StatsCallback { + public void onStats(Statistics stats); + public void onException(Throwable throwable); + public void onCompletion(int numStats); + public boolean isReceiving(); +} diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java new file mode 100644 index 000000000..a605d4267 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -0,0 +1,22 @@ +package com.github.dockerjava.api.command; + +import java.util.concurrent.ExecutorService; + + +/** + * Get stats + * + */ +public interface StatsCmd extends DockerCmd { + public StatsCmd withContainerId(String containerId); + + public String getContainerId(); + + public StatsCmd withStatsCallback(StatsCallback statsCallback); + + public StatsCallback getStatsCallback(); + + public static interface Exec extends DockerCmdExec { + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java new file mode 100644 index 000000000..ff1d6dc95 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -0,0 +1,51 @@ +package com.github.dockerjava.api.model; + +import java.util.Map; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Representation of a Docker statistics. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Statistics { + + @JsonProperty("read") + private String read; + + @JsonProperty("network") + private Map networkStats; + + @JsonProperty("memory_stats") + private Map memoryStats; + + @JsonProperty("blkio_stats") + private Map blkioStats; + + @JsonProperty("cpu_stats") + private Map cpuStats; + + public Map getNetworkStats() { + return networkStats; + } + + public Map getCpuStats() { + return cpuStats; + } + + public Map getMemoryStats() { + return memoryStats; + } + + public Map getBlkioStats() { + return blkioStats; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 534c58ebf..db64d2843 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -336,6 +336,12 @@ public EventsCmd eventsCmd(EventCallback eventCallback) { return new EventsCmdImpl(getDockerCmdExecFactory() .createEventsCmdExec(), eventCallback); } + + @Override + public StatsCmd statsCmd(StatsCallback statsCallback) { + return new StatsCmdImpl(getDockerCmdExecFactory() + .createStatsCmdExec(), statsCallback); + } @Override public void close() throws IOException { diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java new file mode 100644 index 000000000..33fcf6371 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.concurrent.ExecutorService; + +import com.github.dockerjava.api.command.EventCallback; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.StatsCallback; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.TopContainerCmd; + +/** + * Stream docker stats + */ +public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd { + + private String containerId; + private StatsCallback statsCallback; + + public StatsCmdImpl(StatsCmd.Exec exec, StatsCallback statsCallback) { + super(exec); + withStatsCallback(statsCallback); + } + + @Override + public StatsCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public StatsCmd withStatsCallback(StatsCallback statsCallback) { + this.statsCallback = statsCallback; + return this; + } + + + @Override + public StatsCallback getStatsCallback() { + return statsCallback; + } + + @Override + public ExecutorService exec() { + return super.exec(); + } + + @Override + public String toString() { + return new StringBuilder("stats") + .append(containerId != null ? " --id=" + containerId : "") + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index bc3afecad..10c039188 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -312,6 +312,11 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { public EventsCmd.Exec createEventsCmdExec() { return new EventsCmdExec(getBaseResource()); } + + @Override + public StatsCmd.Exec createStatsCmdExec() { + return new StatsCmdExec(getBaseResource()); + } @Override public void close() throws IOException { diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java new file mode 100644 index 000000000..97b9a2754 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -0,0 +1,90 @@ +package com.github.dockerjava.jaxrs; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.InputStream; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.command.StatsCallback; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; + +public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); + + public StatsCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected ExecutorService execute(StatsCmd command) { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + WebTarget webResource = getBaseResource().path("/containers/{id}/stats") + .resolveTemplate("id", command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + StatsNotifier eventNotifier = StatsNotifier.create(command.getStatsCallback(), webResource); + executorService.submit(eventNotifier); + return executorService; + } + + private static class StatsNotifier implements Callable { + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private final StatsCallback statsCallback; + private final WebTarget webTarget; + + private StatsNotifier(StatsCallback statsCallback, WebTarget webTarget) { + this.statsCallback = statsCallback; + this.webTarget = webTarget; + } + + public static StatsNotifier create(StatsCallback statsCallback, WebTarget webTarget) { + checkNotNull(statsCallback, "An StatsCallback must be provided"); + checkNotNull(webTarget, "An WebTarget must be provided"); + return new StatsNotifier(statsCallback, webTarget); + } + + @Override + public Void call() throws Exception { + int numStats=0; + Response response = null; + try { + response = webTarget.request().get(Response.class); + InputStream inputStream = new WrappedResponseInputStream(response); + JsonParser jp = JSON_FACTORY.createParser(inputStream); + while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && statsCallback.isReceiving()) { + statsCallback.onStats(OBJECT_MAPPER.readValue(jp, Statistics.class)); + numStats++; + } + statsCallback.onCompletion(numStats); + LOGGER.info("Finished collecting stats"); + return null ; + } + catch(Throwable t) { + statsCallback.onException(t); + } + finally { + if (response != null) { + response.close(); + } + } + return null ; + } + } +} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 1e61b9a7d..b04ff63ba 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -60,7 +60,7 @@ private DockerClientConfig config() { protected DockerClientConfig config(String password) { DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() - .withServerAddress("https://index.docker.io/v1/"); + .withServerAddress("https://index.docker.io/v1/").withMaxTotalConnections(5).withMaxPerRouteConnections(5); if (password!=null) { builder = builder.withPassword(password); } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 869a12fcf..fb764474f 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -258,6 +258,11 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { public EventsCmd.Exec createEventsCmdExec() { return delegate.createEventsCmdExec(); } + + @Override + public StatsCmd.Exec createStatsCmdExec() { + return delegate.createStatsCmdExec(); + } public List getContainerNames() { return new ArrayList(containerNames); diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java new file mode 100644 index 000000000..c5e575373 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -0,0 +1,133 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.StatsCallback; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.client.AbstractDockerClientTest; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.security.SecureRandom; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +@Test(groups = "integration") +public class StatsCmdImplTest extends AbstractDockerClientTest { + + private static int NUM_STATS = 5; + + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void testStatsStreaming() throws InterruptedException, IOException { + TimeUnit.SECONDS.sleep(1); + + CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS); + StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch); + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withCmd("top") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + StatsCmd statsCmd = dockerClient.statsCmd(statsCallback).withContainerId(container.getId()); + ExecutorService executorService = statsCmd.exec(); + + countDownLatch.await(3, TimeUnit.SECONDS); + boolean gotStats = statsCallback.gotStats(); + + LOG.info("Stop stats collection"); + executorService.shutdown(); + statsCallback.close(); + + LOG.info("Stopping container"); + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + + LOG.info("Completed test"); + assertTrue(gotStats, "Expected true"); + + } + + private class StatsCallbackTest implements StatsCallback { + private final CountDownLatch countDownLatch; + private final AtomicBoolean isReceiving = new AtomicBoolean(true); + private boolean gotStats = false; + + public StatsCallbackTest(CountDownLatch countDownLatch) { + this.countDownLatch = countDownLatch; + } + + public void close() { + LOG.info("Closing StatsCallback"); + isReceiving.set(false); + } + + @Override + public void onStats(Statistics stats) { + LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats); + if(stats != null) { + gotStats = true; + } + countDownLatch.countDown(); + } + + @Override + public void onException(Throwable throwable) { + LOG.error("Error occurred: {}", throwable.getMessage()); + } + + @Override + public void onCompletion(int numStats) { + LOG.info("Number of stats received: {}", numStats); + } + + @Override + public boolean isReceiving() { + return isReceiving.get(); + } + + public boolean gotStats() { + return gotStats; + } + } +} From bef79df8ae4a60f56c40efcab807360c6163c7b5 Mon Sep 17 00:00:00 2001 From: Martin Ahrer Date: Sat, 4 Apr 2015 23:25:37 +0200 Subject: [PATCH 0141/1399] Added a Links constructor accepting a List object --- src/main/java/com/github/dockerjava/api/model/Links.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index 9bbef25d0..888c0aa2c 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -31,6 +31,10 @@ public Links(final Link... links) this.links = links; } + public Links(final List links) { + this.links = links.toArray(new Link[links.size()]); + } + public Link[] getLinks() { return links; From ccd56e90022f01a34b480d84be08d1a291e808f8 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 5 Apr 2015 15:27:36 +0200 Subject: [PATCH 0142/1399] Switch to 1.1.0-SNAPSHOT according to semantic versioning --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba60602ad..c0905b776 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.0.1-SNAPSHOT + 1.1.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From ed1fba471788a46acf462e1193c727730ee7ebfc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 5 Apr 2015 15:31:01 +0200 Subject: [PATCH 0143/1399] [maven-release-plugin] prepare release docker-java-1.1.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c0905b776..e8f612e87 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.1.0-SNAPSHOT + 1.1.0 docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - HEAD + docker-java-1.1.0 From a3bbeae15d3f5dab5ab8a6c0f09b208a02f10642 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 5 Apr 2015 15:31:06 +0200 Subject: [PATCH 0144/1399] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e8f612e87..957c157c6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.1.0 + 1.1.1-SNAPSHOT docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - docker-java-1.1.0 + HEAD From 52cb771b0c81852da1fc30973312318f05268cd9 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 5 Apr 2015 15:36:04 +0200 Subject: [PATCH 0145/1399] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a033ccb4f..0892535a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change Log === Latest SNAPSHOT +--- + +v1.1.0 --- * [#186](https://github.com/docker-java/docker-java/pull/186) Added withPull method to BuilImageCmd From bdedec016ef62783970dda2ff9d336273a3ccf65 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 5 Apr 2015 16:38:01 +0200 Subject: [PATCH 0146/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0892535a4..62f76dd10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Change Log Latest SNAPSHOT --- +* [#192](https://github.com/docker-java/docker-java/pull/192) Added withPull method to BuilImageCmd Added a Links constructor accepting a List object + v1.1.0 --- From 3b4c34631cc5a7d0dadbe8cc29cbe7055427d24c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 5 Apr 2015 16:38:22 +0200 Subject: [PATCH 0147/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62f76dd10..c1b319a7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Change Log Latest SNAPSHOT --- -* [#192](https://github.com/docker-java/docker-java/pull/192) Added withPull method to BuilImageCmd Added a Links constructor accepting a List object +* [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object v1.1.0 --- From b42a3e1f9b74f75126bf3b2dff981b05f92abcb3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 7 Apr 2015 21:06:16 +0200 Subject: [PATCH 0148/1399] Fix issue #164 --- .../api/command/CreateContainerCmd.java | 233 ++++-- .../api/command/StartContainerCmd.java | 134 +-- .../dockerjava/api/model/HostConfig.java | 34 +- .../github/dockerjava/api/model/Ports.java | 16 + .../core/command/CreateContainerCmdImpl.java | 766 +++++++++++------- .../command/CreateContainerCmdImplTest.java | 192 ++++- .../command/StartContainerCmdImplTest.java | 69 +- 7 files changed, 989 insertions(+), 455 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index c6a1234cb..a2a6dc85f 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -2,111 +2,115 @@ import com.github.dockerjava.api.ConflictException; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Capability; +import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.LxcConf; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; public interface CreateContainerCmd extends DockerCmd{ - public CreateContainerCmd withName(String name); - - public String getName(); - - public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); - - public ExposedPort[] getExposedPorts(); + public static interface Exec extends DockerCmdExec { + } - public boolean isDisableNetwork(); + /** + * @throws NotFoundException No such container + * @throws ConflictException Named container already exists + */ + @Override + public CreateContainerResponse exec() throws NotFoundException, + ConflictException; - public String getWorkingDir(); + public Bind[] getBinds(); - public CreateContainerCmd withWorkingDir(String workingDir); + public Capability[] getCapAdd(); - public String getHostName(); + public Capability[] getCapDrop(); - public CreateContainerCmd withDisableNetwork(boolean disableNetwork); + public String[] getCmd(); - public CreateContainerCmd withHostName(String hostName); + public String getCpuset(); - public String[] getPortSpecs(); + public int getCpuShares(); - public CreateContainerCmd withPortSpecs(String... portSpecs); + public Device[] getDevices(); - public String getUser(); + public String[] getDns(); + + public String[] getDnsSearch(); - public CreateContainerCmd withUser(String user); + public String[] getEntrypoint(); - public boolean isTty(); + public String[] getEnv(); - public CreateContainerCmd withTty(boolean tty); + public ExposedPort[] getExposedPorts(); + + public String[] getExtraHosts(); - public boolean isStdinOpen(); + public HostConfig getHostConfig(); - public CreateContainerCmd withStdinOpen(boolean stdinOpen); + public String getHostName(); - public boolean isStdInOnce(); + public String getImage(); - public CreateContainerCmd withStdInOnce(boolean stdInOnce); + public Link[] getLinks(); + + public LxcConf[] getLxcConf(); public long getMemoryLimit(); - public CreateContainerCmd withMemoryLimit(long memoryLimit); - public long getMemorySwap(); - public CreateContainerCmd withMemorySwap(long memorySwap); - - public int getCpuShares(); - - public CreateContainerCmd withCpuShares(int cpuShares); - - public String getCpuset(); + public String getName(); + + public String getNetworkMode(); + + public Ports getPortBindings(); - public CreateContainerCmd withCpuset(String cpuset); + public String[] getPortSpecs(); + + public RestartPolicy getRestartPolicy(); - public boolean isAttachStdin(); + public String getUser(); - public CreateContainerCmd withAttachStdin(boolean attachStdin); + public Volume[] getVolumes(); - public boolean isAttachStdout(); + public VolumesFrom[] getVolumesFrom(); - public CreateContainerCmd withAttachStdout(boolean attachStdout); + public String getWorkingDir(); public boolean isAttachStderr(); - public CreateContainerCmd withAttachStderr(boolean attachStderr); - - public String[] getEnv(); - - public CreateContainerCmd withEnv(String... env); - - public String[] getCmd(); - - public CreateContainerCmd withCmd(String... cmd); - - public String[] getDns(); + public boolean isAttachStdin(); - public CreateContainerCmd withDns(String... dns); + public boolean isAttachStdout(); - public String getImage(); + public boolean isDisableNetwork(); + + public Boolean isPrivileged(); + + public Boolean isPublishAllPorts(); - public CreateContainerCmd withImage(String image); + public boolean isStdInOnce(); - public Volume[] getVolumes(); + public boolean isStdinOpen(); - public CreateContainerCmd withVolumes(Volume... volumes); + public boolean isTty(); - public VolumesFrom[] getVolumesFrom(); + public CreateContainerCmd withAttachStderr(boolean attachStderr); - public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); + public CreateContainerCmd withAttachStdin(boolean attachStdin); - public HostConfig getHostConfig(); + public CreateContainerCmd withAttachStdout(boolean attachStdout); - public CreateContainerCmd withHostConfig(HostConfig hostConfig); - - public Capability[] getCapAdd(); + public CreateContainerCmd withBinds(Bind... binds); /** * Add linux { */ public CreateContainerCmd withCapAdd(Capability... capAdd); - public Capability[] getCapDrop(); - /** * Drop linux kernel @@ -125,21 +127,114 @@ public interface CreateContainerCmd extends DockerCmd{ * prevents the container from changing the owner of any files. */ public CreateContainerCmd withCapDrop(Capability... capDrop); + + public CreateContainerCmd withCmd(String... cmd); + + public CreateContainerCmd withCpuset(String cpuset); + public CreateContainerCmd withCpuShares(int cpuShares); - public String[] getEntrypoint(); + /** + * Add host devices to the container + */ + public CreateContainerCmd withDevices(Device... devices); + + public CreateContainerCmd withDisableNetwork(boolean disableNetwork); + + /** + * Set custom DNS servers + */ + public CreateContainerCmd withDns(String... dns); + /** + * Set custom DNS search domains + */ + public CreateContainerCmd withDnsSearch(String... dnsSearch); + public CreateContainerCmd withEntrypoint(String... entrypoint); + + public CreateContainerCmd withEnv(String... env); + + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); /** - * @throws NotFoundException No such container - * @throws ConflictException Named container already exists + * Add hostnames to /etc/hosts in the container */ - @Override - public CreateContainerResponse exec() throws NotFoundException, - ConflictException; + public CreateContainerCmd withExtraHosts(String... extraHosts); - public static interface Exec extends DockerCmdExec { - } + public CreateContainerCmd withHostConfig(HostConfig hostConfig); + + public CreateContainerCmd withHostName(String hostName); + + public CreateContainerCmd withImage(String image); + + /** + * Add link to another container. + */ + public CreateContainerCmd withLinks(Link... links); + + public CreateContainerCmd withLxcConf(LxcConf... lxcConf); + + public CreateContainerCmd withMemoryLimit(long memoryLimit); + + public CreateContainerCmd withMemorySwap(long memorySwap); + + public CreateContainerCmd withName(String name); + + + /** + * Set the Network mode for the container + *
    + *
  • 'bridge': creates a new network stack for the container on the docker + * bridge
  • + *
  • 'none': no networking for this container
  • + *
  • 'container:': reuses another container network stack
  • + *
  • 'host': use the host network stack inside the container. Note: the + * host mode gives the container full access to local system services such + * as D-bus and is therefore considered insecure.
  • + *
+ */ + public CreateContainerCmd withNetworkMode(String networkMode); + + /** + * Add one or more {@link PortBinding}s. + * This corresponds to the --publish (-p) + * option of the docker run CLI command. + */ + public CreateContainerCmd withPortBindings(PortBinding... portBindings); + + /** + * Add the port bindings that are contained in the given {@link Ports} + * object. + * + * @see #withPortBindings(PortBinding...) + */ + public CreateContainerCmd withPortBindings(Ports portBindings); + + public CreateContainerCmd withPortSpecs(String... portSpecs); + + public CreateContainerCmd withPrivileged(boolean privileged); + + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts); + + /** + * Set custom {@link RestartPolicy} for the container. Defaults to + * {@link RestartPolicy#noRestart()} + */ + public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + + public CreateContainerCmd withStdInOnce(boolean stdInOnce); + + public CreateContainerCmd withStdinOpen(boolean stdinOpen); + + public CreateContainerCmd withTty(boolean tty); + + public CreateContainerCmd withUser(String user); + + public CreateContainerCmd withVolumes(Volume... volumes); + + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); + + public CreateContainerCmd withWorkingDir(String workingDir); } diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index de70b97cb..e76598e3e 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -18,72 +18,79 @@ */ public interface StartContainerCmd extends DockerCmd { - public Bind[] getBinds(); + public static interface Exec extends DockerCmdExec { + } - public Link[] getLinks(); + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already started + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException; - public LxcConf[] getLxcConf(); + public Bind[] getBinds(); - public Ports getPortBindings(); + public Capability[] getCapAdd(); - public Boolean isPublishAllPorts(); + public Capability[] getCapDrop(); - public Boolean isPrivileged(); + public String getContainerId(); + + public Device[] getDevices(); public String[] getDns(); public String[] getDnsSearch(); - public String getVolumesFrom(); + public String[] getExtraHosts(); - public String getContainerId(); + public Link[] getLinks(); - public String getNetworkMode(); + public LxcConf[] getLxcConf(); - public Device[] getDevices(); + public String getNetworkMode(); - public String[] getExtraHosts(); + public Ports getPortBindings(); public RestartPolicy getRestartPolicy(); - public Capability[] getCapAdd(); - - public Capability[] getCapDrop(); + public String getVolumesFrom(); - @Deprecated - public StartContainerCmd withBinds(Bind... binds); + public Boolean isPrivileged(); - /** - * Add link to another container. - */ - @Deprecated - public StartContainerCmd withLinks(Link... links); + public Boolean isPublishAllPorts(); @Deprecated - public StartContainerCmd withLxcConf(LxcConf... lxcConf); + public StartContainerCmd withBinds(Bind... binds); /** - * Add the port bindings that are contained in the given {@link Ports} - * object. - * - * @see #withPortBindings(PortBinding...) + * Add linux
kernel + * capability to the container. For example: adding {@link Capability#MKNOD} + * allows the container to create special files using the 'mknod' command. */ @Deprecated - public StartContainerCmd withPortBindings(Ports portBindings); + public StartContainerCmd withCapAdd(Capability... capAdd); /** - * Add one or more {@link PortBinding}s. - * This corresponds to the --publish (-p) - * option of the docker run CLI command. + * Drop linux kernel + * capability from the container. For example: dropping {@link Capability#CHOWN} + * prevents the container from changing the owner of any files. */ @Deprecated - public StartContainerCmd withPortBindings(PortBinding... portBindings); + public StartContainerCmd withCapDrop(Capability... capDrop); @Deprecated - public StartContainerCmd withPrivileged(Boolean privileged); + public StartContainerCmd withContainerId(String containerId); + /** + * Add host devices to the container + */ @Deprecated - public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts); + public StartContainerCmd withDevices(Device... devices); /** * Set custom DNS servers @@ -97,11 +104,20 @@ public interface StartContainerCmd extends DockerCmd { @Deprecated public StartContainerCmd withDnsSearch(String... dnsSearch); + /** + * Add hostnames to /etc/hosts in the container + */ @Deprecated - public StartContainerCmd withVolumesFrom(String volumesFrom); + public StartContainerCmd withExtraHosts(String... extraHosts); + /** + * Add link to another container. + */ @Deprecated - public StartContainerCmd withContainerId(String containerId); + public StartContainerCmd withLinks(Link... links); + + @Deprecated + public StartContainerCmd withLxcConf(LxcConf... lxcConf); /** * Set the Network mode for the container @@ -119,52 +135,36 @@ public interface StartContainerCmd extends DockerCmd { public StartContainerCmd withNetworkMode(String networkMode); /** - * Add host devices to the container + * Add one or more {@link PortBinding}s. + * This corresponds to the --publish (-p) + * option of the docker run CLI command. */ @Deprecated - public StartContainerCmd withDevices(Device... devices); + public StartContainerCmd withPortBindings(PortBinding... portBindings); /** - * Add hostnames to /etc/hosts in the container + * Add the port bindings that are contained in the given {@link Ports} + * object. + * + * @see #withPortBindings(PortBinding...) */ @Deprecated - public StartContainerCmd withExtraHosts(String... extraHosts); + public StartContainerCmd withPortBindings(Ports portBindings); - /** - * Set custom {@link RestartPolicy} for the container. Defaults to - * {@link RestartPolicy#noRestart()} - */ @Deprecated - public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + public StartContainerCmd withPrivileged(Boolean privileged); - /** - * Add linux kernel - * capability to the container. For example: adding {@link Capability#MKNOD} - * allows the container to create special files using the 'mknod' command. - */ @Deprecated - public StartContainerCmd withCapAdd(Capability... capAdd); + public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts); /** - * Drop linux kernel - * capability from the container. For example: dropping {@link Capability#CHOWN} - * prevents the container from changing the owner of any files. + * Set custom {@link RestartPolicy} for the container. Defaults to + * {@link RestartPolicy#noRestart()} */ @Deprecated - public StartContainerCmd withCapDrop(Capability... capDrop); - - /** - * @throws NotFoundException - * No such container - * @throws NotModifiedException - * Container already started - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException; + public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy); - public static interface Exec extends DockerCmdExec { - } + @Deprecated + public StartContainerCmd withVolumesFrom(String volumesFrom); } diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java index c72d078b1..18fd34073 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -1,7 +1,10 @@ package com.github.dockerjava.api.model; +import java.util.Map; + import org.apache.commons.lang.builder.ToStringBuilder; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -9,7 +12,7 @@ public class HostConfig { @JsonProperty("Binds") - private String[] binds; + private Binds binds; @JsonProperty("Links") private Links links; @@ -59,12 +62,12 @@ public class HostConfig { public HostConfig() { } - public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, + public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts) { - this.binds = binds; - this.links = links; + this.binds = new Binds(binds); + this.links = new Links(links); this.lxcConf = lxcConf; this.portBindings = portBindings; this.publishAllPorts = publishAllPorts; @@ -81,14 +84,16 @@ public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBind this.extraHosts = extraHosts; } - public String[] getBinds() { - return binds; + + @JsonIgnore + public Bind[] getBinds() { + return (binds == null) ? new Bind[0] : binds.getBinds(); } public LxcConf[] getLxcConf() { return lxcConf; } - + public Ports getPortBindings() { return portBindings; } @@ -117,8 +122,9 @@ public String[] getDnsSearch() { return dnsSearch; } - public Links getLinks() { - return links; + @JsonIgnore + public Link[] getLinks() { + return (links == null) ? new Link[0] : links.getLinks(); } public String getNetworkMode() { @@ -145,12 +151,14 @@ public Capability[] getCapDrop() { return capDrop; } - public void setBinds(String[] binds) { - this.binds = binds; + @JsonIgnore + public void setBinds(Bind... binds) { + this.binds = new Binds(binds); } - public void setLinks(Links links) { - this.links = links; + @JsonIgnore + public void setLinks(Link... links) { + this.links = new Links(links); } public void setLxcConf(LxcConf[] lxcConf) { diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java index e0f3c0806..d7c8a3245 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -3,8 +3,10 @@ import static org.apache.commons.lang.StringUtils.isEmpty; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -59,6 +61,10 @@ public Ports() { } public Ports(ExposedPort exposedPort, Binding host) { bind(exposedPort, host); } + + public Ports(PortBinding... portBindings) { + add(portBindings); + } /** * Adds a new {@link PortBinding} for the specified {@link ExposedPort} and @@ -97,6 +103,16 @@ public String toString(){ public Map getBindings(){ return ports; } + +// public PortBinding[] getBindingsAsArray() { +// List bindings = new ArrayList<>(); +// for(Map.Entry entry: ports.entrySet()) { +// for(Ports.Binding binding : entry.getValue()) { +// bindings.add(new PortBinding(binding, entry.getKey())); +// } +// } +// return bindings.toArray(new PortBinding[bindings.size()]); +// } /** * Creates a {@link Binding} for the given IP address and port number. diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index ac32960a9..5afd0dbb8 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -10,370 +10,546 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Capability; +import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.LxcConf; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.api.model.Volumes; /** - * + * * Creates a new container. - * + * */ -public class CreateContainerCmdImpl extends AbstrDockerCmd implements CreateContainerCmd { +public class CreateContainerCmdImpl extends + AbstrDockerCmd implements + CreateContainerCmd { private String name; - - @JsonProperty("Hostname") private String hostName = ""; - @JsonProperty("User") private String user = ""; - @JsonProperty("Memory") private long memoryLimit = 0; - @JsonProperty("MemorySwap") private long memorySwap = 0; - @JsonProperty("CpuShares") private int cpuShares = 0; - @JsonProperty("Cpuset") private String cpuset; - @JsonProperty("AttachStdin") private boolean attachStdin = false; - @JsonProperty("AttachStdout") private boolean attachStdout = false; - @JsonProperty("AttachStderr") private boolean attachStderr = false; - @JsonProperty("PortSpecs") private String[] portSpecs; - @JsonProperty("Tty") private boolean tty = false; - @JsonProperty("OpenStdin") private boolean stdinOpen = false; - @JsonProperty("StdinOnce") private boolean stdInOnce = false; - @JsonProperty("Env") private String[] env; - @JsonProperty("Cmd") private String[] cmd; - @JsonProperty("Entrypoint") private String[] entrypoint; - @JsonProperty("Image") private String image; - @JsonProperty("Volumes") private Volumes volumes = new Volumes(); - @JsonProperty("WorkingDir") private String workingDir = ""; - @JsonProperty("DisableNetwork") private boolean disableNetwork = false; - @JsonProperty("ExposedPorts") private ExposedPorts exposedPorts = new ExposedPorts(); - @JsonProperty("HostConfig") private HostConfig hostConfig = new HostConfig(); - + + @JsonProperty("Hostname") + private String hostName = ""; + @JsonProperty("User") + private String user = ""; + @JsonProperty("Memory") + private long memoryLimit = 0; + @JsonProperty("MemorySwap") + private long memorySwap = 0; + @JsonProperty("CpuShares") + private int cpuShares = 0; + @JsonProperty("Cpuset") + private String cpuset; + @JsonProperty("AttachStdin") + private boolean attachStdin = false; + @JsonProperty("AttachStdout") + private boolean attachStdout = false; + @JsonProperty("AttachStderr") + private boolean attachStderr = false; + @JsonProperty("PortSpecs") + private String[] portSpecs; + @JsonProperty("Tty") + private boolean tty = false; + @JsonProperty("OpenStdin") + private boolean stdinOpen = false; + @JsonProperty("StdinOnce") + private boolean stdInOnce = false; + @JsonProperty("Env") + private String[] env; + @JsonProperty("Cmd") + private String[] cmd; + @JsonProperty("Entrypoint") + private String[] entrypoint; + @JsonProperty("Image") + private String image; + @JsonProperty("Volumes") + private Volumes volumes = new Volumes(); + @JsonProperty("WorkingDir") + private String workingDir = ""; + @JsonProperty("DisableNetwork") + private boolean disableNetwork = false; + @JsonProperty("ExposedPorts") + private ExposedPorts exposedPorts = new ExposedPorts(); + @JsonProperty("HostConfig") + private HostConfig hostConfig = new HostConfig(); + public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { super(exec); checkNotNull(image, "image was not specified"); withImage(image); } + /** + * @throws NotFoundException + * No such container + * @throws ConflictException + * Named container already exists + */ @Override - public CreateContainerCmdImpl withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; - } + public CreateContainerResponse exec() throws NotFoundException, + ConflictException { + return super.exec(); + } - @Override - public String getName() { - return name; - } + @Override + @JsonIgnore + public Bind[] getBinds() { + return hostConfig.getBinds(); + } - @Override - public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { - this.exposedPorts = new ExposedPorts(exposedPorts); - return this; - } + @Override + public Capability[] getCapAdd() { + return hostConfig.getCapAdd(); + } + + @Override + public Capability[] getCapDrop() { + return hostConfig.getCapDrop(); + } + + @Override + public String[] getCmd() { + return cmd; + } + + @Override + public String getCpuset() { + return cpuset; + } + + @Override + public int getCpuShares() { + return cpuShares; + } - @Override + @Override @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); - } + public Device[] getDevices() { + return hostConfig.getDevices(); + } + @Override + @JsonIgnore + public String[] getDns() { + return hostConfig.getDns(); + } - @Override - public boolean isDisableNetwork() { - return disableNetwork; - } + @Override + @JsonIgnore + public String[] getDnsSearch() { + return hostConfig.getDnsSearch(); + } - @Override - public String getWorkingDir() { - return workingDir; - } + @Override + public String[] getEntrypoint() { + return entrypoint; + } - @Override - public CreateContainerCmdImpl withWorkingDir(String workingDir) { - this.workingDir = workingDir; - return this; - } + @Override + public String[] getEnv() { + return env; + } + + @Override + @JsonIgnore + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); + } + @Override + @JsonIgnore + public String[] getExtraHosts() { + return hostConfig.getExtraHosts(); + } + + @Override + public HostConfig getHostConfig() { + return hostConfig; + } - @Override + @Override public String getHostName() { - return hostName; - } + return hostName; + } - @Override - public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) { - this.disableNetwork = disableNetwork; - return this; - } + @Override + public String getImage() { + return image; + } - @Override - public CreateContainerCmdImpl withHostName(String hostName) { - this.hostName = hostName; - return this; - } + @Override + @JsonIgnore + public Link[] getLinks() { + return hostConfig.getLinks(); + } + + @Override + @JsonIgnore + public LxcConf[] getLxcConf() { + return hostConfig.getLxcConf(); + } + + @Override + public long getMemoryLimit() { + return memoryLimit; + } + + @Override + public long getMemorySwap() { + return memorySwap; + } + + @Override + public String getName() { + return name; + } - @Override + @Override + @JsonIgnore + public String getNetworkMode() { + return hostConfig.getNetworkMode(); + } + + @Override + @JsonIgnore + public Ports getPortBindings() { + return hostConfig.getPortBindings(); + } + + @Override public String[] getPortSpecs() { - return portSpecs; - } + return portSpecs; + } - @Override - public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { - this.portSpecs = portSpecs; - return this; - } + @Override + @JsonIgnore + public RestartPolicy getRestartPolicy() { + return hostConfig.getRestartPolicy(); + } - @Override + @Override public String getUser() { - return user; - } + return user; + } - @Override - public CreateContainerCmdImpl withUser(String user) { - this.user = user; - return this; - } + @Override + @JsonIgnore + public Volume[] getVolumes() { + return volumes.getVolumes(); + } - @Override - public boolean isTty() { - return tty; - } + @Override + @JsonIgnore + public VolumesFrom[] getVolumesFrom() { + return hostConfig.getVolumesFrom(); + } - @Override - public CreateContainerCmdImpl withTty(boolean tty) { - this.tty = tty; - return this; - } + @Override + public String getWorkingDir() { + return workingDir; + } - @Override - public boolean isStdinOpen() { - return stdinOpen; - } + @Override + public boolean isAttachStderr() { + return attachStderr; + } - @Override - public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { - this.stdinOpen = stdinOpen; - return this; - } + @Override + public boolean isAttachStdin() { + return attachStdin; + } - @Override + @Override + public boolean isAttachStdout() { + return attachStdout; + } + + @Override + public boolean isDisableNetwork() { + return disableNetwork; + } + + @Override + @JsonIgnore + public Boolean isPrivileged() { + return hostConfig.isPrivileged(); + } + + @Override + @JsonIgnore + public Boolean isPublishAllPorts() { + return hostConfig.isPublishAllPorts(); + } + + @Override public boolean isStdInOnce() { - return stdInOnce; - } + return stdInOnce; + } - @Override - public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { - this.stdInOnce = stdInOnce; - return this; - } + @Override + public boolean isStdinOpen() { + return stdinOpen; + } - @Override - public long getMemoryLimit() { - return memoryLimit; - } + @Override + public boolean isTty() { + return tty; + } - @Override - public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { - this.memoryLimit = memoryLimit; - return this; - } + @Override + public String toString() { + return new ToStringBuilder(this).append("create container ") + .append(name != null ? "name=" + name + " " : "").append(this) + .toString(); + } - @Override - public long getMemorySwap() { - return memorySwap; - } + @Override + public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } - @Override - public CreateContainerCmdImpl withMemorySwap(long memorySwap) { - this.memorySwap = memorySwap; - return this; - } + @Override + public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } - @Override - public int getCpuShares() { - return cpuShares; - } + @Override + public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } - @Override - public CreateContainerCmdImpl withCpuShares(int cpuShares) { - this.cpuShares = cpuShares; - return this; - } + @Override + public CreateContainerCmd withBinds(Bind... binds) { + hostConfig.setBinds(binds); + return this; + } - @Override - public String getCpuset() { - return cpuset; - } + @Override + public CreateContainerCmd withCapAdd(Capability... capAdd) { + hostConfig.setCapAdd(capAdd); + return this; + } - @Override - public CreateContainerCmdImpl withCpuset(String cpuset) { - this.cpuset = cpuset; - return this; - } + @Override + public CreateContainerCmd withCapDrop(Capability... capDrop) { + hostConfig.setCapDrop(capDrop); + return this; + } - @Override - public boolean isAttachStdin() { - return attachStdin; - } + @Override + public CreateContainerCmdImpl withCmd(String... cmd) { + this.cmd = cmd; + return this; + } - @Override - public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { - this.attachStdin = attachStdin; - return this; - } + @Override + public CreateContainerCmdImpl withCpuset(String cpuset) { + this.cpuset = cpuset; + return this; + } - @Override - public boolean isAttachStdout() { - return attachStdout; - } + @Override + public CreateContainerCmdImpl withCpuShares(int cpuShares) { + this.cpuShares = cpuShares; + return this; + } - @Override - public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { - this.attachStdout = attachStdout; - return this; - } + @Override + public CreateContainerCmd withDevices(Device... devices) { + this.hostConfig.setDevices(devices); + return this; + } - @Override - public boolean isAttachStderr() { - return attachStderr; - } + @Override + public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) { + this.disableNetwork = disableNetwork; + return this; + } - @Override - public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { - this.attachStderr = attachStderr; - return this; - } + @Override + public CreateContainerCmdImpl withDns(String... dns) { + this.hostConfig.setDns(dns); + return this; + } - @Override - public String[] getEnv() { - return env; - } + @Override + public CreateContainerCmd withDnsSearch(String... dnsSearch) { + this.hostConfig.setDnsSearch(dnsSearch); + return this; + } - @Override + @Override + public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { + this.entrypoint = entrypoint; + return this; + } + + @Override public CreateContainerCmdImpl withEnv(String... env) { - this.env = env; - return this; - } + this.env = env; + return this; + } - @Override - public String[] getCmd() { - return cmd; - } + @Override + public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { + this.exposedPorts = new ExposedPorts(exposedPorts); + return this; + } - @Override - public CreateContainerCmdImpl withCmd(String... cmd) { - this.cmd = cmd; - return this; - } - - @Override - public String[] getEntrypoint() { - return entrypoint; - } - - @Override - public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { - this.entrypoint = entrypoint; - return this; - } - - @Override - public String[] getDns() { - return hostConfig.getDns(); - } - - @Override - public CreateContainerCmdImpl withDns(String... dns) { - hostConfig.setDns(dns); - return this; - } - - @Override - public String getImage() { - return image; - } + @Override + public CreateContainerCmd withExtraHosts(String... extraHosts) { + this.hostConfig.setExtraHosts(extraHosts); + return this; + } + + @Override + public CreateContainerCmd withHostConfig(HostConfig hostConfig) { + checkNotNull(hostConfig, "no host config was specified"); + this.hostConfig = hostConfig; + return this; + } + + @Override + public CreateContainerCmdImpl withHostName(String hostName) { + this.hostName = hostName; + return this; + } - @Override + @Override public CreateContainerCmdImpl withImage(String image) { - this.image = image; - return this; - } + this.image = image; + return this; + } - @Override - @JsonIgnore - public Volume[] getVolumes() { - return volumes.getVolumes(); - } + @Override + public CreateContainerCmdImpl withLinks(Link... links) { + checkNotNull(links, "links was not specified"); + this.hostConfig.setLinks(links); + return this; + } - @Override - public CreateContainerCmdImpl withVolumes(Volume... volumes) { - this.volumes = new Volumes(volumes); - return this; - } + @Override + public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { + checkNotNull(lxcConf, "lxcConf was not specified"); + this.hostConfig.setLxcConf(lxcConf); + return this; + } - @Override - public VolumesFrom[] getVolumesFrom() { - return hostConfig.getVolumesFrom(); - } + @Override + public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { + this.memoryLimit = memoryLimit; + return this; + } + + @Override + public CreateContainerCmdImpl withMemorySwap(long memorySwap) { + this.memorySwap = memorySwap; + return this; + } + + @Override + public CreateContainerCmdImpl withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public CreateContainerCmd withNetworkMode(String networkMode) { + checkNotNull(networkMode, "networkMode was not specified"); + this.hostConfig.setNetworkMode(networkMode); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(PortBinding... portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(new Ports(portBindings)); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(Ports portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(portBindings); + return this; + } + + @Override + public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { + this.portSpecs = portSpecs; + return this; + } + + @Override + public CreateContainerCmd withPrivileged(boolean privileged) { + this.hostConfig.setPrivileged(privileged); + return this; + } + + @Override + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { + this.hostConfig.setPublishAllPorts(publishAllPorts); + return this; + } + + @Override + public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + this.hostConfig.setRestartPolicy(restartPolicy); + return this; + } + + @Override + public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { + this.stdInOnce = stdInOnce; + return this; + } - @Override + @Override + public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { + this.stdinOpen = stdinOpen; + return this; + } + + @Override + public CreateContainerCmdImpl withTty(boolean tty) { + this.tty = tty; + return this; + } + + @Override + public CreateContainerCmdImpl withUser(String user) { + this.user = user; + return this; + } + + @Override + public CreateContainerCmdImpl withVolumes(Volume... volumes) { + this.volumes = new Volumes(volumes); + return this; + } + + @Override public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { - this.hostConfig.setVolumesFrom(volumesFrom); - return this; - } - - @Override - public HostConfig getHostConfig() { - return hostConfig; - } - - @Override - public CreateContainerCmd withHostConfig(HostConfig hostConfig) { - checkNotNull(hostConfig, "no host config was specified"); - this.hostConfig = hostConfig; - return this; - } - - @Override - public Capability[] getCapAdd() { - return hostConfig.getCapAdd(); - } - - @Override - public CreateContainerCmd withCapAdd(Capability... capAdd) { - hostConfig.setCapAdd(capAdd); - return this; - } - - @Override - public Capability[] getCapDrop() { - return hostConfig.getCapDrop(); - } - - @Override - public CreateContainerCmd withCapDrop(Capability... capDrop) { - hostConfig.setCapDrop(capDrop); - return this; - } - - @Override - public String toString() { - return new ToStringBuilder(this).append("create container ") - .append(name != null ? "name=" + name + " " : "") - .append(this) - .toString(); - } - - /** - * @throws NotFoundException No such container - * @throws ConflictException Named container already exists - */ - @Override - public CreateContainerResponse exec() throws NotFoundException, ConflictException { - return super.exec(); - } - -} + this.hostConfig.setVolumesFrom(volumesFrom); + return this; + } + + @Override + public CreateContainerCmdImpl withWorkingDir(String workingDir) { + this.workingDir = workingDir; + return this; + } + +} diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index ba05b2687..f652c5700 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.api.model.Capability.*; +import static com.github.dockerjava.api.model.Capability.MKNOD; +import static com.github.dockerjava.api.model.Capability.NET_ADMIN; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; @@ -10,6 +11,8 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; import java.lang.reflect.Method; import java.security.SecureRandom; @@ -28,9 +31,12 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.Links; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @@ -99,7 +105,7 @@ public void createContainerWithVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); } - + @Test public void createContainerWithVolumesFrom() throws DockerException { @@ -111,11 +117,12 @@ public void createContainerWithVolumesFrom() throws DockerException { // create a running container with bind mounts CreateContainerResponse container1 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container1Name).exec(); + .withName(container1Name) + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)) + .exec(); LOG.info("Created container1 {}", container1.toString()); - dockerClient.startContainerCmd(container1.getId()).withBinds( - new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + dockerClient.startContainerCmd(container1.getId()).exec(); LOG.info("Started container1 {}", container1.toString()); InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( @@ -238,7 +245,7 @@ public void createContainerWithLink() throws DockerException { assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); HostConfig hostConfig = new HostConfig(); - hostConfig.setLinks(new Links(new Link("container1", "container1Link"))); + hostConfig.setLinks(new Link("container1", "container1Link")); CreateContainerResponse container2 = dockerClient .createContainerCmd("busybox").withName("container2").withHostConfig(hostConfig) .withCmd("env").exec(); @@ -247,7 +254,7 @@ public void createContainerWithLink() throws DockerException { InspectContainerResponse inspectContainerResponse2 = dockerClient .inspectContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse2.getHostConfig().getLinks().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); } @Test @@ -333,5 +340,174 @@ public void createContainerWithExtraHosts() throws DockerException { assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); } + + @Test + public void createContainerWithDevices() throws DockerException { + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() + .getDevices()), contains(new Device("rwm", "/dev/nulo", + "/dev/zero"))); + } + + @Test + public void createContainerWithPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23) + .withPortBindings(portBindings) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig() + .getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings() + .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024)))); + + } + + @Test + public void createContainerWithLinking() throws DockerException { + + CreateContainerResponse container1 = dockerClient + .createContainerCmd("busybox") + .withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + InspectContainerResponse inspectContainerResponse1 = dockerClient + .inspectContainerCmd(container1.getId()).exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), + startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), + is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2") + .withLinks(new Link("container1", "container1Link")) + .exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse2 = dockerClient + .inspectContainerCmd(container2.getId()).exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), + startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + + + } + + @Test + public void createContainerWithRestartPolicy() throws DockerException { + + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), + is(equalTo(restartPolicy))); + } + + /** + * This tests support for --net option for the docker run command: + * --net="bridge" Set the Network mode for the container 'bridge': creates a + * new network stack for the container on the docker bridge 'none': no + * networking for this container 'container:': reuses another container + * network stack 'host': use the host network stack inside the container. + * Note: the host mode gives the container full access to local system + * services such as D-bus and is therefore considered insecure. + */ + @Test + public void createContainerWithNetworkMode() throws DockerException { + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withCmd("true") + .withNetworkMode("host") + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), + is(equalTo("host"))); + } + } diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 37d805aa2..f7cbe20c3 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -253,7 +253,7 @@ public void startContainerWithConflictingPortBindings() } @Test - public void startContainerWithLinking() throws DockerException { + public void startContainerWithLinkingDeprecated() throws DockerException { CreateContainerResponse container1 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") @@ -302,8 +302,71 @@ public void startContainerWithLinking() throws DockerException { is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks() - .getLinks(), equalTo(new Link[] { new Link("container1", + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), + startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getState(), is(notNullValue())); + assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + + } + + + @Test + public void startContainerWithLinking() throws DockerException { + + CreateContainerResponse container1 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + InspectContainerResponse inspectContainerResponse1 = dockerClient + .inspectContainerCmd(container1.getId()).exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), + startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), + is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2") + .withLinks(new Link("container1", "container1Link")) + .exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container2.getId()) + .exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient + .inspectContainerCmd(container2.getId()).exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), + is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", "container1Link") })); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); From d26024ca1a3a907b56b01425ba4cae9e13086ff7 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 7 Apr 2015 21:25:13 +0200 Subject: [PATCH 0149/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1b319a7d..9be899ace 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Change Log === Latest SNAPSHOT --- - +* [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command * [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object v1.1.0 From 2549f57afad7282691c3abad9df4baf449ba18c6 Mon Sep 17 00:00:00 2001 From: Emir Dizdarevic Date: Tue, 7 Apr 2015 22:50:50 +0200 Subject: [PATCH 0150/1399] * Fixed remove intermediate containers bug on build goal - it was always set to true --- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index f67b1f9d8..b5ea85ed2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -46,8 +46,8 @@ protected ResponseImpl execute(BuildImageCmd command) { if (command.hasNoCacheEnabled()) { webResource = webResource.queryParam("nocache", "true"); } - if (command.hasRemoveEnabled()) { - webResource = webResource.queryParam("rm", "true"); + if (!command.hasRemoveEnabled()) { + webResource = webResource.queryParam("rm", "false"); } if (command.isQuiet()) { webResource = webResource.queryParam("q", "true"); From 0f847c929535dfe73349e31c75a8604f39bc3eeb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 8 Apr 2015 19:58:37 +0200 Subject: [PATCH 0151/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9be899ace..b38c17d14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- +* [#194](https://github.com/docker-java/docker-java/pull/194) Fixed remove intermediate containers bug on build goal * [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command * [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object From 6ab93b4337e9e489d92abc9cd25f782d0b17c870 Mon Sep 17 00:00:00 2001 From: Chun Chen Date: Mon, 13 Apr 2015 12:58:55 +0800 Subject: [PATCH 0152/1399] Allow for null bindings --- .../github/dockerjava/api/model/Ports.java | 40 ++++++++++++------- .../api/model/Ports_SerializingTest.java | 17 ++++++++ .../api/model/Ports_addBindingsTest.java | 9 +++++ 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java index d7c8a3245..0c2df94ad 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -75,7 +75,11 @@ public void bind(ExposedPort exposedPort, Binding binding) { Binding[] bindings = ports.get(exposedPort); ports.put(exposedPort, (Binding[]) ArrayUtils.add(bindings, binding)); } else { - ports.put(exposedPort, new Binding[]{binding}); + if (binding == null) { + ports.put(exposedPort, null); + } else { + ports.put(exposedPort, new Binding[]{binding}); + } } } @@ -282,12 +286,16 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali Map.Entry portNode = it.next(); JsonNode bindingsArray = portNode.getValue(); - for (int i = 0; i < bindingsArray.size(); i++) { - JsonNode bindingNode = bindingsArray.get(i); - if (!bindingNode.equals(NullNode.getInstance())) { - String hostIp = bindingNode.get("HostIp").textValue(); - int hostPort = bindingNode.get("HostPort").asInt(); - out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort)); + if (bindingsArray.equals(NullNode.getInstance())) { + out.bind(ExposedPort.parse(portNode.getKey()), null); + } else { + for (int i = 0; i < bindingsArray.size(); i++) { + JsonNode bindingNode = bindingsArray.get(i); + if (!bindingNode.equals(NullNode.getInstance())) { + String hostIp = bindingNode.get("HostIp").textValue(); + int hostPort = bindingNode.get("HostPort").asInt(); + out.bind(ExposedPort.parse(portNode.getKey()), new Binding(hostIp, hostPort)); + } } } } @@ -304,14 +312,18 @@ public void serialize(Ports portBindings, JsonGenerator jsonGen, jsonGen.writeStartObject(); for(Entry entry : portBindings.getBindings().entrySet()){ jsonGen.writeFieldName(entry.getKey().toString()); - jsonGen.writeStartArray(); - for (Binding binding : entry.getValue()) { - jsonGen.writeStartObject(); - jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp()); - jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString()); - jsonGen.writeEndObject(); + if (entry.getValue() != null) { + jsonGen.writeStartArray(); + for (Binding binding : entry.getValue()) { + jsonGen.writeStartObject(); + jsonGen.writeStringField("HostIp", binding.getHostIp() == null ? "" : binding.getHostIp()); + jsonGen.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort().toString()); + jsonGen.writeEndObject(); + } + jsonGen.writeEndArray(); + } else { + jsonGen.writeNull(); } - jsonGen.writeEndArray(); } jsonGen.writeEndObject(); } diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java index 259310698..9190eefd2 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_SerializingTest.java @@ -13,6 +13,7 @@ public class Ports_SerializingTest { private final ObjectMapper objectMapper = new ObjectMapper(); private final String jsonWithDoubleBindingForOnePort = "{\"80/tcp\":[{\"HostIp\":\"10.0.0.1\",\"HostPort\":\"80\"},{\"HostIp\":\"10.0.0.2\",\"HostPort\":\"80\"}]}"; + private final String jsonWithNullBindingForOnePort = "{\"80/tcp\":null}"; @Test public void deserializingPortWithMultipleBindings() throws Exception { @@ -39,4 +40,20 @@ public void serializingEmptyBinding() throws Exception { Ports ports = new Ports(ExposedPort.tcp(80), new Binding(null, null)); assertEquals(objectMapper.writeValueAsString(ports), "{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}"); } + + @Test + public void deserializingPortWithNullBindings() throws Exception { + Ports ports = objectMapper.readValue(jsonWithNullBindingForOnePort, Ports.class); + Map map = ports.getBindings(); + assertEquals(map.size(), 1); + + assertEquals(map.get(ExposedPort.tcp(80)), null); + } + + @Test + public void serializingWithNullBindings() throws Exception { + Ports ports = new Ports(); + ports.bind(ExposedPort.tcp(80), null); + assertEquals(objectMapper.writeValueAsString(ports), jsonWithNullBindingForOnePort); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java index 20e47df9a..18c7f0f09 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.model; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; import java.util.Map; @@ -54,4 +55,12 @@ public void addTwoBindingsForSameExposedPort() { assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080, BINDING_9090 }); } + @Test + public void addNullBindings() { + ports.add(new PortBinding(null, TCP_80)); + Map bindings = ports.getBindings(); + // one key with two values + assertEquals(bindings.size(), 1); + assertEquals(bindings.get(TCP_80), null); + } } From 80093ca8e74503d5e34c393d138da9c97c47f540 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 14 Apr 2015 21:42:33 +0200 Subject: [PATCH 0153/1399] Set to version 1.2.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 957c157c6..1dae4be51 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.1.1-SNAPSHOT + 1.2.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From 8e2f6b3842209580a8f38592c80bde32f599821e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 14 Apr 2015 21:44:14 +0200 Subject: [PATCH 0154/1399] [maven-release-plugin] prepare release docker-java-1.2.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1dae4be51..95938ea66 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.2.0-SNAPSHOT + 1.2.0 docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - HEAD + docker-java-1.2.0 From 33b0ff5a5fec004c3392326383de8e03ed6e69cf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 14 Apr 2015 21:44:20 +0200 Subject: [PATCH 0155/1399] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 95938ea66..1279f9c11 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.2.0 + 1.2.1-SNAPSHOT docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - docker-java-1.2.0 + HEAD From 065cd78ca16173657830ea8b72d6c13d6defdb5b Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 14 Apr 2015 21:52:18 +0200 Subject: [PATCH 0156/1399] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b38c17d14..b7a386469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Change Log === Latest SNAPSHOT --- + +v1.2.0 +--- * [#194](https://github.com/docker-java/docker-java/pull/194) Fixed remove intermediate containers bug on build goal * [#193](https://github.com/docker-java/docker-java/pull/193) Add HostConfig related methods from start command to create command * [#192](https://github.com/docker-java/docker-java/pull/192) Added a Links constructor accepting a List object From bcdfd46c5728b0a51686727725236eb2d1c31720 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 12:51:21 +0100 Subject: [PATCH 0157/1399] Created FrameReader to assist reading frames from attach commands. --- .../github/dockerjava/api/model/Frame.java | 47 ++++++++++++++ .../dockerjava/api/model/StreamType.java | 7 +++ .../dockerjava/core/command/FrameReader.java | 62 +++++++++++++++++++ .../core/command/FrameReaderTest.java | 57 +++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/model/Frame.java create mode 100644 src/main/java/com/github/dockerjava/api/model/StreamType.java create mode 100644 src/main/java/com/github/dockerjava/core/command/FrameReader.java create mode 100644 src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java new file mode 100644 index 000000000..bf77a1334 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.api.model; + +import java.util.Arrays; + +/** + * Represents a logging frame. + */ +public class Frame { + private final StreamType streamType; + private final byte[] payload; + + public Frame(StreamType streamType, byte[] payload) { + this.streamType = streamType; + this.payload = payload; + } + + public StreamType getStreamType() { + return streamType; + } + + public byte[] getPayload() { + return payload; + } + + @Override + public String toString() { + return String.format("%s %s", streamType, new String(payload)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Frame frame = (Frame) o; + + return Arrays.equals(payload, frame.payload) && streamType == frame.streamType; + + } + + @Override + public int hashCode() { + int result = streamType.hashCode(); + result = 31 * result + Arrays.hashCode(payload); + return result; + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/StreamType.java b/src/main/java/com/github/dockerjava/api/model/StreamType.java new file mode 100644 index 000000000..eb11c5536 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java @@ -0,0 +1,7 @@ +package com.github.dockerjava.api.model; + +public enum StreamType { + STDIN, + STDOUT, + STDERR +} diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java new file mode 100644 index 000000000..22a76de12 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Breaks the input into frame. Similar to how a buffered reader would readLies. + *

+ * See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container} + */ +public class FrameReader { + + private static final int HEADER_SIZE = 8; + private final InputStream inputStream; + + public FrameReader(InputStream inputStream) { + this.inputStream = inputStream; + } + + private static StreamType streamType(byte streamType) { + switch (streamType) { + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + throw new IllegalArgumentException("invalid streamType"); + } + } + + /** + * @return A frame, or null if no more frames. + */ + public Frame readFrame() throws IOException { + byte[] header = new byte[HEADER_SIZE]; + int headerSize = inputStream.read(header); + + if (headerSize == -1) { + return null; + } + + if (headerSize != HEADER_SIZE) { + throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize)); + } + + int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << HEADER_SIZE) + header[7]; + int payloadSize = frameSize - header.length; + + byte[] payload = new byte[payloadSize]; + int actualPayloadSize = inputStream.read(payload); + if (actualPayloadSize != payloadSize) { + throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize)); + } + + return new Frame(streamType(header[0]), payload); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java new file mode 100644 index 000000000..dc2d4c8fc --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; + +public class FrameReaderTest { + public static final int HEADER_SIZE = 8; + private final List bytes = new ArrayList<>(); + private final InputStream inputStream = new InputStream() { + @Override + public int read() throws IOException { + return bytes.isEmpty() ? -1 : bytes.remove(0); + } + }; + private final FrameReader frameReader = new FrameReader(inputStream); + + @Test + public void endOfStreamReturnsNull() throws Exception { + assertNull(nextFrame()); + } + + @Test + public void stdInBytesFrameReturnsFrame() throws Exception { + assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDIN, new byte[0])); + } + + private Frame nextFrame(int... bytes) throws IOException { + setBytes(bytes); + return frameReader.readFrame(); + } + + @Test + public void stdOutBytesFrameReturnsFrame() throws Exception { + assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDOUT, new byte[0])); + } + + @Test + public void stdErrBytesFrameReturnsFrame() throws Exception { + assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDERR, new byte[0])); + } + + private void setBytes(int... bytes) { + this.bytes.clear(); + for (int aByte : bytes) { + this.bytes.add(aByte); + } + } +} \ No newline at end of file From 2b4d5ff0026b3e4739f94a9ca57c4a620c21c709 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 13:11:56 +0100 Subject: [PATCH 0158/1399] Created FrameReader to assist reading frames from attach commands. --- .../github/dockerjava/api/command/LogContainerCmd.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index 74512b390..05e108550 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -1,9 +1,9 @@ package com.github.dockerjava.api.command; -import java.io.InputStream; - import com.github.dockerjava.api.NotFoundException; +import java.io.InputStream; + /** * Get container logs * @@ -18,6 +18,10 @@ * Defaults to false. * @param tail * - `all` or ``, Output specified number of lines at the end of logs + * + * Consider wrapping any input stream you get with a frame reader to make reading frame easier. + * + * @see com.github.dockerjava.core.command.FrameReader */ public interface LogContainerCmd extends DockerCmd{ From 83943eb420b51c26802e05f386f7937249be908d Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 13:25:41 +0100 Subject: [PATCH 0159/1399] Make FrameReader Closable. --- .../com/github/dockerjava/core/command/FrameReader.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index 22a76de12..3dae2dd51 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -11,7 +11,7 @@ *

* See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container} */ -public class FrameReader { +public class FrameReader implements AutoCloseable { private static final int HEADER_SIZE = 8; private final InputStream inputStream; @@ -48,7 +48,7 @@ public Frame readFrame() throws IOException { throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize)); } - int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << HEADER_SIZE) + header[7]; + int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << 8) + header[7]; int payloadSize = frameSize - header.length; byte[] payload = new byte[payloadSize]; @@ -59,4 +59,9 @@ public Frame readFrame() throws IOException { return new Frame(streamType(header[0]), payload); } + + @Override + public void close() throws Exception { + inputStream.close(); + } } From 538d465d4bdf65997907a73c4825f83eded7d005 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 13:37:18 +0100 Subject: [PATCH 0160/1399] Made exception more specifi --- .../java/com/github/dockerjava/core/command/FrameReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index 3dae2dd51..ac356da30 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -61,7 +61,7 @@ public Frame readFrame() throws IOException { } @Override - public void close() throws Exception { + public void close() throws IOException { inputStream.close(); } } From 42514449ba9f343282125368fe3466109bed9601 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 23:56:59 +0100 Subject: [PATCH 0161/1399] Trim toString. --- src/main/java/com/github/dockerjava/api/model/Frame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java index bf77a1334..3860a5dba 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -24,7 +24,7 @@ public byte[] getPayload() { @Override public String toString() { - return String.format("%s %s", streamType, new String(payload)); + return String.format("%s: %s", streamType, new String(payload).trim()); } @Override From 559e6c18d1051e2a4329f1e2b1d43bb965ced43f Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sat, 25 Apr 2015 23:57:53 +0100 Subject: [PATCH 0162/1399] Fixed bug in header. --- .../java/com/github/dockerjava/core/command/FrameReader.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index ac356da30..c39791460 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -48,8 +48,7 @@ public Frame readFrame() throws IOException { throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize)); } - int frameSize = (header[4] << 24) + (header[5] << 16) + (header[6] << 8) + header[7]; - int payloadSize = frameSize - header.length; + int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); byte[] payload = new byte[payloadSize]; int actualPayloadSize = inputStream.read(payload); From 1e1e7e87b249ee524e9d22cb28d67739089ba1ca Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 26 Apr 2015 00:02:14 +0100 Subject: [PATCH 0163/1399] Updated FrameReaderTest. --- .../com/github/dockerjava/core/command/FrameReaderTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java index dc2d4c8fc..2b5e2b644 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -30,7 +30,7 @@ public void endOfStreamReturnsNull() throws Exception { @Test public void stdInBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDIN, new byte[0])); + assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDIN, new byte[0])); } private Frame nextFrame(int... bytes) throws IOException { @@ -40,12 +40,12 @@ private Frame nextFrame(int... bytes) throws IOException { @Test public void stdOutBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDOUT, new byte[0])); + assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDOUT, new byte[0])); } @Test public void stdErrBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, HEADER_SIZE), new Frame(StreamType.STDERR, new byte[0])); + assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDERR, new byte[0])); } private void setBytes(int... bytes) { From 15b388ea15255d9d69baea83093fd8f83acf59d6 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 27 Apr 2015 21:29:56 +0200 Subject: [PATCH 0164/1399] Added 'MacAddress' option to create command --- .../api/command/CreateContainerCmd.java | 9 +++++-- .../core/command/CreateContainerCmdImpl.java | 24 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index a2a6dc85f..708e3139a 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; +import com.github.dockerjava.core.command.CreateContainerCmdImpl; public interface CreateContainerCmd extends DockerCmd{ @@ -63,6 +64,8 @@ public CreateContainerResponse exec() throws NotFoundException, public Link[] getLinks(); public LxcConf[] getLxcConf(); + + public String getMacAddress(); public long getMemoryLimit(); @@ -92,7 +95,7 @@ public CreateContainerResponse exec() throws NotFoundException, public boolean isAttachStdout(); - public boolean isDisableNetwork(); + public boolean isNetworkDisabled(); public Boolean isPrivileged(); @@ -139,7 +142,7 @@ public CreateContainerResponse exec() throws NotFoundException, */ public CreateContainerCmd withDevices(Device... devices); - public CreateContainerCmd withDisableNetwork(boolean disableNetwork); + public CreateContainerCmd withNetworkDisabled(boolean disableNetwork); /** * Set custom DNS servers @@ -237,4 +240,6 @@ public CreateContainerResponse exec() throws NotFoundException, public CreateContainerCmd withWorkingDir(String workingDir); + public CreateContainerCmd withMacAddress(String macAddress); + } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 5afd0dbb8..18b089d4d 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -74,8 +74,10 @@ public class CreateContainerCmdImpl extends private Volumes volumes = new Volumes(); @JsonProperty("WorkingDir") private String workingDir = ""; - @JsonProperty("DisableNetwork") - private boolean disableNetwork = false; + @JsonProperty("MacAddress") + private String macAddress; + @JsonProperty("NetworkDisabled") + private boolean networkDisabled = false; @JsonProperty("ExposedPorts") private ExposedPorts exposedPorts = new ExposedPorts(); @JsonProperty("HostConfig") @@ -196,6 +198,10 @@ public Link[] getLinks() { public LxcConf[] getLxcConf() { return hostConfig.getLxcConf(); } + + public String getMacAddress() { + return macAddress; + } @Override public long getMemoryLimit() { @@ -273,8 +279,8 @@ public boolean isAttachStdout() { } @Override - public boolean isDisableNetwork() { - return disableNetwork; + public boolean isNetworkDisabled() { + return networkDisabled; } @Override @@ -372,8 +378,8 @@ public CreateContainerCmd withDevices(Device... devices) { } @Override - public CreateContainerCmdImpl withDisableNetwork(boolean disableNetwork) { - this.disableNetwork = disableNetwork; + public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { + this.networkDisabled = disableNetwork; return this; } @@ -445,6 +451,12 @@ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { this.hostConfig.setLxcConf(lxcConf); return this; } + + @Override + public CreateContainerCmdImpl withMacAddress(String macAddress) { + this.macAddress = macAddress; + return this; + } @Override public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { From e3e6ce87ff59616347008398a6daa8b8beeae063 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 27 Apr 2015 21:42:02 +0200 Subject: [PATCH 0165/1399] Added 'MacAddress' to inspect container response. --- .../dockerjava/api/model/ContainerConfig.java | 7 +++++++ .../command/CreateContainerCmdImplTest.java | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java index b15d5ca86..dcb1256b0 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -51,6 +51,9 @@ public class ContainerConfig { @JsonProperty("Image") private String image; + @JsonProperty("MacAddress") + private String macAddress; + @JsonProperty("Memory") private long memoryLimit = 0; @@ -124,6 +127,10 @@ public boolean isStdinOpen() { public boolean isStdInOnce() { return stdInOnce; } + + public String getMacAddress() { + return macAddress; + } public long getMemoryLimit() { return memoryLimit; diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index f652c5700..53337129d 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -510,4 +510,24 @@ public void createContainerWithNetworkMode() throws DockerException { is(equalTo("host"))); } + @Test + public void createContainerWithMacAddress() throws DockerException { + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withMacAddress("00:80:41:ae:fd:7e") + .withCmd("true") + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertEquals(inspectContainerResponse.getConfig().getMacAddress(), + "00:80:41:ae:fd:7e"); + } + } From 8534b78f68653196f441c9c756df5bb3c47e8b4e Mon Sep 17 00:00:00 2001 From: Emir Dizdarevic Date: Tue, 28 Apr 2015 13:55:02 +0200 Subject: [PATCH 0166/1399] * Added support to use Auth for mutiple repos during build --- .../dockerjava/core/AuthConfigFile.java | 10 +++++++ .../dockerjava/core/DockerClientConfig.java | 19 +++++++++++++ .../dockerjava/core/DockerClientImpl.java | 28 +++++++++++++------ 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java index 24c7aa5cf..862259a8e 100644 --- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; +import com.github.dockerjava.api.model.AuthConfigurations; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; @@ -50,6 +51,15 @@ public AuthConfig resolveAuthConfig(String hostname) { return null; } + public AuthConfigurations getAuthConfigurations() { + final AuthConfigurations authConfigurations = new AuthConfigurations(); + for(Map.Entry authConfigEntry : authConfigMap.entrySet()) { + authConfigurations.addConfig(authConfigEntry.getValue()); + } + + return authConfigurations; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 05491ec6f..7e0b57b0e 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.NameParser.HostnameReposName; import com.github.dockerjava.core.NameParser.ReposTag; @@ -310,6 +311,24 @@ public AuthConfig effectiveAuthConfig(String imageName) { return authConfig; } + public AuthConfigurations getAuthConfigurations() { + String dockerCfgFile = getDockerCfgPath(); + if (dockerCfgFile != null) { + AuthConfigFile authConfigFile; + try { + authConfigFile = AuthConfigFile.loadConfig(new File( + dockerCfgFile)); + } catch (IOException e) { + throw new DockerClientException( + "Failed to parse dockerCfgFile", e); + } + + return authConfigFile.getAuthConfigurations(); + } + + return new AuthConfigurations(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 534c58ebf..7e96225f8 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -10,12 +10,13 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.Identifier; import com.github.dockerjava.core.command.*; /** * @author Konstantin Pelykh (kpelykh@gmail.com) - * + * * @see "https://github.com/docker/docker/blob/master/api/client/commands.go" */ public class DockerClientImpl implements Closeable, DockerClient { @@ -291,20 +292,29 @@ public CommitCmd commitCmd(String containerId) { @Override public BuildImageCmd buildImageCmd() { - return new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec()); + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec())); } @Override public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { - return new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec(), dockerFileOrFolder); + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec(), dockerFileOrFolder)); } - @Override - public BuildImageCmd buildImageCmd(InputStream tarInputStream) { - return new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec(), tarInputStream); + @Override + public BuildImageCmd buildImageCmd(InputStream tarInputStream) { + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec(), tarInputStream)); + } + + private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) { + final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations(); + if (!authConfigurations.getConfigs().isEmpty()) { + buildImageCmd.withBuildAuthConfigs(authConfigurations); + } + + return buildImageCmd; } @Override From 2bc290dd962e32c0c3c1222248311f134ec5a1b9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 28 Apr 2015 17:36:45 +0200 Subject: [PATCH 0167/1399] Fix createContainerWithEnv test --- .../dockerjava/core/command/CreateContainerCmdImplTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index 53337129d..752f0aefc 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -172,8 +172,7 @@ public void createContainerWithEnv() throws DockerException { assertThat( Arrays.asList(inspectContainerResponse.getConfig().getEnv()), - containsInAnyOrder("VARIABLE=success", - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")); + containsInAnyOrder("VARIABLE=success")); dockerClient.startContainerCmd(container.getId()).exec(); From 0d9e8a44a67bf59c4359af81528b2c7262aef4ac Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 28 Apr 2015 17:40:29 +0200 Subject: [PATCH 0168/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a386469..6ee13f6af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Change Log === Latest SNAPSHOT --- +* [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command +* [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings v1.2.0 --- From db7040fd0d549771afe550d3a61fafd2714fb8d3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 28 Apr 2015 21:43:11 +0200 Subject: [PATCH 0169/1399] Fix issue #202 --- .../java/com/github/dockerjava/core/DockerClientBuilder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 155b36bed..4aa7d5ac7 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -36,6 +36,9 @@ public static DockerClientBuilder getInstance(String serverUrl) { } public static DockerCmdExecFactory getDefaultDockerCmdExecFactory() { + // clearing the cache is needed because otherwise we will get + // the same DockerCmdExecFactory instance each time + serviceLoader.reload(); if(!serviceLoader.iterator().hasNext()) { throw new RuntimeException("Fatal: Can't find any implementation of '" + DockerCmdExecFactory.class.getName() + "' in the current classpath."); } From fdb9e77ef0c1aee95293f9f17a896a59747b380c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 2 May 2015 00:33:14 +0200 Subject: [PATCH 0170/1399] Fix issue #205 --- .../api/command/InspectContainerResponse.java | 6 +- .../dockerjava/api/model/AccessMode.java | 8 ++ .../com/github/dockerjava/api/model/Bind.java | 6 +- .../github/dockerjava/api/model/Volume.java | 62 +--------- .../github/dockerjava/api/model/VolumeRW.java | 115 ++++++++++++++++++ .../github/dockerjava/api/model/Volumes.java | 7 +- .../dockerjava/api/model/VolumesRW.java | 57 +++++++++ .../dockerjava/api/model/VolumeTest.java | 4 +- .../command/CreateContainerCmdImplTest.java | 38 +++++- .../command/StartContainerCmdImplTest.java | 5 +- 10 files changed, 235 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumeRW.java create mode 100644 src/main/java/com/github/dockerjava/api/model/VolumesRW.java diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index c86e13c54..f95656899 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -77,7 +77,7 @@ public class InspectContainerResponse { private VolumeBinds volumes; @JsonProperty("VolumesRW") - private Volumes volumesRW; + private VolumesRW volumesRW; public String getId() { return id; @@ -125,8 +125,8 @@ public VolumeBind[] getVolumes() { } @JsonIgnore - public Volume[] getVolumesRW() { - return volumesRW.getVolumes(); + public VolumeRW[] getVolumesRW() { + return volumesRW.getVolumesRW(); } public String getHostnamePath() { diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java index a1f53f57b..a893e7f38 100644 --- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java +++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java @@ -15,6 +15,14 @@ public enum AccessMode { * The default {@link AccessMode}: {@link #rw} */ public static final AccessMode DEFAULT = rw; + + public static final AccessMode fromBoolean(boolean accessMode) { + return accessMode ? rw : ro; + } + + public final boolean toBoolean() { + return this.equals(AccessMode.rw) ? true: false; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/src/main/java/com/github/dockerjava/api/model/Bind.java index eb0b8fd43..0071bff97 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -53,11 +53,11 @@ public static Bind parse(String serialized) { String[] parts = serialized.split(":"); switch (parts.length) { case 2: { - return new Bind(parts[0], Volume.parse(parts[1])); + return new Bind(parts[0], new Volume(parts[1])); } case 3: { AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); - return new Bind(parts[0], Volume.parse(parts[1]), accessMode); + return new Bind(parts[0], new Volume(parts[1]), accessMode); } default: { throw new IllegalArgumentException(); @@ -96,7 +96,7 @@ public int hashCode() { */ @Override public String toString() { - return path + ":" + volume.toString() + ":" + accessMode.toString(); + return path + ":" + volume.getPath() + ":" + accessMode.toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/Volume.java b/src/main/java/com/github/dockerjava/api/model/Volume.java index 3ec5e24c7..131a9a56f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -24,42 +24,18 @@ * * @see Bind */ -@JsonDeserialize(using = Volume.Deserializer.class) -@JsonSerialize(using = Volume.Serializer.class) public class Volume { private String path; - private AccessMode accessMode = AccessMode.rw; - public Volume(String path) { this.path = path; } - - public Volume(String path, AccessMode accessMode) { - this.path = path; - this.accessMode = accessMode; - } public String getPath() { return path; } - - public AccessMode getAccessMode() { - return accessMode; - } - public static Volume parse(String serialized) { - return new Volume(serialized); - } - - /** - * Returns a string representation of this {@link Volume} suitable - * for inclusion in a JSON message. - * The returned String is simply the container path, {@link #getPath()}. - * - * @return a string representation of this {@link Volume} - */ @Override public String toString() { return getPath(); @@ -69,48 +45,14 @@ public String toString() { public boolean equals(Object obj) { if (obj instanceof Volume) { Volume other = (Volume) obj; - return new EqualsBuilder().append(path, other.getPath()).append(accessMode, other.getAccessMode()) - .isEquals(); + return new EqualsBuilder().append(path, other.getPath()).isEquals(); } else return super.equals(obj); } @Override public int hashCode() { - return new HashCodeBuilder().append(path).append(accessMode).toHashCode(); + return new HashCodeBuilder().append(path).toHashCode(); } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(Volume volume, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); - jsonGen.writeEndObject(); - } - - } - - public static class Deserializer extends JsonDeserializer { - @Override - public Volume deserialize(JsonParser jsonParser, - DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - if (!node.equals(NullNode.getInstance())) { - Entry field = node.fields().next(); - return Volume.parse(field.getKey()); - } else { - return null; - } - } - } - - } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java new file mode 100644 index 000000000..717385d9e --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -0,0 +1,115 @@ +package com.github.dockerjava.api.model; + +import java.io.IOException; +import java.util.Map.Entry; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.node.NullNode; + +/** + * Represents a bind mounted volume in a Docker container. + * + * @see Bind + */ +@JsonDeserialize(using = VolumeRW.Deserializer.class) +@JsonSerialize(using = VolumeRW.Serializer.class) +public class VolumeRW { + + private Volume volume; + + private AccessMode accessMode = AccessMode.rw; + + public VolumeRW(Volume volume) { + this.volume = volume; + } + + public VolumeRW(Volume volume, AccessMode accessMode) { + this.volume = volume; + this.accessMode = accessMode; + } + + public Volume getVolume() { + return volume; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + + /** + * Returns a string representation of this {@link VolumeRW} suitable + * for inclusion in a JSON message. + * The returned String is simply the container path, {@link #getPath()}. + * + * @return a string representation of this {@link VolumeRW} + */ + @Override + public String toString() { + return getVolume() + ":" + getAccessMode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VolumeRW) { + VolumeRW other = (VolumeRW) obj; + return new EqualsBuilder().append(getVolume(), other.getVolume()).append(accessMode, other.getAccessMode()) + .isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(getVolume()).append(getAccessMode()).toHashCode(); + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumeRW volumeRW, JsonGenerator jsonGen, + SerializerProvider serProvider) throws IOException, + JsonProcessingException { + + jsonGen.writeStartObject(); + jsonGen.writeFieldName(volumeRW.getVolume().getPath()); + jsonGen.writeString(Boolean.toString(volumeRW.getAccessMode().toBoolean())); + jsonGen.writeEndObject(); + } + + } + + public static class Deserializer extends JsonDeserializer { + @Override + public VolumeRW deserialize(JsonParser jsonParser, + DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + if (!node.equals(NullNode.getInstance())) { + Entry field = node.fields().next(); + String volume = field.getKey(); + AccessMode accessMode = AccessMode.fromBoolean(field.getValue().asBoolean()); + return new VolumeRW(new Volume(volume), accessMode); + } else { + return null; + } + } + } + + + +} diff --git a/src/main/java/com/github/dockerjava/api/model/Volumes.java b/src/main/java/com/github/dockerjava/api/model/Volumes.java index 69753d6a8..b85536e10 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -48,7 +48,9 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen, jsonGen.writeStartObject(); for (Volume volume : volumes.getVolumes()) { jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); + jsonGen.writeStartObject(); + jsonGen.writeEndObject(); + //jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); } jsonGen.writeEndObject(); } @@ -66,7 +68,8 @@ public Volumes deserialize(JsonParser jsonParser, DeserializationContext deseria Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - Volume volume = Volume.parse(field.getKey()); + String path = field.getKey(); + Volume volume = new Volume(path); volumes.add(volume); } } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java new file mode 100644 index 000000000..223f518cf --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.api.model; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.node.NullNode; + +// This is not going to be serialized +@JsonDeserialize(using = VolumesRW.Deserializer.class) +public class VolumesRW { + private final VolumeRW[] volumesRW; + + public VolumesRW(VolumeRW... binds) { + this.volumesRW = binds; + } + + public VolumeRW[] getVolumesRW() { + return volumesRW; + } + + public static final class Deserializer extends JsonDeserializer { + @Override + public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + + List volumesRW = new ArrayList(); + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + + + for (Iterator> it = node.fields(); it.hasNext();) { + Map.Entry field = it.next(); + JsonNode value = field.getValue(); + + if (!value.equals(NullNode.getInstance())) { + if (!value.isBoolean()){ + throw deserializationContext.mappingException("Expected access mode for '"+field.getKey()+"' in host but got '"+ value+"'."); + } + + VolumeRW bind = new VolumeRW(new Volume(field.getKey()), AccessMode.fromBoolean(value.asBoolean())); + volumesRW.add(bind); + } + } + return new VolumesRW(volumesRW.toArray(new VolumeRW[volumesRW.size()])); + } + } + +} diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java index 8fdf19975..7419e5dc9 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java @@ -6,7 +6,7 @@ public class VolumeTest { @Test - public void stringify() { - assertEquals(Volume.parse("/path").toString(), "/path"); + public void getPath() { + assertEquals(new Volume("/path").getPath(), "/path"); } } diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index 752f0aefc..4feadc6b4 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -30,6 +30,7 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.AccessMode; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; @@ -38,6 +39,8 @@ import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeRW; +import com.github.dockerjava.api.model.Volumes; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @@ -88,9 +91,11 @@ public void createContainerWithExistingName() throws DockerException { @Test public void createContainerWithVolume() throws DockerException { + Volume volume = new Volume("/var/log"); + CreateContainerResponse container = dockerClient .createContainerCmd("busybox") - .withVolumes(new Volume("/var/log")).withCmd("true").exec(); + .withVolumes(volume).withCmd("true").exec(); LOG.info("Created container {}", container.toString()); @@ -104,6 +109,37 @@ public void createContainerWithVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); + + assertThat(inspectContainerResponse.getVolumesRW(), + hasItemInArray(new VolumeRW(volume, AccessMode.rw))); + } + + @Test + public void createContainerWithReadOnlyVolume() throws DockerException { + + Volume volume = new Volume("/srv/test"); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withVolumes(volume) + .withCmd("true") + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + LOG.info("Inspect container {}", inspectContainerResponse.getConfig() + .getVolumes()); + + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), + contains("/srv/test")); + + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), + contains(new VolumeRW(volume))); } @Test diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index f7cbe20c3..9a3071653 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -65,7 +65,8 @@ public void startContainerWithVolumes() throws DockerException { Volume volume2 = new Volume("/opt/webapp2"); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withVolumes(volume1, volume2) + .createContainerCmd("busybox") + .withVolumes(volume1, volume2) .withCmd("true").exec(); LOG.info("Created container {}", container.toString()); @@ -91,7 +92,7 @@ public void startContainerWithVolumes() throws DockerException { assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(volume1, volume2)); + contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2))); } From 6cd5f46e266e4351098679877bc477840281062c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 2 May 2015 00:34:58 +0200 Subject: [PATCH 0171/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ee13f6af..ea8bdf048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- +* [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized * [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command * [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings From cfc3a9a1df239f401b0554f7f2a15cad514f9c30 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 2 May 2015 00:44:41 +0200 Subject: [PATCH 0172/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea8bdf048..33607c66c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ Change Log === Latest SNAPSHOT --- + * [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized +* [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build * [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command * [#197](https://github.com/docker-java/docker-java/pull/197) Allow for null bindings From 7675400a68af3e77f32179947471279fb36f2324 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 2 May 2015 00:47:12 +0200 Subject: [PATCH 0173/1399] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b7e9c6217..bbafd8a6a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Java API client for [Docker](http://docs.docker.io/ "Docker") -Supports a subset of the Docker Client API v1.16, Docker Server version 1.4.1 +Supports a subset of the Docker Client API v1.17, Docker Server version 1.5.0 The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 1.0.0 + 1.2.0 ### Latest SNAPSHOT version @@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 1.0.1-SNAPSHOT + 1.2.1-SNAPSHOT ## Documentation From 42c1892b07f216dca2882bdfb6f7d86eb405964f Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 08:57:41 +0100 Subject: [PATCH 0174/1399] Updated to jersey 2.17. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1279f9c11..010165a8b 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 1.7 1.7 - 2.11 + 2.17 2.1.2 4.3.1 1.5 From 92b2002224425235707228dd51657f172693b5cb Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 09:01:13 +0100 Subject: [PATCH 0175/1399] Flipped expressions for minor perf issue. --- src/main/java/com/github/dockerjava/api/model/Frame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java index 3860a5dba..175b56830 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -34,7 +34,7 @@ public boolean equals(Object o) { Frame frame = (Frame) o; - return Arrays.equals(payload, frame.payload) && streamType == frame.streamType; + return streamType == frame.streamType && Arrays.equals(payload, frame.payload); } From 9dc9b3c2d26aa25536a60db815934dd7a6c69982 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 09:41:42 +0100 Subject: [PATCH 0176/1399] Reverted jersey 2.11 -> 2.17 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 010165a8b..1279f9c11 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ 1.7 1.7 - 2.17 + 2.11 2.1.2 4.3.1 1.5 From ebaba3588bd6545bb698a529d553d25d5fe9aec8 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 09:43:24 +0100 Subject: [PATCH 0177/1399] Created integration test for FrameReader. --- .../core/command/DockerfileFixture.java | 63 +++++++++++++++++++ .../core/command/FrameReaderITest.java | 58 +++++++++++++++++ .../frameReaderDockerfile/Dockerfile | 10 +++ 3 files changed, 131 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java create mode 100644 src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java create mode 100644 src/test/resources/frameReaderDockerfile/Dockerfile diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java new file mode 100644 index 000000000..d6a034f6d --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -0,0 +1,63 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerClient; + +import java.io.File; + +/** + * Start and stop a single container for testing. + */ +public class DockerfileFixture implements AutoCloseable { + + private final DockerClient dockerClient; + private String directory; + private String repository; + private String containerId; + + public DockerfileFixture(DockerClient dockerClient, String directory) { + this.dockerClient = dockerClient; + this.directory = directory; + } + + public void open() throws Exception { + + dockerClient + .buildImageCmd(new File("src/test/resources", directory)) + .withNoCache() // remove alternatives, cause problems + .exec() + .close(); + + repository = dockerClient + .listImagesCmd() + .exec() + .get(0) + .getRepoTags()[0]; + + containerId = dockerClient + .createContainerCmd(repository) + .exec() + .getId(); + + dockerClient + .startContainerCmd(containerId) + .exec(); + } + + @Override + public void close() throws Exception { + + dockerClient + .removeContainerCmd(containerId) + .withForce() // stop too + .exec(); + + dockerClient + .removeImageCmd(repository) + .withForce() + .exec(); + } + + public String getContainerId() { + return containerId; + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java new file mode 100644 index 000000000..61a5fb88b --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -0,0 +1,58 @@ +package com.github.dockerjava.core.command; + + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.InputStream; + +@Test(groups = "integration") +public class FrameReaderITest extends AbstractDockerClientTest { + + private DockerfileFixture dockerfileFixture; + + @BeforeMethod + @Override + public void beforeTest() { + super.beforeTest(); + dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); + } + + @BeforeMethod + public void createAndStartDockerContainer() throws Exception { + dockerfileFixture.open(); + } + + @AfterMethod + public void deleteDockerContainerImage() throws Exception { + dockerfileFixture.close(); + } + + @AfterMethod + @Override + public void afterTest() { + super.afterTest(); + } + + @Test + public void canCloseFrameReaderAndReadExpectedLinens() throws Exception { + + InputStream log = dockerClient + .logContainerCmd(dockerfileFixture.getContainerId()) + .withStdOut() + .withStdErr() + .withFollowStream() + .withTailAll() + .exec(); + + try (FrameReader reader = new FrameReader(log)) { + assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes())); + assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes())); + assertNull(reader.readFrame()); + } + } +} \ No newline at end of file diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile new file mode 100644 index 000000000..c4d74fc55 --- /dev/null +++ b/src/test/resources/frameReaderDockerfile/Dockerfile @@ -0,0 +1,10 @@ +FROM busybox:latest + +# log to stdout and stderr so we can make sure logging with FrameReader works + +RUN echo '#! /bin/sh' > cmd.sh +RUN echo 'echo "to stdout"' >> cmd.sh +RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh +RUN chmod +x cmd.sh + +CMD ["./cmd.sh"] \ No newline at end of file From 6a7f1d268db292a058b9425b117de02031db8cd0 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 09:46:13 +0100 Subject: [PATCH 0178/1399] Created integration test for FrameReader. --- .../github/dockerjava/core/command/FrameReaderITest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 61a5fb88b..936cd8b4b 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -5,7 +5,9 @@ import com.github.dockerjava.api.model.StreamType; import com.github.dockerjava.client.AbstractDockerClientTest; import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.io.InputStream; @@ -15,7 +17,7 @@ public class FrameReaderITest extends AbstractDockerClientTest { private DockerfileFixture dockerfileFixture; - @BeforeMethod + @BeforeTest @Override public void beforeTest() { super.beforeTest(); @@ -32,7 +34,7 @@ public void deleteDockerContainerImage() throws Exception { dockerfileFixture.close(); } - @AfterMethod + @AfterTest @Override public void afterTest() { super.afterTest(); From 5e8cfc606c25e61dcefd793090effb8a7a6a2855 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 10:28:26 +0100 Subject: [PATCH 0179/1399] Mad Dockerfile more robust. --- .../core/command/DockerfileFixture.java | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index d6a034f6d..599c88480 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -1,6 +1,8 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.DockerClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; @@ -9,6 +11,7 @@ */ public class DockerfileFixture implements AutoCloseable { + private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileFixture.class); private final DockerClient dockerClient; private String directory; private String repository; @@ -21,6 +24,7 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { public void open() throws Exception { + LOGGER.info("building {}", directory); dockerClient .buildImageCmd(new File("src/test/resources", directory)) .withNoCache() // remove alternatives, cause problems @@ -33,11 +37,15 @@ public void open() throws Exception { .get(0) .getRepoTags()[0]; + LOGGER.info("created {}", repository); + containerId = dockerClient .createContainerCmd(repository) .exec() .getId(); + LOGGER.info("starting {}", containerId); + dockerClient .startContainerCmd(containerId) .exec(); @@ -46,15 +54,23 @@ public void open() throws Exception { @Override public void close() throws Exception { - dockerClient - .removeContainerCmd(containerId) - .withForce() // stop too - .exec(); + if (containerId != null) { + LOGGER.info("removing container {}", containerId); + dockerClient + .removeContainerCmd(containerId) + .withForce() // stop too + .exec(); + containerId = null; + } - dockerClient - .removeImageCmd(repository) - .withForce() - .exec(); + if (repository != null) { + LOGGER.info("removing repostiory {}", repository); + dockerClient + .removeImageCmd(repository) + .withForce() + .exec(); + repository = null; + } } public String getContainerId() { From e29e7da45b8453c22a625f4ef4a09699240ee42f Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 10:35:02 +0100 Subject: [PATCH 0180/1399] Ignore container removal error. --- .../core/command/DockerfileFixture.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 599c88480..4970a2931 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.NotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,15 +57,19 @@ public void close() throws Exception { if (containerId != null) { LOGGER.info("removing container {}", containerId); - dockerClient - .removeContainerCmd(containerId) - .withForce() // stop too - .exec(); + try { + dockerClient + .removeContainerCmd(containerId) + .withForce() // stop too + .exec(); + } catch (NotFoundException ignored) { + LOGGER.info("ignoring {}", ignored.getMessage()); + } containerId = null; } if (repository != null) { - LOGGER.info("removing repostiory {}", repository); + LOGGER.info("removing repository {}", repository); dockerClient .removeImageCmd(repository) .withForce() From 09220689a83cf06f90d866acac329463b811d952 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 11:44:18 +0100 Subject: [PATCH 0181/1399] Fixed connection leak. --- .../dockerjava/jaxrs/BuildImageCmdExec.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index b5ea85ed2..3bdfb006c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,21 +1,5 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; - -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.RequestEntityProcessing; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.github.dockerjava.api.command.BuildImageCmd; @@ -23,6 +7,20 @@ import com.github.dockerjava.api.model.EventStreamItem; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; import com.google.common.collect.ImmutableList; +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; + +import static javax.ws.rs.client.Entity.entity; public class BuildImageCmdExec extends AbstrDockerCmdExec implements @@ -112,5 +110,11 @@ public Iterable getItems() throws IOException { public int read() throws IOException { return proxy.read(); } + + @Override + public void close() throws IOException { + proxy.close(); + super.close(); + } } } From 92aa1bbfe6b416c160dc4dc1eef66f9a40d015e1 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 11:50:06 +0100 Subject: [PATCH 0182/1399] Updated test. --- .../core/command/DockerfileFixture.java | 11 +++-- .../core/command/FrameReaderITest.java | 47 ++++++++++++++++--- .../resources/busyboxDockerfile/Dockerfile | 3 ++ .../frameReaderDockerfile/Dockerfile | 3 ++ 4 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/busyboxDockerfile/Dockerfile diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 4970a2931..b3bdf4ea6 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -2,6 +2,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.model.Image; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,16 +33,18 @@ public void open() throws Exception { .exec() .close(); - repository = dockerClient + Image lastCreatedImage = dockerClient .listImagesCmd() .exec() - .get(0) + .get(0); + + repository = lastCreatedImage .getRepoTags()[0]; - LOGGER.info("created {}", repository); + LOGGER.info("created {} {}", lastCreatedImage.getId(), repository); containerId = dockerClient - .createContainerCmd(repository) + .createContainerCmd(lastCreatedImage.getId()) .exec() .getId(); diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 936cd8b4b..4654d83dd 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -10,6 +10,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import java.io.IOException; import java.io.InputStream; @Test(groups = "integration") @@ -41,20 +42,52 @@ public void afterTest() { } @Test - public void canCloseFrameReaderAndReadExpectedLinens() throws Exception { + public void canCloseFrameReaderAndReadExpectedLines() throws Exception { - InputStream log = dockerClient + try (FrameReader reader = new FrameReader(getLoggerStream())) { + assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes())); + assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes())); + assertNull(reader.readFrame()); + } + } + + private InputStream getLoggerStream() { + return dockerClient .logContainerCmd(dockerfileFixture.getContainerId()) .withStdOut() .withStdErr() - .withFollowStream() .withTailAll() + .withTail(10) + .withFollowStream() .exec(); + } - try (FrameReader reader = new FrameReader(log)) { - assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes())); - assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes())); - assertNull(reader.readFrame()); + @Test + public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception { + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + try (FrameReader reader = new FrameReader(getLoggerStream())) { + //noinspection StatementWithEmptyBody + while (reader.readFrame() != null) { + // nop + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + + thread.start(); + + try (DockerfileFixture busyboxDockerfile = new DockerfileFixture(dockerClient, "busyboxDockerfile")) { + busyboxDockerfile.open(); } + + thread.join(); + } } \ No newline at end of file diff --git a/src/test/resources/busyboxDockerfile/Dockerfile b/src/test/resources/busyboxDockerfile/Dockerfile new file mode 100644 index 000000000..5377ac8a6 --- /dev/null +++ b/src/test/resources/busyboxDockerfile/Dockerfile @@ -0,0 +1,3 @@ +FROM busybox:latest + +CMD ["cat"] \ No newline at end of file diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile index c4d74fc55..8d9b553e1 100644 --- a/src/test/resources/frameReaderDockerfile/Dockerfile +++ b/src/test/resources/frameReaderDockerfile/Dockerfile @@ -3,8 +3,11 @@ FROM busybox:latest # log to stdout and stderr so we can make sure logging with FrameReader works RUN echo '#! /bin/sh' > cmd.sh +RUN echo 'sleep 1' >> cmd.sh RUN echo 'echo "to stdout"' >> cmd.sh RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh +# block for ever +RUN echo 'cat' >> cmd.sh RUN chmod +x cmd.sh CMD ["./cmd.sh"] \ No newline at end of file From 6942c4fc9fe085915d4e791758a1ce27ca1179ca Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 12:02:41 +0100 Subject: [PATCH 0183/1399] Ignore error when removing image (e.g. due to brtfs on CircleCI). --- .../dockerjava/core/command/DockerfileFixture.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index b3bdf4ea6..500a6263b 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Image; import org.slf4j.Logger; @@ -73,10 +74,14 @@ public void close() throws Exception { if (repository != null) { LOGGER.info("removing repository {}", repository); - dockerClient - .removeImageCmd(repository) - .withForce() - .exec(); + try { + dockerClient + .removeImageCmd(repository) + .withForce() + .exec(); + } catch (InternalServerErrorException e) { + LOGGER.info("ignoring {}", e.getMessage()); + } repository = null; } } From 33d66dab953956e8af2102853d4599256b08b7ce Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 12:33:31 +0100 Subject: [PATCH 0184/1399] Ignore error when removing image (e.g. due to brtfs on CircleCI). --- .../com/github/dockerjava/core/command/DockerfileFixture.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 500a6263b..2d7ca7c8d 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -66,7 +66,7 @@ public void close() throws Exception { .removeContainerCmd(containerId) .withForce() // stop too .exec(); - } catch (NotFoundException ignored) { + } catch (NotFoundException | InternalServerErrorException ignored) { LOGGER.info("ignoring {}", ignored.getMessage()); } containerId = null; From f05294d51ec3448552e79712058ed4f5ef6c9db9 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 13:25:37 +0100 Subject: [PATCH 0185/1399] Added PullEventStreamItem and EventStreamReader to stream the reading of events. --- .../dockerjava/api/command/BuildImageCmd.java | 9 ++- .../dockerjava/api/command/PullImageCmd.java | 3 + .../dockerjava/api/command/PushImageCmd.java | 10 ++- .../api/model/PullEventStreamItem.java | 59 +++++++++++++++ .../core/command/EventStreamReader.java | 35 +++++++++ .../core/command/EventStreamReaderITest.java | 72 +++++++++++++++++++ .../core/command/FrameReaderITest.java | 28 +++----- .../eventStreamReaderDockerfile/Dockerfile | 5 ++ 8 files changed, 197 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java create mode 100644 src/main/java/com/github/dockerjava/core/command/EventStreamReader.java create mode 100644 src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java create mode 100644 src/test/resources/eventStreamReaderDockerfile/Dockerfile diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index ec013d424..925946db4 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,12 +1,12 @@ package com.github.dockerjava.api.command; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.EventStreamItem; + import java.io.File; import java.io.IOException; import java.io.InputStream; -import com.github.dockerjava.api.model.AuthConfigurations; -import com.github.dockerjava.api.model.EventStreamItem; - /** * * Build an image from Dockerfile. @@ -61,6 +61,9 @@ public interface BuildImageCmd extends DockerCmd{ public static interface Exec extends DockerCmdExec { } + /** + * @see {@link com.github.dockerjava.core.command.EventStreamReader} + */ public static abstract class Response extends InputStream { public abstract Iterable getItems() throws IOException; } diff --git a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index c39617dde..4b5fc4c32 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.core.command.EventStreamReader; import java.io.InputStream; @@ -33,6 +34,8 @@ public static interface Exec extends DockerCmdExec { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent * connection leaks. + * + * @see {@link EventStreamReader} */ @Override public InputStream exec(); diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index 80e16c6d9..9ed38beb7 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -1,11 +1,12 @@ package com.github.dockerjava.api.command; -import java.io.IOException; -import java.io.InputStream; - import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushEventStreamItem; +import com.github.dockerjava.core.command.EventStreamReader; + +import java.io.IOException; +import java.io.InputStream; /** * Push the latest image to the repository. @@ -40,6 +41,9 @@ public interface PushImageCmd extends DockerCmd{ public static interface Exec extends DockerCmdExec { } + /** + * @see {@link EventStreamReader} + */ public static abstract class Response extends InputStream { public abstract Iterable getItems() throws IOException; } diff --git a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java new file mode 100644 index 000000000..4a3a0b507 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Objects; + +import java.io.Serializable; + +/** + * Represents an item returned from pull + */ +@JsonIgnoreProperties(ignoreUnknown=true) +public class PullEventStreamItem implements Serializable { + + private static final long serialVersionUID = -5187169652557467828L; + + @JsonProperty("status") + private String status; + + @JsonProperty("progress") + private String progress; + + @JsonProperty("progressDetail") + private ProgressDetail progressDetail; + + + public String getStatus() { + return status; + } + + public String getProgress() { + return progress; + } + + public ProgressDetail getProgressDetail() { + return progressDetail; + } + + @JsonIgnoreProperties(ignoreUnknown=true) + public static class ProgressDetail implements Serializable { + @JsonProperty("current") + int current; + + + @Override + public String toString() { + return "current " + current; + } + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("status", status) + .add("progress", progress) + .add("progressDetail", progressDetail) + .toString(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java new file mode 100644 index 000000000..b8975224f --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.InputStream; + +public class EventStreamReader implements AutoCloseable { + + private final ObjectMapper objectMapper = new ObjectMapper(); + private final Class type; + private final InputStream inputStream; + + public EventStreamReader(InputStream inputStream, Class type) { + this.inputStream = inputStream; + this.type = type; + } + + public I readItem() throws IOException { + try { + return objectMapper.readValue(inputStream, type); + } catch (IOException e) { + // dirty, but works + if (e.getMessage().equals("Stream closed")) { + return null; + } + throw e; + } + } + + @Override + public void close() throws IOException { + inputStream.close(); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java new file mode 100644 index 000000000..dfc330d9e --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -0,0 +1,72 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.EventStreamItem; +import com.github.dockerjava.api.model.PullEventStreamItem; +import com.github.dockerjava.core.DockerClientBuilder; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.io.File; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; +import static org.hamcrest.core.AllOf.allOf; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.IsNull.nullValue; +import static org.testng.AssertJUnit.assertNull; + + +@Test(groups = "integration") +public class EventStreamReaderITest { + + private DockerClient dockerClient; + + @BeforeTest + public void setUp() throws Exception { + dockerClient = DockerClientBuilder.getInstance().build(); + } + + @AfterTest + public void tearDown() throws Exception { + dockerClient.close(); + } + + @Test + public void pullCanBeStreamed() throws Exception { + + try (EventStreamReader reader = new EventStreamReader<>( + dockerClient.pullImageCmd("busybox:latest").exec(), + PullEventStreamItem.class) + ) {; + assertThat(reader.readItem(), + allOf( + hasProperty("status", equalTo("Pulling repository busybox")), + hasProperty("progress", nullValue()), + hasProperty("progressDetail", nullValue()) + ) + ); + assertNull(reader.readItem()); + } + } + + @Test + public void buildCanBeStreamed() throws Exception { + + try (EventStreamReader reader = new EventStreamReader<>( + dockerClient.buildImageCmd(new File("src/test/resources/eventStreamReaderDockerfile")).exec(), + EventStreamItem.class) + ) { + assertThat(reader.readItem(), + allOf( + hasProperty("stream", equalTo("Step 0 : FROM busybox:latest\n")), + hasProperty("error", nullValue()), + hasProperty("errorDetail", nullValue()) + ) + ); + assertNull(reader.readItem()); + + } + } +} \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 4654d83dd..3aee3cb45 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -1,44 +1,36 @@ package com.github.dockerjava.core.command; +import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; -import com.github.dockerjava.client.AbstractDockerClientTest; -import org.testng.annotations.AfterMethod; +import com.github.dockerjava.core.DockerClientBuilder; import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.io.IOException; import java.io.InputStream; +import static org.testng.Assert.assertEquals; +import static org.testng.AssertJUnit.assertNull; + @Test(groups = "integration") -public class FrameReaderITest extends AbstractDockerClientTest { +public class FrameReaderITest { + private DockerClient dockerClient; private DockerfileFixture dockerfileFixture; @BeforeTest - @Override public void beforeTest() { - super.beforeTest(); + dockerClient = DockerClientBuilder.getInstance().build(); dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); } - @BeforeMethod - public void createAndStartDockerContainer() throws Exception { - dockerfileFixture.open(); - } - - @AfterMethod + @AfterTest public void deleteDockerContainerImage() throws Exception { dockerfileFixture.close(); - } - - @AfterTest - @Override - public void afterTest() { - super.afterTest(); + dockerClient.close(); } @Test diff --git a/src/test/resources/eventStreamReaderDockerfile/Dockerfile b/src/test/resources/eventStreamReaderDockerfile/Dockerfile new file mode 100644 index 000000000..cdd3bba79 --- /dev/null +++ b/src/test/resources/eventStreamReaderDockerfile/Dockerfile @@ -0,0 +1,5 @@ +FROM busybox:latest + +RUN true + +CMD ["true"] \ No newline at end of file From 8a35bd692ba9fe5090bbb6db789279befa929b5f Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 16:49:55 +0100 Subject: [PATCH 0186/1399] Corrected bug in test. --- .../com/github/dockerjava/core/command/FrameReaderITest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 3aee3cb45..e8e6bcc65 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -25,6 +25,7 @@ public class FrameReaderITest { public void beforeTest() { dockerClient = DockerClientBuilder.getInstance().build(); dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); + dockerfileFixture.open(); } @AfterTest From 86c9f0aa93cb3aa2a64747c303e6756828f5e0e3 Mon Sep 17 00:00:00 2001 From: Alex Collins Date: Sun, 3 May 2015 16:51:54 +0100 Subject: [PATCH 0187/1399] Added PullEventStreamItem and EventStreamReader to stream the reading of events. --- .../github/dockerjava/core/command/DockerfileFixture.java | 5 +++-- .../com/github/dockerjava/core/command/FrameReaderITest.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 2d7ca7c8d..840f63da4 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; /** * Start and stop a single container for testing. @@ -25,7 +26,7 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { this.directory = directory; } - public void open() throws Exception { + public void open() throws IOException { LOGGER.info("building {}", directory); dockerClient @@ -79,7 +80,7 @@ public void close() throws Exception { .removeImageCmd(repository) .withForce() .exec(); - } catch (InternalServerErrorException e) { + } catch (NotFoundException | InternalServerErrorException e) { LOGGER.info("ignoring {}", e.getMessage()); } repository = null; diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index e8e6bcc65..0cf08e953 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -22,7 +22,7 @@ public class FrameReaderITest { private DockerfileFixture dockerfileFixture; @BeforeTest - public void beforeTest() { + public void beforeTest() throws Exception { dockerClient = DockerClientBuilder.getInstance().build(); dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); dockerfileFixture.open(); From c577bf9cb77b523a2ebbdc14f6edd9d661bda250 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Wed, 6 May 2015 00:42:19 +0300 Subject: [PATCH 0188/1399] Add public constructor and Javadoc to api.model.Event --- .../github/dockerjava/api/model/Event.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java index 674cb66de..cb961f97d 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -14,18 +14,59 @@ public class Event { private long time; + /** + * Default constructor for the deserialization. + */ + public Event() { + } + + /** + * Constructor. + * @param id Container ID + * @param status Status string. + * List of statuses is available in Docker API v.1.16 + * @param from Image, from which the container has been created + * @param time Event time + * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT + * @since TODO + */ + public Event(String status, String id, String from, long time) { + this.status = status; + this.id = id; + this.from = from; + this.time = time; + } + + /** + * Status of docker image or container. + * List of statuses is available in Docker API v.1.16 + * @return Status string + */ public String getStatus() { return status; } + /** + * Get ID of docker container. + * @return Container ID + */ public String getId() { return id; } + /** + * Get source image of the container. + * @return Name of the parent container + */ public String getFrom() { return from; } + /** + * Get the event time. + * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT + * @return Event time in the specified format. + */ public long getTime() { return time; } From 8042fc9ea04359600519d2877ab176e447da5a57 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 6 May 2015 23:05:46 +0200 Subject: [PATCH 0189/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33607c66c..e6fca225d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ Change Log === Latest SNAPSHOT --- - +* [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events * [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized * [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build * [#203](https://github.com/docker-java/docker-java/issues/203) Missing 'MacAddress' option in create container command From 5697c60bc4581eff46cc79f735f26b8c658ab2d5 Mon Sep 17 00:00:00 2001 From: "alex.collins" Date: Wed, 6 May 2015 22:57:07 +0100 Subject: [PATCH 0190/1399] Quietly catch IndexOutOfBoundsException. --- .../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java index dfc330d9e..b7d86de07 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -39,7 +39,7 @@ public void pullCanBeStreamed() throws Exception { try (EventStreamReader reader = new EventStreamReader<>( dockerClient.pullImageCmd("busybox:latest").exec(), PullEventStreamItem.class) - ) {; + ) { assertThat(reader.readItem(), allOf( hasProperty("status", equalTo("Pulling repository busybox")), From f4d5a4dd2cb51934e61dff5d7df213b0130e8532 Mon Sep 17 00:00:00 2001 From: "alex.collins" Date: Wed, 6 May 2015 23:04:29 +0100 Subject: [PATCH 0191/1399] Revert "Quietly catch IndexOutOfBoundsException." This reverts commit 5697c60bc4581eff46cc79f735f26b8c658ab2d5. --- .../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java index b7d86de07..dfc330d9e 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -39,7 +39,7 @@ public void pullCanBeStreamed() throws Exception { try (EventStreamReader reader = new EventStreamReader<>( dockerClient.pullImageCmd("busybox:latest").exec(), PullEventStreamItem.class) - ) { + ) {; assertThat(reader.readItem(), allOf( hasProperty("status", equalTo("Pulling repository busybox")), From 6fa074ba40cf54e9043dc6a80db142c76968bb9b Mon Sep 17 00:00:00 2001 From: Vangie Du Date: Thu, 7 May 2015 15:51:01 +0800 Subject: [PATCH 0192/1399] Add ulimit support --- .../dockerjava/api/model/HostConfig.java | 20 +++-- .../github/dockerjava/api/model/Ulimit.java | 64 ++++++++++++++++ .../command/CreateContainerCmdImplTest.java | 73 +++++++++---------- 3 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/Ulimit.java diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java index 18fd34073..9973e6252 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -1,12 +1,10 @@ package com.github.dockerjava.api.model; -import java.util.Map; - -import org.apache.commons.lang.builder.ToStringBuilder; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + @JsonIgnoreProperties(ignoreUnknown = true) public class HostConfig { @@ -59,13 +57,16 @@ public class HostConfig { @JsonProperty("ExtraHosts") private String[] extraHosts; + @JsonProperty("Ulimits") + private Ulimit[] ulimits; + public HostConfig() { } public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices, - String[] extraHosts) { + String[] extraHosts, Ulimit[] ulimits) { this.binds = new Binds(binds); this.links = new Links(links); this.lxcConf = lxcConf; @@ -82,6 +83,7 @@ public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindi this.networkMode = networkMode; this.devices = devices; this.extraHosts = extraHosts; + this.ulimits = ulimits; } @@ -151,6 +153,10 @@ public Capability[] getCapDrop() { return capDrop; } + public Ulimit[] getUlimits() { + return ulimits; + } + @JsonIgnore public void setBinds(Bind... binds) { this.binds = new Binds(binds); @@ -217,6 +223,10 @@ public void setExtraHosts(String[] extraHosts) { this.extraHosts = extraHosts; } + public void setUlimits(Ulimit[] ulimits) { + this.ulimits = ulimits; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/model/Ulimit.java b/src/main/java/com/github/dockerjava/api/model/Ulimit.java new file mode 100644 index 000000000..d5fac09c1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -0,0 +1,64 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * @author Vangie Du (duwan@live.com) + */ +public class Ulimit { + + @JsonProperty("Name") + private String name ; + + @JsonProperty("Soft") + private int soft; + + @JsonProperty("Hard") + private int hard; + + public Ulimit() { + + } + + public Ulimit(String name, int soft, int hard) { + checkNotNull(name, "Name is null"); + + this.name = name; + this.soft = soft; + this.hard = hard; + } + + public String getName() { + return name; + } + + public int getSoft() { + return soft; + } + + public int getHard() { + return hard; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Ulimit) { + Ulimit other = (Ulimit) obj; + return new EqualsBuilder() + .append(name, other.getName()) + .append(soft, other.getSoft()) + .append(hard, other.getHard()).isEquals(); + } else + return super.equals(obj); + + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(name).append(soft).append(hard).toHashCode(); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index 4feadc6b4..c37f48484 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -1,48 +1,23 @@ package com.github.dockerjava.core.command; -import static com.github.dockerjava.api.model.Capability.MKNOD; -import static com.github.dockerjava.api.model.Capability.NET_ADMIN; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasItemInArray; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; +import com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.*; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; import java.lang.reflect.Method; import java.security.SecureRandom; import java.util.Arrays; import java.util.UUID; -import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.AccessMode; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Device; -import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.RestartPolicy; -import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeRW; -import com.github.dockerjava.api.model.Volumes; -import com.github.dockerjava.api.model.VolumesFrom; -import com.github.dockerjava.client.AbstractDockerClientTest; +import static com.github.dockerjava.api.model.Capability.MKNOD; +import static com.github.dockerjava.api.model.Capability.NET_ADMIN; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; @Test(groups = "integration") public class CreateContainerCmdImplTest extends AbstractDockerClientTest { @@ -564,5 +539,29 @@ public void createContainerWithMacAddress() throws DockerException { assertEquals(inspectContainerResponse.getConfig().getMacAddress(), "00:80:41:ae:fd:7e"); } + + @Test + public void createContainerWithULimits() throws DockerException { + + Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; + + HostConfig hostConfig = new HostConfig(); + hostConfig.setUlimits(ulimits); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withName("container") + .withHostConfig(hostConfig).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()), + containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096))); + + } } From bdbdd7521b39945c64c3c75535f16aa18e0cc4ea Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Thu, 7 May 2015 11:53:12 +0300 Subject: [PATCH 0193/1399] Added framework classes for JSON serialization-deserialization tests --- .../test/serdes/AbstractJSONResourceRef.java | 31 +++++ .../test/serdes/JSONResourceRef.java | 37 ++++++ .../test/serdes/JSONTestHelper.java | 110 ++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java create mode 100644 src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java create mode 100644 src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java diff --git a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java new file mode 100644 index 000000000..882b3b012 --- /dev/null +++ b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java @@ -0,0 +1,31 @@ +/* + * Copyright 2015 CloudBees Inc., Oleg Nenashev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.test.serdes; + +/** + * Default implementation of the Resource reference. + * @author Oleg Nenashev + */ +public abstract class AbstractJSONResourceRef implements JSONResourceRef { + /** + * Gets a class which stores resources. + * @return Reference class by default. + */ + @Override + public Class getResourceClass() { + return this.getClass(); + } +} diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java new file mode 100644 index 000000000..96e5df726 --- /dev/null +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Oleg Nenashev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.test.serdes; + +import java.io.IOException; + +/** + * References JSON resources, which + * @author Oleg Nenashev + */ +public interface JSONResourceRef { + + /** + * Gets the resource file name under the class. + * @return File name, which is stored under the resource class + */ + String getFileName(); + + /** + * Gets a class which stores resources. + * @return Class to be used as a resource source + */ + Class getResourceClass(); +} diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java new file mode 100644 index 000000000..b465b2aac --- /dev/null +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -0,0 +1,110 @@ +/* + * Copyright 2015 Oleg Nenashev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.test.serdes; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.command.CommandJSONSamples; +import java.io.IOException; +import java.io.InputStream; +import org.apache.commons.io.IOUtils; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +/** + * Provides helper methods for serialization-deserialization tests + * @author Oleg Nenashev + * @since TODO + */ +public class JSONTestHelper { + + /** + * Reads JSON String from the specified resource + * @param resource JSON File + * @return JSON String + * @throws IOException JSON Conversion error + */ + public static String readString(JSONResourceRef resource) throws IOException { + InputStream istream = CommandJSONSamples.class.getResourceAsStream(resource.getFileName()); + if (istream == null) { + throw new IOException("Cannot retrieve resource " + resource.getFileName()); + } + return IOUtils.toString(istream, "UTF-8"); + } + + /** + * Reads item from the resource. + * @param Data class to be read + * @param resource Resource reference + * @param tclass Class entry + * @return Item + * @throws IOException JSON conversion error + */ + public static TClass readObject(JSONResourceRef resource, Class tclass) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + String str = readString(resource); + return mapper.readValue(str, tclass); + } + + /** + * Basic serialization-deserialization consistency test for the resource. + * @param Data class + * @param resource Resource reference + * @param tclass Class entry + * @throws IOException JSON conversion error + * @throws AssertionError Validation error + * @return Deserialized object after the roundtrip + */ + public static TClass testRoundTrip(JSONResourceRef resource, Class tclass) + throws IOException, AssertionError { + TClass item = readObject(resource, tclass); + assertNotNull(item); + return testRoundTrip(item, tclass); + } + + /** + * Performs roundtrip test for the specified class. + * @param Item class + * @param item Item to be checked + * @return Deserialized object after the roundtrip + * @throws IOException JSON Conversion error + * @throws AssertionError Validation error + */ + @SuppressWarnings("unchecked") + public static TClass testRoundTrip(TClass item) + throws IOException, AssertionError { + return testRoundTrip(item, (Class)item.getClass()); + } + + /** + * Performs roundtrip test for the specified class. + * @param Item class + * @param item Item to be checked + * @param asclass Class to be used during conversions + * @return Deserialized object after the roundtrip + * @throws IOException JSON Conversion error + * @throws AssertionError Validation error + */ + public static TClass testRoundTrip(TClass item, Class asclass) + throws IOException, AssertionError { + ObjectMapper mapper = new ObjectMapper(); + + String inputItemString = mapper.writeValueAsString(item); + TClass convertedItem = mapper.readValue(inputItemString, asclass); + String convertedItemString = mapper.writeValueAsString(convertedItem); + assertEquals(convertedItemString, inputItemString, "JSONs must be equal after the second roundtrip"); + return convertedItem; + } +} From a221a94edb8018321b5c49160a5c51df23a9541d Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Thu, 7 May 2015 11:53:50 +0300 Subject: [PATCH 0194/1399] Direct unit tests for https://github.com/docker-java/docker-java/issues/211 --- .../api/command/CommandJSONSamples.java | 45 ++++++ .../command/InspectContainerResponseTest.java | 51 ++++++ .../inspectContainerResponse_empty.json | 115 +++++++++++++ .../inspectContainerResponse_full.json | 153 ++++++++++++++++++ 4 files changed, 364 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java create mode 100644 src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java create mode 100644 src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json create mode 100644 src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json diff --git a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java new file mode 100644 index 000000000..500919fdc --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -0,0 +1,45 @@ +/* + * Copyright 2015 CloudBees Inc., Oleg Nenashev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.test.serdes.AbstractJSONResourceRef; +import com.github.dockerjava.test.serdes.JSONResourceRef; +import java.io.IOException; +import java.io.InputStream; +import org.apache.commons.io.IOUtils; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +/** + * References test resources and provides basic tests functionality. + * @author Oleg Nenashev + */ +public enum CommandJSONSamples implements JSONResourceRef { + + inspectContainerResponse_full, + inspectContainerResponse_empty; + + @Override + public String getFileName() { + return this + ".json"; + } + + @Override + public Class getResourceClass() { + return CommandJSONSamples.class; + } +} diff --git a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java new file mode 100644 index 000000000..2e294b146 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2015 CloudBees Inc., Oleg Nenashev. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.dockerjava.api.command; + +import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; +import java.io.IOException; +import static org.testng.Assert.*; +import org.testng.annotations.Test; + +/** + * Tests for {@link InspectContainerResponse}. + * @author Oleg Nenashev + */ +public class InspectContainerResponseTest { + + @Test + public void roundTrip_full() throws IOException { + InspectContainerResponse[] responses = testRoundTrip( + CommandJSONSamples.inspectContainerResponse_full, + InspectContainerResponse[].class); + assertEquals(1, responses.length); + final InspectContainerResponse response = responses[0]; + + // Check volumes: https://github.com/docker-java/docker-java/issues/211 + assertEquals(response.getVolumes().length, 2); + assertEquals(response.getVolumesRW().length, 2); + assertEquals(response.getVolumes()[1].getContainerPath(), "/bar/foo/myvol2"); + assertEquals(response.getVolumes()[1].getHostPath(), "/path2"); + assertEquals(response.getVolumesRW()[1].getVolume().getPath(), "/bar/foo/myvol2"); + assertFalse(response.getVolumesRW()[1].getAccessMode().toBoolean()); + assertTrue(response.getVolumesRW()[0].getAccessMode().toBoolean()); + } + + @Test + public void roundTrip_empty() throws IOException { + testRoundTrip(CommandJSONSamples.inspectContainerResponse_empty, InspectContainerResponse[].class); + } +} diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json new file mode 100644 index 000000000..ea31d6f33 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_empty.json @@ -0,0 +1,115 @@ +[{ + "AppArmorProfile": "", + "Args": [ ], + "Config": { + "AttachStderr": true, + "AttachStdin": true, + "AttachStdout": true, + "Cmd": [ ], + "CpuShares": 0, + "Cpuset": "", + "Domainname": "", + "Entrypoint": null, + "Env": [ ], + "ExposedPorts": { }, + "Hostname": "469e5edd8d5b", + "Image": "jenkinsci/workflow-demo", + "Labels": {}, + "MacAddress": "", + "Memory": 0, + "MemorySwap": 0, + "NetworkDisabled": false, + "OnBuild": null, + "OpenStdin": true, + "PortSpecs": null, + "StdinOnce": true, + "Tty": true, + "User": "", + "Volumes": null, + "WorkingDir": "/var/lib/jenkins/workflow-plugin-pipeline-demo" + }, + "Created": "2015-04-29T11:55:42.968262967Z", + "Driver": "aufs", + "ExecDriver": "native-0.2", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "CapAdd": null, + "CapDrop": null, + "CgroupParent": "", + "ContainerIDFile": "", + "CpuShares": 0, + "CpusetCpus": "", + "Devices": [], + "Dns": null, + "DnsSearch": null, + "ExtraHosts": null, + "IpcMode": "", + "Links": null, + "LogConfig": { + "Config": null, + "Type": "json-file" + }, + "LxcConf": [], + "Memory": 0, + "MemorySwap": 0, + "NetworkMode": "bridge", + "PidMode": "", + "PortBindings": { + "8080/tcp": [ ] + }, + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "RestartPolicy": { + "MaximumRetryCount": 0, + "Name": "" + }, + "SecurityOpt": null, + "Ulimits": null, + "VolumesFrom": null + }, + "HostnamePath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hostname", + "HostsPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hosts", + "Id": "469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1", + "Image": "4300417211ebb75b48b06ed5640d641778f312072d24b37978682345cbb362b1", + "LogPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log", + "MountLabel": "", + "Name": "/desperate_babbage", + "NetworkSettings": { + "Bridge": "docker0", + "Gateway": "172.17.42.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "LinkLocalIPv6Address": "fe80::42:acff:fe11:2", + "LinkLocalIPv6PrefixLen": 64, + "MacAddress": "02:42:ac:11:00:02", + "PortMapping": null, + "Ports": { + "22/tcp": null, + "8080/tcp": [ ] + } + }, + "Path": "/bin/sh", + "ProcessLabel": "", + "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/resolv.conf", + "RestartCount": 0, + "State": { + "Dead": false, + "Error": "", + "ExitCode": 0, + "FinishedAt": "0001-01-01T00:00:00Z", + "OOMKilled": false, + "Paused": false, + "Pid": 898, + "Restarting": false, + "Running": true, + "StartedAt": "2015-04-29T11:55:43.464717907Z" + }, + "Volumes": {}, + "VolumesRW": {} +} +] diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json new file mode 100644 index 000000000..c4383ef14 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full.json @@ -0,0 +1,153 @@ +[{ + "AppArmorProfile": "", + "Args": [ + "-c", + "/var/lib/jenkins/run.sh" + ], + "Config": { + "AttachStderr": true, + "AttachStdin": true, + "AttachStdout": true, + "Cmd": [ + "/bin/sh", + "-c", + "/var/lib/jenkins/run.sh" + ], + "CpuShares": 0, + "Cpuset": "", + "Domainname": "", + "Entrypoint": null, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "MAVEN_VERSION=3.3.1", + "JETTY_VERSION=9.2.9.v20150224", + "REV=107ea141f5c7581056c6eb53d2ccd222cdf0d58c" + ], + "ExposedPorts": { + "22/tcp": {}, + "8080/tcp": {}, + "8081/tcp": {} + }, + "Hostname": "469e5edd8d5b", + "Image": "jenkinsci/workflow-demo", + "Labels": {}, + "MacAddress": "", + "Memory": 0, + "MemorySwap": 0, + "NetworkDisabled": false, + "OnBuild": null, + "OpenStdin": true, + "PortSpecs": null, + "StdinOnce": true, + "Tty": true, + "User": "", + "Volumes": null, + "WorkingDir": "/var/lib/jenkins/workflow-plugin-pipeline-demo" + }, + "Created": "2015-04-29T11:55:42.968262967Z", + "Driver": "aufs", + "ExecDriver": "native-0.2", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "CapAdd": null, + "CapDrop": null, + "CgroupParent": "", + "ContainerIDFile": "", + "CpuShares": 0, + "CpusetCpus": "", + "Devices": [], + "Dns": null, + "DnsSearch": null, + "ExtraHosts": null, + "IpcMode": "", + "Links": null, + "LogConfig": { + "Config": null, + "Type": "json-file" + }, + "LxcConf": [], + "Memory": 0, + "MemorySwap": 0, + "NetworkMode": "bridge", + "PidMode": "", + "PortBindings": { + "8080/tcp": [ + { + "HostIp": "", + "HostPort": "8080" + } + ], + "8081/tcp": [ + { + "HostIp": "", + "HostPort": "8081" + } + ] + }, + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "RestartPolicy": { + "MaximumRetryCount": 0, + "Name": "" + }, + "SecurityOpt": null, + "Ulimits": null, + "VolumesFrom": null + }, + "HostnamePath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hostname", + "HostsPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/hosts", + "Id": "469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1", + "Image": "4300417211ebb75b48b06ed5640d641778f312072d24b37978682345cbb362b1", + "LogPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log", + "MountLabel": "", + "Name": "/desperate_babbage", + "NetworkSettings": { + "Bridge": "docker0", + "Gateway": "172.17.42.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "LinkLocalIPv6Address": "fe80::42:acff:fe11:2", + "LinkLocalIPv6PrefixLen": 64, + "MacAddress": "02:42:ac:11:00:02", + "PortMapping": null, + "Ports": { + "22/tcp": null, + "8080/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "8080" + } + ], + "8081/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "8081" + } + ] + } + }, + "Path": "/bin/sh", + "ProcessLabel": "", + "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/resolv.conf", + "RestartCount": 0, + "State": { + "Dead": false, + "Error": "", + "ExitCode": 0, + "FinishedAt": "0001-01-01T00:00:00Z", + "OOMKilled": false, + "Paused": false, + "Pid": 898, + "Restarting": false, + "Running": true, + "StartedAt": "2015-04-29T11:55:43.464717907Z" + }, + "Volumes": { "/foo/bar/myvol":"/path1", "/bar/foo/myvol2":"/path2" }, + "VolumesRW": { "/foo/bar/myvol": true, "/bar/foo/myvol2": false } +} +] From c31c4aceba8a883bb5d11a9e8a78c0f15f87fd65 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Thu, 7 May 2015 11:54:20 +0300 Subject: [PATCH 0195/1399] Add missing serializers to resolve https://github.com/docker-java/docker-java/issues/211 Resolves #211 --- .../dockerjava/api/model/VolumeBinds.java | 17 +++++++++++++++++ .../github/dockerjava/api/model/VolumesRW.java | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java index 62ebc1181..e23ddc9e8 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.core.JsonGenerator; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; @@ -12,11 +13,15 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; // This is not going to be serialized @JsonDeserialize(using = VolumeBinds.Deserializer.class) +@JsonSerialize(using = VolumeBinds.Serializer.class) public class VolumeBinds { private final VolumeBind[] binds; @@ -28,6 +33,18 @@ public VolumeBind[] getBinds() { return binds; } + public static final class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumeBinds value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeStartObject(); + for (final VolumeBind bind : value.binds) { + jgen.writeStringField(bind.getContainerPath(), bind.getHostPath()); + } + jgen.writeEndObject(); + } + } + public static final class Deserializer extends JsonDeserializer { @Override public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java index 223f518cf..a898ed57f 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.core.JsonGenerator; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; @@ -12,10 +13,14 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; // This is not going to be serialized +@JsonSerialize(using = VolumesRW.Serializer.class) @JsonDeserialize(using = VolumesRW.Deserializer.class) public class VolumesRW { private final VolumeRW[] volumesRW; @@ -28,6 +33,19 @@ public VolumeRW[] getVolumesRW() { return volumesRW; } + public static final class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumesRW value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeStartObject(); + for (final VolumeRW volumeRW : value.volumesRW) { + jgen.writeBooleanField(volumeRW.getVolume().getPath(), volumeRW.getAccessMode().toBoolean()); + } + jgen.writeEndObject(); + } + + } + public static final class Deserializer extends JsonDeserializer { @Override public VolumesRW deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { From d6e8be31202830302b1ab5d00b20a6f7e8d73872 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Thu, 7 May 2015 12:00:45 +0300 Subject: [PATCH 0196/1399] Add roundtrip spotcheck to InspectExecCmdImplTest --- .../dockerjava/core/command/InspectExecCmdImplTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 2deddca09..f1270f4e6 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -3,8 +3,11 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectExecResponse; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.test.serdes.JSONTestHelper; +import java.io.IOException; import org.testng.ITestResult; import org.testng.annotations.*; @@ -41,7 +44,7 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void inspectExecTest() { + public void inspectExecTest() throws IOException { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient @@ -93,5 +96,9 @@ public void inspectExecTest() { InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(third.getExitCode(), is(0)); + // Get container info and check its roundtrip to ensure the consistency + InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(container.getId()).exec(); + assertEquals(containerInfo.getId(), container.getId()); + JSONTestHelper.testRoundTrip(containerInfo); } } From 390b2f9442eee2014fd1b48df8876582dfef4856 Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Sat, 9 May 2015 00:35:59 +0200 Subject: [PATCH 0197/1399] Use a common path relativize method to fix testDockerIgnore and testNonstandard2 * testDockerIgnore was failing if your source checkout directory contains a 'b' char. stripStart function was misused here * testNonstandard2 was failing on Windows * other usage of relativize has been changed to this relativize method (extract from CompressArchiveUtil) --- .../dockerjava/core/CompressArchiveUtil.java | 9 +++---- .../github/dockerjava/core/FilePathUtil.java | 24 +++++++++++++++++++ .../core/GoLangMatchFileFilter.java | 5 +--- .../core/command/BuildImageCmdImpl.java | 5 ++-- .../core/dockerfile/Dockerfile.java | 5 ++-- 5 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/FilePathUtil.java diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index f07fa1b25..297adc766 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -6,6 +6,8 @@ import java.io.*; +import static com.github.dockerjava.core.FilePathUtil.relativize; + public class CompressArchiveUtil { public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { @@ -15,7 +17,7 @@ public static File archiveTARFiles(File base, Iterable files, String archi tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); for (File file : files) { TarArchiveEntry tarEntry = new TarArchiveEntry(file); - tarEntry.setName(relativize(base.getCanonicalFile(), file.getCanonicalFile())); + tarEntry.setName(relativize(base, file)); if (!file.isDirectory()) { if (file.canExecute()) { @@ -36,9 +38,4 @@ public static File archiveTARFiles(File base, Iterable files, String archi return tarFile; } - - public static String relativize(File base, File absolute) { - String relative = base.toURI().relativize(absolute.toURI()).getPath(); - return relative; - } } diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java new file mode 100644 index 000000000..3fc910217 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.core; + +import java.io.*; +import com.github.dockerjava.api.DockerClientException; + +public class FilePathUtil { + + /** + * Return the relative path. Path elements are separated with / char. + * @param baseDir a parent directory of {@code file} + * @param file the file to get the relative path + * @return the relative path + */ + public static String relativize(File baseDir, File file) { + try { + baseDir = baseDir.getCanonicalFile(); + file = file.getCanonicalFile(); + + return baseDir.toURI().relativize(file.toURI()).getPath(); + } catch (IOException e) { + throw new DockerClientException(e.getMessage(), e); + } + } +} diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index aa88287b4..33e0f2a47 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -3,8 +3,6 @@ */ package com.github.dockerjava.core; -import static org.apache.commons.lang.StringUtils.stripStart; - import java.io.File; import java.util.List; @@ -25,8 +23,7 @@ public GoLangMatchFileFilter(File base, List patterns) { @Override public boolean accept(File file) { - String basePath = base.getAbsolutePath() + File.separatorChar; - String relativePath = stripStart(file.getAbsolutePath(), basePath); + String relativePath = FilePathUtil.relativize(base, file); boolean match = GoLangFileMatch.match(patterns, relativePath); return !match; diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 046565d3f..dbccda5fc 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -8,8 +8,8 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; -import com.google.common.base.Optional; /** * @@ -125,8 +125,7 @@ public boolean hasPullEnabled() { @Override public String getPathToDockerfile() { - int baseLen = baseDirectory.getAbsolutePath().length(); - return dockerFile.getAbsolutePath().substring(baseLen+1); + return FilePathUtil.relativize(baseDirectory, dockerFile); } @Override diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java index 21d938ffd..f5b25f2b3 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -2,6 +2,7 @@ import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; @@ -23,7 +24,6 @@ import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Optional; -import com.google.common.base.Predicate; import com.google.common.collect.Collections2; /** @@ -209,8 +209,7 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException } else if (!src.exists()) { filesToAdd.addAll(resolveWildcards(src, ignores)); } else if (!GoLangFileMatch.match(ignores, - CompressArchiveUtil.relativize(dockerFolder, - src))) { + FilePathUtil.relativize(dockerFolder, src))) { filesToAdd.add(src); } else { throw new DockerClientException( From 3bdb89994e7fe35b532ef26efd16ff9f00faac0a Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Sat, 9 May 2015 01:18:44 +0200 Subject: [PATCH 0198/1399] Fix testDockerBuilderAddFilesViaWildcard on Windows However i'm quite skeptical on the Dockerfile.resolveWildcards method --- .../core/dockerfile/Dockerfile.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java index f5b25f2b3..802299a7c 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -189,33 +189,25 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException File src = new File(resource); if (!src.isAbsolute()) { - src = new File(dockerFolder, resource) - .getCanonicalFile(); + src = new File(dockerFolder, resource); } else { throw new DockerClientException(String.format( "Source file %s must be relative to %s", src, dockerFolder)); } - // if (!src.exists()) { - // throw new DockerClientException(String.format( - // "Source file %s doesn't exist", src)); - // } - if (src.isDirectory()) { - Collection files = FileUtils.listFiles(src, - new GoLangMatchFileFilter(src, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else if (!src.exists()) { - filesToAdd.addAll(resolveWildcards(src, ignores)); - } else if (!GoLangFileMatch.match(ignores, - FilePathUtil.relativize(dockerFolder, src))) { - filesToAdd.add(src); + if (src.exists()) { + src = src.getCanonicalFile(); + if (src.isDirectory()) { + Collection files = FileUtils.listFiles(src, new GoLangMatchFileFilter(src, ignores), TrueFileFilter.INSTANCE); + filesToAdd.addAll(files); + } else if (!GoLangFileMatch.match(ignores, FilePathUtil.relativize(dockerFolder, src))) { + filesToAdd.add(src); + } else { + throw new DockerClientException(String.format("Source file %s is excluded by .dockerignore file", src)); + } } else { - throw new DockerClientException( - String.format( - "Source file %s is excluded by .dockerignore file", - src)); + filesToAdd.addAll(resolveWildcards(src, ignores)); } } } From 0e52d21471f82368b1ad950e6e49916fc133c8b3 Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Sat, 9 May 2015 01:27:44 +0200 Subject: [PATCH 0199/1399] Fix canCloseFrameReaderAndReadExpectedLines test on Windows --- .../github/dockerjava/core/command/FrameReaderITest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 0cf08e953..0c22fc085 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -38,8 +38,8 @@ public void deleteDockerContainerImage() throws Exception { public void canCloseFrameReaderAndReadExpectedLines() throws Exception { try (FrameReader reader = new FrameReader(getLoggerStream())) { - assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, String.format("to stdout%n").getBytes())); - assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, String.format("to stderr%n").getBytes())); + assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, "to stdout\n".getBytes())); + assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, "to stderr\n".getBytes())); assertNull(reader.readFrame()); } } @@ -83,4 +83,4 @@ public void run() { thread.join(); } -} \ No newline at end of file +} From d61b7c4af08cfcc9bbdc59e450345673dada35dc Mon Sep 17 00:00:00 2001 From: Xavier Fournet Date: Sat, 9 May 2015 12:54:10 +0200 Subject: [PATCH 0200/1399] Fix regression when building an image from a TAR input stream --- .../core/command/BuildImageCmdImpl.java | 6 +- .../core/command/BuildImageCmdImplTest.java | 63 ++++++++++++------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index dbccda5fc..ef0242857 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -125,7 +125,11 @@ public boolean hasPullEnabled() { @Override public String getPathToDockerfile() { - return FilePathUtil.relativize(baseDirectory, dockerFile); + if (baseDirectory != null && dockerFile != null) { + return FilePathUtil.relativize(baseDirectory, dockerFile); + } else { + return null; + } } @Override diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index bd8a56d2d..c9bd51b90 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -9,10 +9,15 @@ import static org.hamcrest.Matchers.nullValue; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; +import java.util.Collection; +import java.util.UUID; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.commons.lang.StringUtils; import org.testng.ITestResult; @@ -24,12 +29,13 @@ import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.model.EventStreamItem; import com.github.dockerjava.client.AbstractDockerClientTest; - +import com.github.dockerjava.core.CompressArchiveUtil; @Test(groups = "integration") public class BuildImageCmdImplTest extends AbstractDockerClientTest { @@ -105,7 +111,16 @@ public void testNonstandard2() { assertThat(fullLog, containsString("Successfully built")); } - @Test + @Test + public void testDockerBuilderFromTar() throws IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile()); + Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); + File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString()); + String response = dockerfileBuild(new FileInputStream(tarFile)); + assertThat(response, containsString("Successfully executed testrun.sh")); + } + + @Test public void testDockerBuilderAddUrl() { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddUrl").getFile()); @@ -150,37 +165,39 @@ public void testDockerBuilderEnv() throws DockerException, assertThat(response, containsString("Successfully executed testrun.sh")); } + private String dockerfileBuild(InputStream tarInputStream) { + return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream)); + } - private String dockerfileBuild(File baseDir) { - - // Build image - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + private String dockerfileBuild(File baseDir) { + return execBuild(dockerClient.buildImageCmd(baseDir)); + } - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); + private String execBuild(BuildImageCmd buildImageCmd) { + // Build image + InputStream response = buildImageCmd.withNoCache().exec(); - String imageId = StringUtils.substringBetween(fullLog, - "Successfully built ", "\\n\"}").trim(); + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); - // Create container based on image - CreateContainerResponse container = dockerClient.createContainerCmd( - imageId).exec(); + String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + // Create container based on image + CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec(); - dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - // Log container - InputStream logResponse = logContainer(container - .getId()); + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(); - //assertThat(asString(logResponse), containsString(expectedText)); + // Log container + InputStream logResponse = logContainer(container.getId()); - return asString(logResponse); - } + //assertThat(asString(logResponse), containsString(expectedText)); + return asString(logResponse); + } private InputStream logContainer(String containerId) { return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec(); From 5ee09ba4ae06a90761c7027477cef433a4ca45ce Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 18:33:03 +0200 Subject: [PATCH 0201/1399] Fix issue #201 --- .../java/com/github/dockerjava/jaxrs/EventsCmdExec.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 78d26fead..32ab45f2a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -70,7 +70,11 @@ public Void call() throws Exception { InputStream inputStream = new WrappedResponseInputStream(response); JsonParser jp = JSON_FACTORY.createParser(inputStream); while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) { - eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); + try { + eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); + } catch(Exception e) { + eventCallback.onException(e); + } numEvents++; } } From 72a61dd7834367e99524e5a91a47397d8970b0d7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 18:33:29 +0200 Subject: [PATCH 0202/1399] Fix test expectation --- .../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java index dfc330d9e..7d4f9d4ef 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -42,7 +42,7 @@ public void pullCanBeStreamed() throws Exception { ) {; assertThat(reader.readItem(), allOf( - hasProperty("status", equalTo("Pulling repository busybox")), + hasProperty("status", equalTo("Pulling from busybox")), hasProperty("progress", nullValue()), hasProperty("progressDetail", nullValue()) ) From 355e649b66b5792bb8401fabf2b6743040ebf99d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 18:37:33 +0200 Subject: [PATCH 0203/1399] Call onCompletetion callback before close because of https://github.com/docker-java/docker-java/issues/196 --- .../dockerjava/jaxrs/EventsCmdExec.java | 148 ++++++++++-------- 1 file changed, 80 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 32ab45f2a..924fdaedd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -22,72 +22,84 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); - - public EventsCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected ExecutorService execute(EventsCmd command) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); - - WebTarget webResource = getBaseResource().path("/events") - .queryParam("since", command.getSince()) - .queryParam("until", command.getUntil()); - - LOGGER.trace("GET: {}", webResource); - EventNotifier eventNotifier = EventNotifier.create(command.getEventCallback(), webResource); - executorService.submit(eventNotifier); - return executorService; - } - - private static class EventNotifier implements Callable { - private static final JsonFactory JSON_FACTORY = new JsonFactory(); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - private final EventCallback eventCallback; - private final WebTarget webTarget; - - private EventNotifier(EventCallback eventCallback, WebTarget webTarget) { - this.eventCallback = eventCallback; - this.webTarget = webTarget; - } - - public static EventNotifier create(EventCallback eventCallback, WebTarget webTarget) { - checkNotNull(eventCallback, "An EventCallback must be provided"); - checkNotNull(webTarget, "An WebTarget must be provided"); - return new EventNotifier(eventCallback, webTarget); - } - - @Override - public Void call() throws Exception { - int numEvents=0; - Response response = null; - try { - response = webTarget.request().get(Response.class); - InputStream inputStream = new WrappedResponseInputStream(response); - JsonParser jp = JSON_FACTORY.createParser(inputStream); - while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) { - try { - eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); - } catch(Exception e) { - eventCallback.onException(e); - } - numEvents++; - } - } - catch(Exception e) { - eventCallback.onException(e); - } - finally { - if (response != null) { - response.close(); - } - } - eventCallback.onCompletion(numEvents); - return null; - } - } +public class EventsCmdExec extends + AbstrDockerCmdExec implements + EventsCmd.Exec { + private static final Logger LOGGER = LoggerFactory + .getLogger(EventsCmdExec.class); + + public EventsCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected ExecutorService execute(EventsCmd command) { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + WebTarget webResource = getBaseResource().path("/events") + .queryParam("since", command.getSince()) + .queryParam("until", command.getUntil()); + + LOGGER.trace("GET: {}", webResource); + EventNotifier eventNotifier = EventNotifier.create( + command.getEventCallback(), webResource); + executorService.submit(eventNotifier); + return executorService; + } + + private static class EventNotifier implements Callable { + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private final EventCallback eventCallback; + private final WebTarget webTarget; + + private EventNotifier(EventCallback eventCallback, WebTarget webTarget) { + this.eventCallback = eventCallback; + this.webTarget = webTarget; + } + + public static EventNotifier create(EventCallback eventCallback, + WebTarget webTarget) { + checkNotNull(eventCallback, "An EventCallback must be provided"); + checkNotNull(webTarget, "An WebTarget must be provided"); + return new EventNotifier(eventCallback, webTarget); + } + + @Override + public Void call() throws Exception { + int numEvents = 0; + Response response = null; + try { + response = webTarget.request().get(Response.class); + InputStream inputStream = new WrappedResponseInputStream( + response); + JsonParser jp = JSON_FACTORY.createParser(inputStream); + while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() + && eventCallback.isReceiving()) { + try { + eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, + Event.class)); + } catch (Exception e) { + eventCallback.onException(e); + } + numEvents++; + } + } catch (Exception e) { + eventCallback.onException(e); + } finally { + // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196 + try { + eventCallback.onCompletion(numEvents); + } catch (Exception e) { + eventCallback.onException(e); + } + if (response != null) { + response.close(); + } + } + + return null; + } + } } From 1d52a47266e78db5769b61bcd6e3612c655b8869 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 19:21:05 +0200 Subject: [PATCH 0204/1399] Fix issue #214 --- .../java/com/github/dockerjava/api/model/ContainerConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java index dcb1256b0..ce8c6b88f 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -64,7 +64,7 @@ public class ContainerConfig { private boolean networkDisabled = false; @JsonProperty("OnBuild") - private int[] onBuild; + private String[] onBuild; @JsonProperty("OpenStdin") private boolean stdinOpen = false; @@ -180,7 +180,7 @@ public String[] getEntrypoint() { return entrypoint; } - public int[] getOnBuild() { + public String[] getOnBuild() { return onBuild; } From 8652329036eeb5ac583584b27a04c4261aca7b8e Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 10 May 2015 19:22:32 +0200 Subject: [PATCH 0205/1399] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6fca225d..3d3cb24d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT --- +* [#213](https://github.com/docker-java/docker-java/pull/213) Add ulimit support * [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events * [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized * [#204] (https://github.com/docker-java/docker-java/pull/204) Added support to use the credentials from .dockercfg during build From 5e268e50343dfebf461b1e71dec8600881c9c3de Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 10 May 2015 19:23:04 +0200 Subject: [PATCH 0206/1399] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbafd8a6a..6516793d2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Java API client for [Docker](http://docs.docker.io/ "Docker") -Supports a subset of the Docker Client API v1.17, Docker Server version 1.5.0 +Supports a subset of the Docker Client API v1.18, Docker Server version 1.6.0 The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! From 9954713fbbae4828bc0aea3e154ca8a8b7dec810 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 20:07:36 +0200 Subject: [PATCH 0207/1399] Exclude from CircleCI integration tests --- .../dockerjava/core/command/CreateContainerCmdImplTest.java | 3 ++- .../github/dockerjava/core/command/EventStreamReaderITest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index c37f48484..c652f51d7 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.*; import com.github.dockerjava.client.AbstractDockerClientTest; + import org.testng.ITestResult; import org.testng.annotations.*; @@ -540,7 +541,7 @@ public void createContainerWithMacAddress() throws DockerException { "00:80:41:ae:fd:7e"); } - @Test + @Test(groups = "ignoreInCircleCi") public void createContainerWithULimits() throws DockerException { Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; diff --git a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java index 7d4f9d4ef..07bca25b5 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -33,7 +33,7 @@ public void tearDown() throws Exception { dockerClient.close(); } - @Test + @Test(groups = "ignoreInCircleCi") public void pullCanBeStreamed() throws Exception { try (EventStreamReader reader = new EventStreamReader<>( From ebcb85c15ba72278b3dae6c425e0804374767e9b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 20:09:54 +0200 Subject: [PATCH 0208/1399] Set new semver version --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6516793d2..9584fdcb6 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 1.2.1-SNAPSHOT + 1.3.0-SNAPSHOT ## Documentation diff --git a/pom.xml b/pom.xml index 1279f9c11..d9aa194da 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.2.1-SNAPSHOT + 1.3.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From 3a0e734148b6786c1fde4021fe1db6b3ba5cb8fe Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 20:52:29 +0200 Subject: [PATCH 0209/1399] [maven-release-plugin] prepare release docker-java-1.3.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d9aa194da..0b28d5dd6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.3.0-SNAPSHOT + 1.3.0 docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - HEAD + docker-java-1.3.0 From f4f8b5616c28688dbb97fa494df47b91b4738525 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 May 2015 20:52:32 +0200 Subject: [PATCH 0210/1399] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0b28d5dd6..f8eb34ced 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.3.0 + 1.3.1-SNAPSHOT docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - docker-java-1.3.0 + HEAD From 9daa3733233c2733fce2599ff884c1e091cb4993 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 10 May 2015 20:56:21 +0200 Subject: [PATCH 0211/1399] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d3cb24d7..ea3118178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Change Log === Latest SNAPSHOT --- + +v1.3.0 +--- * [#213](https://github.com/docker-java/docker-java/pull/213) Add ulimit support * [#208](https://github.com/docker-java/docker-java/pull/208) Added PullEventStreamItem and EventStreamReader to stream the reading of events * [#205](https://github.com/docker-java/docker-java/issues/205) Access mode of VolumesRW incorrectly deserialized From c5ba01b72951096a4c8088a96eedc1a4697da7cb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 10 May 2015 20:56:47 +0200 Subject: [PATCH 0212/1399] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9584fdcb6..4c77e896c 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 1.2.0 + 1.3.0 ### Latest SNAPSHOT version @@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 1.3.0-SNAPSHOT + 1.3.1-SNAPSHOT ## Documentation From e34638a9b38a29eca8242e0aaa910b09d9f019ec Mon Sep 17 00:00:00 2001 From: James Nord Date: Wed, 13 May 2015 10:52:45 +0100 Subject: [PATCH 0213/1399] Do not wait for another event before exiting. It the callback decideds it is no longer interested in receiving events whilst it handles either an event or an exception then it should not have to wait until the next event from Docker is received to exit the loop. This adds a check before the event is received and leaves the check after the event has received as the event may take a long time to come and the callback may have decided during that time that it wants to shutdown. --- .../java/com/github/dockerjava/jaxrs/EventsCmdExec.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 924fdaedd..db14ab21b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -75,8 +75,13 @@ public Void call() throws Exception { InputStream inputStream = new WrappedResponseInputStream( response); JsonParser jp = JSON_FACTORY.createParser(inputStream); - while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() - && eventCallback.isReceiving()) { + // The following condition looks strange but jp.nextToken() will block until there is an + // event from the docker server or the connection is terminated. + // therefore we want to check before getting an event (to prevent a blocking operation + // and after the event to make sure that the eventCallback is still interested in getting notified. + while (eventCallback.isReceiving() && + jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && + eventCallback.isReceiving()) { try { eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); From a9b92e383c600cafc03d24b811b7176cb7982ff3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 14 May 2015 19:57:01 +0200 Subject: [PATCH 0214/1399] Fix roundtrip test --- .../dockerjava/test/serdes/JSONTestHelper.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java index b465b2aac..b6a33b722 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -15,11 +15,15 @@ */ package com.github.dockerjava.test.serdes; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.command.CommandJSONSamples; + import java.io.IOException; import java.io.InputStream; + import org.apache.commons.io.IOUtils; + import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -101,10 +105,14 @@ public static TClass testRoundTrip(TClass item, Class asclass) throws IOException, AssertionError { ObjectMapper mapper = new ObjectMapper(); - String inputItemString = mapper.writeValueAsString(item); - TClass convertedItem = mapper.readValue(inputItemString, asclass); - String convertedItemString = mapper.writeValueAsString(convertedItem); - assertEquals(convertedItemString, inputItemString, "JSONs must be equal after the second roundtrip"); - return convertedItem; + String serialized1 = mapper.writeValueAsString(item); + JsonNode json1 = mapper.readTree(serialized1); + TClass deserialized1 = mapper.readValue(serialized1, asclass); + String serialized2 = mapper.writeValueAsString(deserialized1); + JsonNode json2 = mapper.readTree(serialized2); + TClass deserialized2 = mapper.readValue(serialized2, asclass); + + assertEquals(json2, json1, "JSONs must be equal after the second roundtrip"); + return deserialized2; } } From a072d62104d03d53cf2f9a41b95fd527fb6acbb9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 14 May 2015 20:58:49 +0200 Subject: [PATCH 0215/1399] Workaround for issue #196 --- .../jaxrs/DockerCmdExecFactoryImpl.java | 5 +- .../jaxrs/connector/ApacheConnector.java | 698 ++++++++++++++++++ .../ApacheConnectorClientResponse.java | 52 ++ .../connector/ApacheConnectorProvider.java | 151 ++++ .../dockerjava/jaxrs/connector/README.txt | 3 + .../core/command/EventsCmdImplTest.java | 34 +- 6 files changed, 939 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/README.txt diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index bc3afecad..3636bfd06 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -22,7 +22,9 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.apache.connector.ApacheClientProperties; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +// see https://github.com/docker-java/docker-java/issues/196 +import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; @@ -34,6 +36,7 @@ import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; import com.github.dockerjava.core.util.SelectiveLoggingFilter; + public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private static final Logger LOGGER = LoggerFactory diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java new file mode 100644 index 000000000..651db983d --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -0,0 +1,698 @@ +package com.github.dockerjava.jaxrs.connector; + +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2010-2014 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * http://glassfish.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ + + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.Closeable; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.core.Configuration; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; + +import org.glassfish.jersey.SslConfigurator; +import org.glassfish.jersey.apache.connector.ApacheClientProperties; +import org.glassfish.jersey.apache.connector.LocalizationMessages; +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.ClientRequest; +import org.glassfish.jersey.client.ClientResponse; +import org.glassfish.jersey.client.RequestEntityProcessing; +import org.glassfish.jersey.client.spi.AsyncConnectorCallback; +import org.glassfish.jersey.client.spi.Connector; +import org.glassfish.jersey.internal.util.PropertiesHelper; +import org.glassfish.jersey.message.internal.HeaderUtils; +import org.glassfish.jersey.message.internal.OutboundMessageContext; +import org.glassfish.jersey.message.internal.ReaderWriter; +import org.glassfish.jersey.message.internal.Statuses; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.AuthCache; +import org.apache.http.client.CookieStore; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.CookieSpecs; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.config.ConnectionConfig; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.HttpClientConnectionManager; +import org.apache.http.conn.ManagedHttpClientConnection; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.LayeredConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLContexts; +import org.apache.http.conn.ssl.X509HostnameVerifier; +import org.apache.http.entity.AbstractHttpEntity; +import org.apache.http.entity.BufferedHttpEntity; +import org.apache.http.entity.ContentLengthStrategy; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.impl.client.BasicCookieStore; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.DefaultManagedHttpClientConnection; +import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.impl.io.ChunkedOutputStream; +import org.apache.http.io.SessionOutputBuffer; +import org.apache.http.util.TextUtils; +import org.apache.http.util.VersionInfo; + +import jersey.repackaged.com.google.common.util.concurrent.MoreExecutors; + +/** + * A {@link Connector} that utilizes the Apache HTTP Client to send and receive + * HTTP request and responses. + *

+ * The following properties are only supported at construction of this class: + *

    + *
  • {@link ApacheClientProperties#CONNECTION_MANAGER}
  • + *
  • {@link ApacheClientProperties#REQUEST_CONFIG}
  • + *
  • {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
  • + *
  • {@link ApacheClientProperties#DISABLE_COOKIES}
  • + *
  • {@link ClientProperties#PROXY_URI}
  • + *
  • {@link ClientProperties#PROXY_USERNAME}
  • + *
  • {@link ClientProperties#PROXY_PASSWORD}
  • + *
  • {@link ClientProperties#REQUEST_ENTITY_PROCESSING} - default value is {@link RequestEntityProcessing#CHUNKED}
  • + *
  • {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
  • + *
  • {@link ApacheClientProperties#SSL_CONFIG}
  • + *
+ *

+ * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can + * be overridden by the {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the + * {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported by using default connection manager. If custom + * connection manager needs to be used then chunked encoding size can be set by providing a custom + * {@link org.apache.http.HttpClientConnection} (via custom {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) + * and overriding {@code createOutputStream} method. + *

+ *

+ * Using of authorization is dependent on the chunk encoding setting. If the entity + * buffering is enabled, the entity is buffered and authorization can be performed + * automatically in response to a 401 by sending the request again. When entity buffering + * is disabled (chunked encoding is used) then the property + * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must + * be set to {@code true}. + *

+ *

+ * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an + * entity is not read from the response then + * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called + * after processing the response to release connection-based resources. + *

+ *

+ * Client operations are thread safe, the HTTP connection may + * be shared between different threads. + *

+ *

+ * If a response entity is obtained that is an instance of {@link Closeable} + * then the instance MUST be closed after processing the entity to release + * connection-based resources. + *

+ *

+ * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE. + *

+ * + * @author jorgeluisw@mac.com + * @author Paul Sandoz (paul.sandoz at oracle.com) + * @author Pavel Bucek (pavel.bucek at oracle.com) + * @author Arul Dhesiaseelan (aruld at acm.org) + * @see ApacheClientProperties#CONNECTION_MANAGER + */ +@SuppressWarnings("deprecation") +class ApacheConnector implements Connector { + + private final static Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName()); + + private static final VersionInfo vi; + private static final String release; + + static { + vi = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); + release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE; + } + + private final CloseableHttpClient client; + private final CookieStore cookieStore; + private final boolean preemptiveBasicAuth; + private final RequestConfig requestConfig; + + /** + * Create the new Apache HTTP Client connector. + * + * @param config client configuration. + */ + ApacheConnector(Configuration config) { + Object reqConfig = null; + + if (config != null) { + final Object connectionManager = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER); + + if (connectionManager != null) { + if (!(connectionManager instanceof HttpClientConnectionManager)) { + LOGGER.log( + Level.WARNING, + LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.CONNECTION_MANAGER, + connectionManager.getClass().getName(), + HttpClientConnectionManager.class.getName()) + ); + } + } + + reqConfig = config.getProperties().get(ApacheClientProperties.REQUEST_CONFIG); + if (reqConfig != null) { + if (!(reqConfig instanceof RequestConfig)) { + LOGGER.log( + Level.WARNING, + LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.REQUEST_CONFIG, + reqConfig.getClass().getName(), + RequestConfig.class.getName()) + ); + reqConfig = null; + } + } + } + + final SSLContext sslContext = getSslContext(config); + final HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + + clientBuilder.setConnectionManager(getConnectionManager(config, sslContext)); + clientBuilder.setSslcontext(sslContext); + + final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); + + int connectTimeout = 0; + int socketTimeout = 0; + boolean ignoreCookies = false; + if (config != null) { + connectTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.CONNECT_TIMEOUT, 0); + socketTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.READ_TIMEOUT, 0); + ignoreCookies = PropertiesHelper.isProperty(config.getProperties(), ApacheClientProperties.DISABLE_COOKIES); + + final Object credentialsProvider = config.getProperty(ApacheClientProperties.CREDENTIALS_PROVIDER); + if (credentialsProvider != null && (credentialsProvider instanceof CredentialsProvider)) { + clientBuilder.setDefaultCredentialsProvider((CredentialsProvider) credentialsProvider); + } + + Object proxyUri; + proxyUri = config.getProperty(ClientProperties.PROXY_URI); + if (proxyUri != null) { + final URI u = getProxyUri(proxyUri); + final HttpHost proxy = new HttpHost(u.getHost(), u.getPort(), u.getScheme()); + String userName; + userName = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_USERNAME, String.class); + if (userName != null) { + String password; + password = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_PASSWORD, String.class); + + if (password != null) { + final CredentialsProvider credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(u.getHost(), u.getPort()), + new UsernamePasswordCredentials(userName, password) + ); + clientBuilder.setDefaultCredentialsProvider(credsProvider); + } + } + clientBuilder.setProxy(proxy); + } + + final Boolean preemptiveBasicAuthProperty = (Boolean) config.getProperties() + .get(ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION); + this.preemptiveBasicAuth = (preemptiveBasicAuthProperty != null) ? preemptiveBasicAuthProperty : false; + } else { + this.preemptiveBasicAuth = false; + } + + + if (reqConfig != null) { + RequestConfig.Builder reqConfigBuilder = RequestConfig.copy((RequestConfig) reqConfig); + if (connectTimeout > 0) { + reqConfigBuilder.setConnectTimeout(connectTimeout); + } + if (socketTimeout > 0) { + reqConfigBuilder.setSocketTimeout(socketTimeout); + } + if (ignoreCookies) { + reqConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES); + } + requestConfig = reqConfigBuilder.build(); + } else { + requestConfigBuilder.setConnectTimeout(connectTimeout); + requestConfigBuilder.setSocketTimeout(socketTimeout); + if (ignoreCookies) { + requestConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES); + } + requestConfig = requestConfigBuilder.build(); + } + + if (requestConfig.getCookieSpec() == null || !requestConfig.getCookieSpec().equals(CookieSpecs.IGNORE_COOKIES)) { + this.cookieStore = new BasicCookieStore(); + clientBuilder.setDefaultCookieStore(cookieStore); + } else { + this.cookieStore = null; + } + clientBuilder.setDefaultRequestConfig(requestConfig); + this.client = clientBuilder.build(); + } + + private SSLContext getSslContext(final Configuration config) { + final SslConfigurator sslConfigurator = ApacheClientProperties.getValue( + config.getProperties(), + ApacheClientProperties.SSL_CONFIG, + SslConfigurator.class); + + return sslConfigurator != null ? sslConfigurator.createSSLContext() : null; + } + + HttpClientConnectionManager getConnectionManager(final Configuration config, final SSLContext sslContext) { + final Object cmObject = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER); + + // Connection manager from configuration. + if (cmObject != null) { + if (cmObject instanceof HttpClientConnectionManager) { + return (HttpClientConnectionManager) cmObject; + } else { + LOGGER.log( + Level.WARNING, + LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.CONNECTION_MANAGER, + cmObject.getClass().getName(), + HttpClientConnectionManager.class.getName()) + ); + } + } + + // Create custom connection manager. + return createConnectionManager( + config, + sslContext, + null, + false); + } + + private HttpClientConnectionManager createConnectionManager( + final Configuration config, + final SSLContext sslContext, + X509HostnameVerifier hostnameVerifier, + final boolean useSystemProperties) { + + final String[] supportedProtocols = useSystemProperties ? split( + System.getProperty("https.protocols")) : null; + final String[] supportedCipherSuites = useSystemProperties ? split( + System.getProperty("https.cipherSuites")) : null; + + if (hostnameVerifier == null) { + hostnameVerifier = SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; + } + + final LayeredConnectionSocketFactory sslSocketFactory; + if (sslContext != null) { + sslSocketFactory = new SSLConnectionSocketFactory( + sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier); + } else { + if (useSystemProperties) { + sslSocketFactory = new SSLConnectionSocketFactory( + (SSLSocketFactory) SSLSocketFactory.getDefault(), + supportedProtocols, supportedCipherSuites, hostnameVerifier); + } else { + sslSocketFactory = new SSLConnectionSocketFactory( + SSLContexts.createDefault(), + hostnameVerifier); + } + } + + final Registry registry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", sslSocketFactory) + .build(); + + final Integer chunkSize = ClientProperties.getValue(config.getProperties(), + ClientProperties.CHUNKED_ENCODING_SIZE, 4096, Integer.class); + + final PoolingHttpClientConnectionManager connectionManager = + new PoolingHttpClientConnectionManager(registry, new ConnectionFactory(chunkSize)); + + if (useSystemProperties) { + String s = System.getProperty("http.keepAlive", "true"); + if ("true".equalsIgnoreCase(s)) { + s = System.getProperty("http.maxConnections", "5"); + final int max = Integer.parseInt(s); + connectionManager.setDefaultMaxPerRoute(max); + connectionManager.setMaxTotal(2 * max); + } + } + + return connectionManager; + } + + private static String[] split(final String s) { + if (TextUtils.isBlank(s)) { + return null; + } + return s.split(" *, *"); + } + + /** + * Get the {@link HttpClient}. + * + * @return the {@link HttpClient}. + */ + @SuppressWarnings("UnusedDeclaration") + public HttpClient getHttpClient() { + return client; + } + + /** + * Get the {@link CookieStore}. + * + * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to + * {@code true}. + */ + public CookieStore getCookieStore() { + return cookieStore; + } + + private static URI getProxyUri(final Object proxy) { + if (proxy instanceof URI) { + return (URI) proxy; + } else if (proxy instanceof String) { + return URI.create((String) proxy); + } else { + throw new ProcessingException(LocalizationMessages.WRONG_PROXY_URI_TYPE(ClientProperties.PROXY_URI)); + } + } + + @Override + public ClientResponse apply(final ClientRequest clientRequest) throws ProcessingException { + final HttpUriRequest request = getUriHttpRequest(clientRequest); + final Map clientHeadersSnapshot = writeOutBoundHeaders(clientRequest.getHeaders(), request); + + try { + final CloseableHttpResponse response; + final HttpClientContext context = HttpClientContext.create(); + if (preemptiveBasicAuth) { + final AuthCache authCache = new BasicAuthCache(); + final BasicScheme basicScheme = new BasicScheme(); + authCache.put(getHost(request), basicScheme); + context.setAuthCache(authCache); + } + response = client.execute(getHost(request), request, context); + HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(), + this.getClass().getName()); + + final Response.StatusType status = response.getStatusLine().getReasonPhrase() == null ? + Statuses.from(response.getStatusLine().getStatusCode()) : + Statuses.from(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase()); + + final ClientResponse responseContext = new ApacheConnectorClientResponse(status, clientRequest, response); + final List redirectLocations = context.getRedirectLocations(); + if (redirectLocations != null && !redirectLocations.isEmpty()) { + responseContext.setResolvedRequestUri(redirectLocations.get(redirectLocations.size() - 1)); + } + + final Header[] respHeaders = response.getAllHeaders(); + final MultivaluedMap headers = responseContext.getHeaders(); + for (final Header header : respHeaders) { + final String headerName = header.getName(); + List list = headers.get(headerName); + if (list == null) { + list = new ArrayList(); + } + list.add(header.getValue()); + headers.put(headerName, list); + } + + final HttpEntity entity = response.getEntity(); + + if (entity != null) { + if (headers.get(HttpHeaders.CONTENT_LENGTH) == null) { + headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(entity.getContentLength())); + } + + final Header contentEncoding = entity.getContentEncoding(); + if (headers.get(HttpHeaders.CONTENT_ENCODING) == null && contentEncoding != null) { + headers.add(HttpHeaders.CONTENT_ENCODING, contentEncoding.getValue()); + } + } + + + try { + responseContext.setEntityStream(new HttpClientResponseInputStream(response)); + } catch (final IOException e) { + LOGGER.log(Level.SEVERE, null, e); + } + + return responseContext; + } catch (final Exception e) { + throw new ProcessingException(e); + } + } + + @Override + public Future apply(final ClientRequest request, final AsyncConnectorCallback callback) { + return MoreExecutors.sameThreadExecutor().submit(new Runnable() { + @Override + public void run() { + try { + callback.response(apply(request)); + } catch (final ProcessingException ex) { + callback.failure(ex); + } catch (final Throwable t) { + callback.failure(t); + } + } + }); + } + + @Override + public String getName() { + return "Apache HttpClient " + release; + } + + @Override + public void close() { + try { + client.close(); + } catch (final IOException e) { + throw new ProcessingException(LocalizationMessages.FAILED_TO_STOP_CLIENT(), e); + } + } + + private HttpHost getHost(final HttpUriRequest request) { + return new HttpHost(request.getURI().getHost(), request.getURI().getPort(), request.getURI().getScheme()); + } + + private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) { + final Boolean redirectsEnabled = + clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, requestConfig.isRedirectsEnabled()); + final RequestConfig config = RequestConfig.copy(requestConfig).setRedirectsEnabled(redirectsEnabled).build(); + + final Boolean bufferingEnabled = clientRequest.resolveProperty(ClientProperties.REQUEST_ENTITY_PROCESSING, + RequestEntityProcessing.class) == RequestEntityProcessing.BUFFERED; + final HttpEntity entity = getHttpEntity(clientRequest, bufferingEnabled); + + return RequestBuilder + .create(clientRequest.getMethod()) + .setUri(clientRequest.getUri()) + .setConfig(config) + .setEntity(entity) + .build(); + } + + + private HttpEntity getHttpEntity(final ClientRequest clientRequest, final boolean bufferingEnabled) { + final Object entity = clientRequest.getEntity(); + + if (entity == null) { + return null; + } + + final AbstractHttpEntity httpEntity = new AbstractHttpEntity() { + @Override + public boolean isRepeatable() { + return false; + } + + @Override + public long getContentLength() { + return -1; + } + + @Override + public InputStream getContent() throws IOException, IllegalStateException { + if (bufferingEnabled) { + final ByteArrayOutputStream buffer = new ByteArrayOutputStream(512); + writeTo(buffer); + return new ByteArrayInputStream(buffer.toByteArray()); + } else { + return null; + } + } + + @Override + public void writeTo(final OutputStream outputStream) throws IOException { + clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() { + @Override + public OutputStream getOutputStream(final int contentLength) throws IOException { + return outputStream; + } + }); + clientRequest.writeEntity(); + } + + @Override + public boolean isStreaming() { + return false; + } + }; + + if (bufferingEnabled) { + try { + return new BufferedHttpEntity(httpEntity); + } catch (final IOException e) { + throw new ProcessingException(LocalizationMessages.ERROR_BUFFERING_ENTITY(), e); + } + } else { + return httpEntity; + } + } + + private static Map writeOutBoundHeaders(final MultivaluedMap headers, final HttpUriRequest request) { + Map stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers); + + for (Map.Entry e : stringHeaders.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + return stringHeaders; + } + + private static final class HttpClientResponseInputStream extends FilterInputStream { + + HttpClientResponseInputStream(final CloseableHttpResponse response) throws IOException { + super(getInputStream(response)); + } + + @Override + public void close() throws IOException { + super.close(); + } + } + + private static InputStream getInputStream(final CloseableHttpResponse response) throws IOException { + + if (response.getEntity() == null) { + return new ByteArrayInputStream(new byte[0]); + } else { + final InputStream i = response.getEntity().getContent(); + if (i.markSupported()) { + return i; + } + return new BufferedInputStream(i, ReaderWriter.BUFFER_SIZE); + } + } + + private static class ConnectionFactory extends ManagedHttpClientConnectionFactory { + + private static final AtomicLong COUNTER = new AtomicLong(); + + private final int chunkSize; + + private ConnectionFactory(final int chunkSize) { + this.chunkSize = chunkSize; + } + + @Override + public ManagedHttpClientConnection create(final HttpRoute route, final ConnectionConfig config) { + final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement()); + + return new HttpClientConnection(id, config.getBufferSize(), chunkSize); + } + } + + private static class HttpClientConnection extends DefaultManagedHttpClientConnection { + + private final int chunkSize; + + private HttpClientConnection(final String id, final int buffersize, final int chunkSize) { + super(id, buffersize); + + this.chunkSize = chunkSize; + } + + @Override + protected OutputStream createOutputStream(final long len, final SessionOutputBuffer outbuffer) { + if (len == ContentLengthStrategy.CHUNKED) { + return new ChunkedOutputStream(chunkSize, outbuffer); + } + return super.createOutputStream(len, outbuffer); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java new file mode 100644 index 000000000..7ba9d8abd --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.jaxrs.connector; + +import java.io.IOException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.StatusType; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.glassfish.jersey.client.ClientRequest; +import org.glassfish.jersey.client.ClientResponse; + +/** + * Fix for https://github.com/docker-java/docker-java/issues/196 + * + * https://java.net/jira/browse/JERSEY-2852 + * + * @author marcus + * + */ +public class ApacheConnectorClientResponse extends ClientResponse { + + private CloseableHttpResponse closeableHttpResponse; + + public ApacheConnectorClientResponse(ClientRequest requestContext, + Response response) { + super(requestContext, response); + } + + public ApacheConnectorClientResponse(StatusType status, + ClientRequest requestContext, CloseableHttpResponse closeableHttpResponse) { + super(status, requestContext); + this.closeableHttpResponse = closeableHttpResponse; + } + + public ApacheConnectorClientResponse(StatusType status, + ClientRequest requestContext) { + super(status, requestContext); + } + + @Override + public void close() { + try { + closeableHttpResponse.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + super.close(); + } + + + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java new file mode 100644 index 000000000..fbde136ff --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java @@ -0,0 +1,151 @@ +package com.github.dockerjava.jaxrs.connector; + +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * http://glassfish.java.net/public/CDDL+GPL_1_1.html + * or packager/legal/LICENSE.txt. See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at packager/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * Oracle designates this particular file as subject to the "Classpath" + * exception as provided by Oracle in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +import javax.ws.rs.client.Client; +import javax.ws.rs.core.Configurable; +import javax.ws.rs.core.Configuration; + +import org.glassfish.jersey.apache.connector.LocalizationMessages; +import org.glassfish.jersey.client.Initializable; +import org.glassfish.jersey.client.spi.Connector; +import org.glassfish.jersey.client.spi.ConnectorProvider; +import org.apache.http.client.HttpClient; + +/** + * Connector provider for Jersey {@link Connector connectors} that utilize + * Apache HTTP Client to send and receive HTTP request and responses. + *

+ * The following connector configuration properties are supported: + *

    + *
  • {@link ApacheClientProperties#CONNECTION_MANAGER}
  • + *
  • {@link ApacheClientProperties#REQUEST_CONFIG}
  • + *
  • {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
  • + *
  • {@link ApacheClientProperties#DISABLE_COOKIES}
  • + *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}
  • + *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}
  • + *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}
  • + *
  • {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} + * - default value is {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}
  • + *
  • {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
  • + *
  • {@link ApacheClientProperties#SSL_CONFIG}
  • + *
+ *

+ *

+ * Connector instances created via this connector provider use + * {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. + * This can be overridden by the {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}. + * By default the {@link org.glassfish.jersey.client.ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported + * when using the default {@code org.apache.http.conn.HttpClientConnectionManager} instance. If custom + * connection manager is used, then chunked encoding size can be set by providing a custom + * {@code org.apache.http.HttpClientConnection} (via custom {@code org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) + * and overriding it's {@code createOutputStream} method. + *

+ *

+ * Use of authorization by the AHC-based connectors is dependent on the chunk encoding setting. + * If the entity buffering is enabled, the entity is buffered and authorization can be performed + * automatically in response to a 401 by sending the request again. When entity buffering + * is disabled (chunked encoding is used) then the property + * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must + * be set to {@code true}. + *

+ *

+ * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then + * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release + * connection-based resources. + *

+ *

+ * If a response entity is obtained that is an instance of {@link java.io.Closeable} + * then the instance MUST be closed after processing the entity to release + * connection-based resources. + *

+ *

+ * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE. + *

+ * + * @author Pavel Bucek (pavel.bucek at oracle.com) + * @author Arul Dhesiaseelan (aruld at acm.org) + * @author jorgeluisw at mac.com + * @author Marek Potociar (marek.potociar at oracle.com) + * @author Paul Sandoz (paul.sandoz at oracle.com) + * @since 2.5 + */ +public class ApacheConnectorProvider implements ConnectorProvider { + + @Override + public Connector getConnector(Client client, Configuration runtimeConfig) { + return new ApacheConnector(runtimeConfig); + } + + /** + * Retrieve the underlying Apache {@link HttpClient} instance from + * {@link org.glassfish.jersey.client.JerseyClient} or {@link org.glassfish.jersey.client.JerseyWebTarget} + * configured to use {@code ApacheConnectorProvider}. + * + * @param component {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use + * {@code ApacheConnectorProvider}. + * @return underlying Apache {@code HttpClient} instance. + * + * @throws java.lang.IllegalArgumentException in case the {@code component} is neither {@code JerseyClient} + * nor {@code JerseyWebTarget} instance or in case the component + * is not configured to use a {@code ApacheConnectorProvider}. + * @since 2.8 + */ + public static HttpClient getHttpClient(Configurable component) { + if (!(component instanceof Initializable)) { + throw new IllegalArgumentException( + LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component.getClass().getName())); + } + + final Initializable initializable = (Initializable) component; + Connector connector = initializable.getConfiguration().getConnector(); + if (connector == null) { + initializable.preInitialize(); + connector = initializable.getConfiguration().getConnector(); + } + + if (connector instanceof ApacheConnector) { + return ((ApacheConnector) connector).getHttpClient(); + } + + throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED()); + } +} + diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt new file mode 100644 index 000000000..c3c1415f1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt @@ -0,0 +1,3 @@ +This package exists as a workaround to https://java.net/jira/browse/JERSEY-2852. +It introduces ApacheConnectorClientResponse which extends ClientResponse and closes +the underlying CloseableHttpResponse when close() is called. \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index f92949294..569283ce7 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -16,6 +16,8 @@ import java.io.IOException; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -66,17 +68,37 @@ public void testEventStreamTimeBound() throws InterruptedException, EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback) .withSince(startTime).withUntil(endTime); ExecutorService executorService = eventsCmd.exec(); - + boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); - + executorService.shutdown(); eventCallback.close(); + assertTrue(zeroCount, "" + eventCallback.getEvents()); + } + + @Test + public void testEventStreaming1() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); + + CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince( + getEpochTime()); + ExecutorService executorService = eventsCmd.exec(); + + generateEvents(); + + boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); + executorService.shutdown(); + eventCallback.close(); assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); } @Test - public void testEventStreaming() throws InterruptedException, IOException { + public void testEventStreaming2() throws InterruptedException, IOException { // Don't include other tests events TimeUnit.SECONDS.sleep(1); @@ -111,6 +133,7 @@ private int generateEvents() { private class EventCallbackTest implements EventCallback { private final CountDownLatch countDownLatch; private final AtomicBoolean isReceiving = new AtomicBoolean(true); + private final List events = new ArrayList(); public EventCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; @@ -124,6 +147,7 @@ public void close() { public void onEvent(Event event) { LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); countDownLatch.countDown(); + events.add(event); } @Override @@ -140,5 +164,9 @@ public void onCompletion(int numEvents) { public boolean isReceiving() { return isReceiving.get(); } + + public List getEvents() { + return new ArrayList(events); + } } } From 1ed6fbfe5ae6fd1ddd27e80375a3e94b56436de3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 15 May 2015 15:30:20 +0200 Subject: [PATCH 0216/1399] Warning comment on 'followStream' --- .../api/command/AttachContainerCmd.java | 26 ++++++++---- .../api/command/LogContainerCmd.java | 41 ++++++++++++------- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index abdec8f58..0fb72d452 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -2,6 +2,7 @@ import java.io.InputStream; +import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; /** @@ -20,7 +21,7 @@ * - true or false, if true, print timestamps for every log line. * Defaults to false. */ -public interface AttachContainerCmd extends DockerCmd{ +public interface AttachContainerCmd extends DockerCmd { public String getContainerId(); @@ -36,8 +37,17 @@ public interface AttachContainerCmd extends DockerCmd{ public AttachContainerCmd withContainerId(String containerId); + /** + * See {@link #withFollowStream(boolean)} + */ public AttachContainerCmd withFollowStream(); + /** + * Following the stream means the resulting {@link InputStream} returned by + * {@link #exec()} reads infinitely. So a {@link InputStream#read()} MAY + * BLOCK FOREVER as long as no data is streamed from the docker host to + * {@link DockerClient}! + */ public AttachContainerCmd withFollowStream(boolean followStream); public AttachContainerCmd withTimestamps(boolean timestamps); @@ -51,19 +61,21 @@ public interface AttachContainerCmd extends DockerCmd{ public AttachContainerCmd withStdErr(boolean stderr); public AttachContainerCmd withLogs(boolean logs); - + public AttachContainerCmd withLogs(); /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. + * Its the responsibility of the caller to consume and/or close the + * {@link InputStream} to prevent connection leaks. * - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ @Override public InputStream exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { + + public static interface Exec extends + DockerCmdExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index 05e108550..c966ef953 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -1,12 +1,13 @@ package com.github.dockerjava.api.command; +import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; import java.io.InputStream; /** * Get container logs - * + * * @param followStream * - true or false, return stream. Defaults to false. * @param stdout @@ -17,13 +18,15 @@ * - true or false, if true, print timestamps for every log line. * Defaults to false. * @param tail - * - `all` or ``, Output specified number of lines at the end of logs - * - * Consider wrapping any input stream you get with a frame reader to make reading frame easier. - * + * - `all` or ``, Output specified number of lines at the end + * of logs + * + * Consider wrapping any input stream you get with a frame reader to + * make reading frame easier. + * * @see com.github.dockerjava.core.command.FrameReader */ -public interface LogContainerCmd extends DockerCmd{ +public interface LogContainerCmd extends DockerCmd { public String getContainerId(); @@ -39,12 +42,21 @@ public interface LogContainerCmd extends DockerCmd{ public LogContainerCmd withContainerId(String containerId); + /** + * See {@link #withFollowStream(boolean)} + */ public LogContainerCmd withFollowStream(); + /** + * Following the stream means the resulting {@link InputStream} returned by + * {@link #exec()} reads infinitely. So a {@link InputStream#read()} MAY + * BLOCK FOREVER as long as no data is streamed from the docker host to + * {@link DockerClient}! + */ public LogContainerCmd withFollowStream(boolean followStream); public LogContainerCmd withTimestamps(); - + public LogContainerCmd withTimestamps(boolean timestamps); public LogContainerCmd withStdOut(); @@ -60,16 +72,17 @@ public interface LogContainerCmd extends DockerCmd{ public LogContainerCmd withTail(int tail); /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws NotFoundException No such container + * Its the responsibility of the caller to consume and/or close the + * {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container */ @Override public InputStream exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + public static interface Exec extends + DockerCmdExec { + } } \ No newline at end of file From 2df09cdca8bd41cb5be0b28e00fbd72632d4f33c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 15 May 2015 15:30:48 +0200 Subject: [PATCH 0217/1399] Make FrameReaderITest work again --- .../client/AbstractDockerClientTest.java | 8 +- .../core/command/DockerfileFixture.java | 15 +- .../core/command/FrameReaderITest.java | 163 ++++++++++-------- .../frameReaderDockerfile/Dockerfile | 4 +- 4 files changed, 106 insertions(+), 84 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 1e61b9a7d..802166a00 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -104,8 +104,12 @@ public void afterMethod(ITestResult result) { "################################## END OF {} ##################################\n", result.getName()); } + + protected String asString(InputStream response) { + return consumeAsString(response); + } - protected String asString(InputStream response) { + public static String consumeAsString(InputStream response) { StringWriter logwriter = new StringWriter(); @@ -116,7 +120,7 @@ protected String asString(InputStream response) { while (itr.hasNext()) { String line = itr.next(); logwriter.write(line + (itr.hasNext() ? "\n" : "")); - //LOG.info("line: "+line); + LOG.info("line: "+line); } response.close(); diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 840f63da4..53131c611 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -1,14 +1,20 @@ package com.github.dockerjava.core.command; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; + import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.client.AbstractDockerClientTest; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.io.InputStream; /** * Start and stop a single container for testing. @@ -29,11 +35,14 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { public void open() throws IOException { LOGGER.info("building {}", directory); - dockerClient + InputStream response = dockerClient .buildImageCmd(new File("src/test/resources", directory)) .withNoCache() // remove alternatives, cause problems - .exec() - .close(); + .exec(); + + String log = AbstractDockerClientTest.consumeAsString(response); + + assertThat(log, containsString("Successfully built")); Image lastCreatedImage = dockerClient .listImagesCmd() diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 0c22fc085..24c833559 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -1,86 +1,97 @@ package com.github.dockerjava.core.command; +import static org.testng.Assert.assertEquals; +import static org.testng.AssertJUnit.assertNull; + +import java.io.IOException; +import java.io.InputStream; -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.StreamType; -import com.github.dockerjava.core.DockerClientBuilder; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import java.io.IOException; -import java.io.InputStream; - -import static org.testng.Assert.assertEquals; -import static org.testng.AssertJUnit.assertNull; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; +import com.github.dockerjava.core.DockerClientBuilder; @Test(groups = "integration") -public class FrameReaderITest { - - private DockerClient dockerClient; - private DockerfileFixture dockerfileFixture; - - @BeforeTest - public void beforeTest() throws Exception { - dockerClient = DockerClientBuilder.getInstance().build(); - dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); - dockerfileFixture.open(); - } - - @AfterTest - public void deleteDockerContainerImage() throws Exception { - dockerfileFixture.close(); - dockerClient.close(); - } - - @Test - public void canCloseFrameReaderAndReadExpectedLines() throws Exception { - - try (FrameReader reader = new FrameReader(getLoggerStream())) { - assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, "to stdout\n".getBytes())); - assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, "to stderr\n".getBytes())); - assertNull(reader.readFrame()); - } - } - - private InputStream getLoggerStream() { - return dockerClient - .logContainerCmd(dockerfileFixture.getContainerId()) - .withStdOut() - .withStdErr() - .withTailAll() - .withTail(10) - .withFollowStream() - .exec(); - } - - @Test - public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception { - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - try (FrameReader reader = new FrameReader(getLoggerStream())) { - //noinspection StatementWithEmptyBody - while (reader.readFrame() != null) { - // nop - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }); - - thread.start(); - - try (DockerfileFixture busyboxDockerfile = new DockerfileFixture(dockerClient, "busyboxDockerfile")) { - busyboxDockerfile.open(); - } - - thread.join(); - - } +public class FrameReaderITest { + + private DockerClient dockerClient; + private DockerfileFixture dockerfileFixture; + + @BeforeTest + public void beforeTest() throws Exception { + dockerClient = DockerClientBuilder.getInstance().build(); + dockerfileFixture = new DockerfileFixture(dockerClient, + "frameReaderDockerfile"); + dockerfileFixture.open(); + } + + @AfterTest + public void deleteDockerContainerImage() throws Exception { + dockerfileFixture.close(); + dockerClient.close(); + } + + @Test + public void canCloseFrameReaderAndReadExpectedLines() throws Exception { + + // wait for the container to be successfully executed + int exitCode = dockerClient.waitContainerCmd( + dockerfileFixture.getContainerId()).exec(); + assertEquals(0, exitCode); + + InputStream response = getLoggerStream(); + + try (FrameReader reader = new FrameReader(response)) { + assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, + "to stdout\n".getBytes())); + assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, + "to stderr\n".getBytes())); + assertNull(reader.readFrame()); + } + } + + private InputStream getLoggerStream() { + + return dockerClient.logContainerCmd(dockerfileFixture.getContainerId()) + .withStdOut() + .withStdErr() + .withTailAll() + // we can't follow stream here as it blocks reading from resulting InputStream infinitely + //.withFollowStream() + .exec(); + } + + @Test + public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception { + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + try (FrameReader reader = new FrameReader(getLoggerStream())) { + // noinspection StatementWithEmptyBody + while (reader.readFrame() != null) { + // nop + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }); + + thread.start(); + + try (DockerfileFixture busyboxDockerfile = new DockerfileFixture( + dockerClient, "busyboxDockerfile")) { + busyboxDockerfile.open(); + } + + thread.join(); + + } } diff --git a/src/test/resources/frameReaderDockerfile/Dockerfile b/src/test/resources/frameReaderDockerfile/Dockerfile index 8d9b553e1..9aa6b9847 100644 --- a/src/test/resources/frameReaderDockerfile/Dockerfile +++ b/src/test/resources/frameReaderDockerfile/Dockerfile @@ -3,11 +3,9 @@ FROM busybox:latest # log to stdout and stderr so we can make sure logging with FrameReader works RUN echo '#! /bin/sh' > cmd.sh -RUN echo 'sleep 1' >> cmd.sh RUN echo 'echo "to stdout"' >> cmd.sh RUN echo 'echo "to stderr" > /dev/stderr' >> cmd.sh -# block for ever -RUN echo 'cat' >> cmd.sh +RUN echo 'sleep 1' >> cmd.sh RUN chmod +x cmd.sh CMD ["./cmd.sh"] \ No newline at end of file From 02e8cc1aaa448db064c3d9aa4d8e0b0af9415495 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 17 May 2015 20:55:28 +0200 Subject: [PATCH 0218/1399] Refactor streaming API --- .../github/dockerjava/api/DockerClient.java | 3 +- .../dockerjava/api/command/EventCallback.java | 13 --- .../dockerjava/api/command/EventsCmd.java | 20 +++- .../api/stream/ObjectStreamCallback.java | 18 ++++ .../dockerjava/core/DockerClientImpl.java | 3 +- .../core/command/EventsCmdImpl.java | 21 ++-- .../dockerjava/jaxrs/EventsCmdExec.java | 79 +++++---------- .../dockerjava/jaxrs/util/Streaming.java | 52 ++++++++++ .../util/WrappedResponseInputStream.java | 2 +- .../core/command/EventsCmdImplTest.java | 95 +++++++++++-------- 10 files changed, 174 insertions(+), 132 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/api/command/EventCallback.java create mode 100644 src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 9e275eb35..1cd3e0760 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -3,6 +3,7 @@ import java.io.*; import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; @@ -112,7 +113,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public UnpauseContainerCmd unpauseContainerCmd(String containerId); - public EventsCmd eventsCmd(EventCallback eventCallback); + public EventsCmd eventsCmd(EventStreamCallback eventCallback); @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/EventCallback.java b/src/main/java/com/github/dockerjava/api/command/EventCallback.java deleted file mode 100644 index 18b8669ea..000000000 --- a/src/main/java/com/github/dockerjava/api/command/EventCallback.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.dockerjava.api.command; - -import com.github.dockerjava.api.model.Event; - -/** - * Event callback - */ -public interface EventCallback { - public void onEvent(Event event); - public void onException(Throwable throwable); - public void onCompletion(int numEvents); - public boolean isReceiving(); -} diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index cfdb23a64..c3016a7ff 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; -import java.util.concurrent.ExecutorService; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.stream.ObjectStreamCallback; /** @@ -9,7 +10,7 @@ * @param since - Show all events created since timestamp * @param until - Stream events until this timestamp */ -public interface EventsCmd extends DockerCmd { +public interface EventsCmd extends DockerCmd { public EventsCmd withSince(String since); public EventsCmd withUntil(String until); @@ -18,10 +19,19 @@ public interface EventsCmd extends DockerCmd { public String getUntil(); - public EventCallback getEventCallback(); + public EventStreamCallback getEventCallback(); - public EventsCmd withEventCallback(EventCallback eventCallback); + public EventsCmd withEventCallback(EventStreamCallback eventCallback); - public static interface Exec extends DockerCmdExec { + public static interface Exec extends DockerCmdExec { } + + /** + * {@link Event} stream callback + */ + public interface EventStreamCallback extends ObjectStreamCallback{ + + + } + } diff --git a/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java b/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java new file mode 100644 index 000000000..c636c06cf --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/stream/ObjectStreamCallback.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.stream; + +import java.io.Closeable; + +/** + * Object stream callback + */ +public interface ObjectStreamCallback { + /** Called when the stream starts. The passed {@link Closeable} can be used to close/interrupt the stream */ + void streamStarted(Closeable stream); + /** Called when a stream event occurs */ + void onStream(T object); + /** Called when an exception occurs while processing the stream */ + void onError(Throwable throwable); + /** Called when streaming was finished either by reaching the end of the stream or by aborting it */ + void streamFinished(); + +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 7e96225f8..599db377a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -9,6 +9,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.Identifier; @@ -342,7 +343,7 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) { } @Override - public EventsCmd eventsCmd(EventCallback eventCallback) { + public EventsCmd eventsCmd(EventStreamCallback eventCallback) { return new EventsCmdImpl(getDockerCmdExecFactory() .createEventsCmdExec(), eventCallback); } diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index ac55de714..07180bdf9 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -1,20 +1,17 @@ package com.github.dockerjava.core.command; -import java.util.concurrent.ExecutorService; - -import com.github.dockerjava.api.command.EventCallback; import com.github.dockerjava.api.command.EventsCmd; /** * Stream docker events */ -public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd { +public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd { private String since; private String until; - private EventCallback eventCallback; + private EventStreamCallback eventCallback; - public EventsCmdImpl(EventsCmd.Exec exec, EventCallback eventCallback) { + public EventsCmdImpl(EventsCmd.Exec exec, EventStreamCallback eventCallback) { super(exec); withEventCallback(eventCallback); } @@ -32,7 +29,7 @@ public EventsCmd withUntil(String until) { } @Override - public EventsCmd withEventCallback(EventCallback eventCallback) { + public EventsCmd withEventCallback(EventStreamCallback eventCallback) { this.eventCallback = eventCallback; return this; } @@ -48,14 +45,14 @@ public String getUntil() { } @Override - public EventCallback getEventCallback() { + public EventStreamCallback getEventCallback() { return eventCallback; } - @Override - public ExecutorService exec() { - return super.exec(); - } +// @Override +// public InputStream exec() { +// return super.exec(); +// } @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index db14ab21b..37c048fa1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -2,7 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.InputStream; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -13,18 +12,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.command.EventCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import com.github.dockerjava.jaxrs.util.Streaming; -public class EventsCmdExec extends - AbstrDockerCmdExec implements - EventsCmd.Exec { +public class EventsCmdExec extends AbstrDockerCmdExec + implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory .getLogger(EventsCmdExec.class); @@ -33,33 +26,35 @@ public EventsCmdExec(WebTarget baseResource) { } @Override - protected ExecutorService execute(EventsCmd command) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); + protected Void execute(EventsCmd command) { + - WebTarget webResource = getBaseResource().path("/events") + WebTarget webTarget = getBaseResource().path("/events") .queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); - LOGGER.trace("GET: {}", webResource); + LOGGER.trace("GET: {}", webTarget); + ExecutorService executorService = Executors.newSingleThreadExecutor(); EventNotifier eventNotifier = EventNotifier.create( - command.getEventCallback(), webResource); + command.getEventCallback(), webTarget); executorService.submit(eventNotifier); - return executorService; + executorService.shutdown(); + + return null; } private static class EventNotifier implements Callable { - private static final JsonFactory JSON_FACTORY = new JsonFactory(); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private final EventCallback eventCallback; + private final EventsCmd.EventStreamCallback eventCallback; private final WebTarget webTarget; - private EventNotifier(EventCallback eventCallback, WebTarget webTarget) { + private EventNotifier(EventsCmd.EventStreamCallback eventCallback, + WebTarget webTarget) { this.eventCallback = eventCallback; this.webTarget = webTarget; } - public static EventNotifier create(EventCallback eventCallback, + public static EventNotifier create(EventsCmd.EventStreamCallback eventCallback, WebTarget webTarget) { checkNotNull(eventCallback, "An EventCallback must be provided"); checkNotNull(webTarget, "An WebTarget must be provided"); @@ -68,43 +63,13 @@ public static EventNotifier create(EventCallback eventCallback, @Override public Void call() throws Exception { - int numEvents = 0; - Response response = null; - try { - response = webTarget.request().get(Response.class); - InputStream inputStream = new WrappedResponseInputStream( - response); - JsonParser jp = JSON_FACTORY.createParser(inputStream); - // The following condition looks strange but jp.nextToken() will block until there is an - // event from the docker server or the connection is terminated. - // therefore we want to check before getting an event (to prevent a blocking operation - // and after the event to make sure that the eventCallback is still interested in getting notified. - while (eventCallback.isReceiving() && - jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && - eventCallback.isReceiving()) { - try { - eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, - Event.class)); - } catch (Exception e) { - eventCallback.onException(e); - } - numEvents++; - } - } catch (Exception e) { - eventCallback.onException(e); - } finally { - // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196 - try { - eventCallback.onCompletion(numEvents); - } catch (Exception e) { - eventCallback.onException(e); - } - if (response != null) { - response.close(); - } - } - + Response response = webTarget.request().get(Response.class); + + Streaming.processJsonStream(response, eventCallback, Event.class); + return null; } } + + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java new file mode 100644 index 000000000..5f68ab09b --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.jaxrs.util; + +import java.io.IOException; +import java.io.InputStream; + +import javax.ws.rs.core.Response; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.stream.ObjectStreamCallback; + +public class Streaming { + + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + public static void processJsonStream(Response response, + ObjectStreamCallback objectStreamCallback, Class clazz) { + + InputStream inputStream = new WrappedResponseInputStream( + response); + + objectStreamCallback.streamStarted(inputStream); + + try { + JsonParser jp = JSON_FACTORY.createParser(inputStream); + while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) { + try { + objectStreamCallback.onStream(OBJECT_MAPPER.readValue(jp, + clazz)); + } catch (Exception e) { + objectStreamCallback.onError(e); + } + } + } catch (Throwable t) { + objectStreamCallback.onError(t); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + objectStreamCallback.onError(e); + } finally { + objectStreamCallback.streamFinished(); + } + } + } + + + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java index bf40dbfc0..752ff3423 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -8,7 +8,7 @@ /** * This is a wrapper around {@link Response} that acts as a {@link InputStream}. * When this {@link WrappedResponseInputStream} is closed it closes the - * underlying {@link Response} object also to prevent connection leaks. + * underlying {@link Response} object also to prevent blocking/hanging connections. * * @author marcus */ diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index 569283ce7..ab3e5c30b 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -1,11 +1,12 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.EventCallback; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.client.AbstractDockerClientTest; +import java.io.Closeable; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -14,14 +15,11 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { @@ -65,54 +63,60 @@ public void testEventStreamTimeBound() throws InterruptedException, CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback) - .withSince(startTime).withUntil(endTime); - ExecutorService executorService = eventsCmd.exec(); + dockerClient.eventsCmd(eventCallback) + .withSince(startTime) + .withUntil(endTime) + .exec(); boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); - executorService.shutdown(); eventCallback.close(); + + LOG.debug("events: " + eventCallback.getEvents()); assertTrue(zeroCount, "" + eventCallback.getEvents()); } @Test - public void testEventStreaming1() throws InterruptedException, IOException { + public void testEventStreamingUnbound() throws InterruptedException, IOException { // Don't include other tests events TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince( - getEpochTime()); - ExecutorService executorService = eventsCmd.exec(); + dockerClient.eventsCmd(eventCallback) + .withSince(getEpochTime()) + .exec(); generateEvents(); boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); - executorService.shutdown(); + + System.out.println("close callback"); + eventCallback.close(); assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); + + assertTrue(eventCallback.getErrors().isEmpty(), "At least on Exception was thrown: " + eventCallback.getErrors()); } @Test - public void testEventStreaming2() throws InterruptedException, IOException { + public void testEventStreamingUnbound2() throws InterruptedException, IOException { // Don't include other tests events TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince( - getEpochTime()); - ExecutorService executorService = eventsCmd.exec(); + dockerClient.eventsCmd(eventCallback) + .withSince(getEpochTime()) + .exec(); generateEvents(); boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); - executorService.shutdown(); + eventCallback.close(); assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); } @@ -130,43 +134,50 @@ private int generateEvents() { return KNOWN_NUM_EVENTS; } - private class EventCallbackTest implements EventCallback { + private class EventCallbackTest implements EventStreamCallback, Closeable { private final CountDownLatch countDownLatch; - private final AtomicBoolean isReceiving = new AtomicBoolean(true); private final List events = new ArrayList(); + private final List errors = new ArrayList(); + private Closeable closeable; public EventCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } - public void close() { - isReceiving.set(false); + @Override + public void close() throws IOException { + closeable.close(); + } + + @Override + public void streamStarted(Closeable closeable) { + this.closeable = closeable; } @Override - public void onEvent(Event event) { + public void onStream(Event event) { LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); countDownLatch.countDown(); events.add(event); } @Override - public void onException(Throwable throwable) { + public void onError(Throwable throwable) { LOG.error("Error occurred: {}", throwable.getMessage()); + errors.add(throwable); } - - @Override - public void onCompletion(int numEvents) { - LOG.info("Number of events received: {}", numEvents); - } - + @Override - public boolean isReceiving() { - return isReceiving.get(); + public void streamFinished() { + LOG.info("Event stream finished"); } public List getEvents() { return new ArrayList(events); } + + public List getErrors() { + return errors; + } } } From bff4291ebb6ce99e1132199876af77208956c60d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 22 May 2015 23:29:43 +0200 Subject: [PATCH 0219/1399] Added test for starting container with auto assigned port binding --- .../command/StartContainerCmdImplTest.java | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 9a3071653..045c008e1 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -65,8 +65,7 @@ public void startContainerWithVolumes() throws DockerException { Volume volume2 = new Volume("/opt/webapp2"); CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withVolumes(volume1, volume2) + .createContainerCmd("busybox").withVolumes(volume1, volume2) .withCmd("true").exec(); LOG.info("Created container {}", container.toString()); @@ -91,8 +90,10 @@ public void startContainerWithVolumes() throws DockerException { assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); - assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2))); + assertThat( + Arrays.asList(inspectContainerResponse.getVolumesRW()), + contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW( + volume2))); } @@ -224,6 +225,41 @@ public void startContainerWithPortBindings() throws DockerException { } + @Test + public void startContainerWithRandomPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(null)); + portBindings.bind(tcp23, Ports.Binding(null)); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings) + .withPublishAllPorts(true).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient + .inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig() + .getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getNetworkSettings().getPorts() + .getBindings().get(tcp22)[0].getHostPort(), is(notNullValue())); + + assertThat(inspectContainerResponse.getNetworkSettings().getPorts() + .getBindings().get(tcp23)[0], is(notNullValue())); + + } + @Test public void startContainerWithConflictingPortBindings() throws DockerException { @@ -303,8 +339,9 @@ public void startContainerWithLinkingDeprecated() throws DockerException { is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat( + inspectContainerResponse2.getHostConfig().getLinks(), + equalTo(new Link[] { new Link("container1", "container1Link") })); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); @@ -313,8 +350,7 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); } - - + @Test public void startContainerWithLinking() throws DockerException { @@ -348,14 +384,12 @@ public void startContainerWithLinking() throws DockerException { CreateContainerResponse container2 = dockerClient .createContainerCmd("busybox").withCmd("sleep", "9999") .withName("container2") - .withLinks(new Link("container1", "container1Link")) - .exec(); + .withLinks(new Link("container1", "container1Link")).exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container2.getId()) - .exec(); + dockerClient.startContainerCmd(container2.getId()).exec(); InspectContainerResponse inspectContainerResponse2 = dockerClient .inspectContainerCmd(container2.getId()).exec(); @@ -367,8 +401,9 @@ public void startContainerWithLinking() throws DockerException { is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat( + inspectContainerResponse2.getHostConfig().getLinks(), + equalTo(new Link[] { new Link("container1", "container1Link") })); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); @@ -512,8 +547,7 @@ public void startContainerWithExtraHosts() throws DockerException { assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()) - .withExtraHosts("dockerhost:127.0.0.1") - .exec(); + .withExtraHosts("dockerhost:127.0.0.1").exec(); InspectContainerResponse inspectContainerResponse = dockerClient .inspectContainerCmd(container.getId()).exec(); From dac0be3c89039667ea3149bfb2fde46c34d619df Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 28 May 2015 23:16:36 +0200 Subject: [PATCH 0220/1399] Modify stats implementation according to events command --- .../dockerjava/jaxrs/EventsCmdExec.java | 9 ++-- .../github/dockerjava/jaxrs/StatsCmdExec.java | 47 ++++++++++++------- .../core/command/StatsCmdImplTest.java | 8 ++-- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index db14ab21b..a601ea90c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -79,7 +79,7 @@ public Void call() throws Exception { // event from the docker server or the connection is terminated. // therefore we want to check before getting an event (to prevent a blocking operation // and after the event to make sure that the eventCallback is still interested in getting notified. - while (eventCallback.isReceiving() && + while (eventCallback.isReceiving() && jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && eventCallback.isReceiving()) { try { @@ -93,15 +93,14 @@ public Void call() throws Exception { } catch (Exception e) { eventCallback.onException(e); } finally { - // call onCompletion before close because of https://github.com/docker-java/docker-java/issues/196 + if (response != null) { + response.close(); + } try { eventCallback.onCompletion(numEvents); } catch (Exception e) { eventCallback.onException(e); } - if (response != null) { - response.close(); - } } return null; diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java index 97b9a2754..c0c6f36c1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -24,7 +24,7 @@ public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); - + public StatsCmdExec(WebTarget baseResource) { super(baseResource); } @@ -32,7 +32,7 @@ public StatsCmdExec(WebTarget baseResource) { @Override protected ExecutorService execute(StatsCmd command) { ExecutorService executorService = Executors.newSingleThreadExecutor(); - + WebTarget webResource = getBaseResource().path("/containers/{id}/stats") .resolveTemplate("id", command.getContainerId()); @@ -41,7 +41,7 @@ protected ExecutorService execute(StatsCmd command) { executorService.submit(eventNotifier); return executorService; } - + private static class StatsNotifier implements Callable { private static final JsonFactory JSON_FACTORY = new JsonFactory(); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @@ -62,29 +62,42 @@ public static StatsNotifier create(StatsCallback statsCallback, WebTarget webTar @Override public Void call() throws Exception { - int numStats=0; + int numEvents = 0; Response response = null; try { response = webTarget.request().get(Response.class); - InputStream inputStream = new WrappedResponseInputStream(response); + InputStream inputStream = new WrappedResponseInputStream( + response); JsonParser jp = JSON_FACTORY.createParser(inputStream); - while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && statsCallback.isReceiving()) { - statsCallback.onStats(OBJECT_MAPPER.readValue(jp, Statistics.class)); - numStats++; + // The following condition looks strange but jp.nextToken() will block until there is an + // event from the docker server or the connection is terminated. + // therefore we want to check before getting an event (to prevent a blocking operation + // and after the event to make sure that the eventCallback is still interested in getting notified. + while (statsCallback.isReceiving() && + jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() && + statsCallback.isReceiving()) { + try { + statsCallback.onStats(OBJECT_MAPPER.readValue(jp, + Statistics.class)); + } catch (Exception e) { + statsCallback.onException(e); + } + numEvents++; } - statsCallback.onCompletion(numStats); - LOGGER.info("Finished collecting stats"); - return null ; - } - catch(Throwable t) { - statsCallback.onException(t); - } - finally { + } catch (Exception e) { + statsCallback.onException(e); + } finally { if (response != null) { response.close(); } + try { + statsCallback.onCompletion(numEvents); + } catch (Exception e) { + statsCallback.onException(e); + } } - return null ; + + return null; } } } diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index c5e575373..1e6baffd2 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -57,7 +57,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS); StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch); - + String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient @@ -74,7 +74,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { countDownLatch.await(3, TimeUnit.SECONDS); boolean gotStats = statsCallback.gotStats(); - + LOG.info("Stop stats collection"); executorService.shutdown(); statsCallback.close(); @@ -82,7 +82,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { LOG.info("Stopping container"); dockerClient.stopContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); - + LOG.info("Completed test"); assertTrue(gotStats, "Expected true"); @@ -125,7 +125,7 @@ public void onCompletion(int numStats) { public boolean isReceiving() { return isReceiving.get(); } - + public boolean gotStats() { return gotStats; } From 4bec0ec31eec8eedcf8b82cfbc7aa389772a32ff Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 28 May 2015 23:20:02 +0200 Subject: [PATCH 0221/1399] Fix test setup --- .../dockerjava/client/AbstractDockerClientTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 80c22cd69..373680471 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -39,7 +39,7 @@ public abstract class AbstractDockerClientTest extends Assert { protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory(DockerClientBuilder.getDefaultDockerCmdExecFactory()); public void beforeTest() { - + LOG.info("======================= BEFORETEST ======================="); LOG.info("Connecting to Docker server"); dockerClient = DockerClientBuilder.getInstance(config()) @@ -60,7 +60,7 @@ private DockerClientConfig config() { protected DockerClientConfig config(String password) { DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() - .withServerAddress("https://index.docker.io/v1/").withMaxTotalConnections(5).withMaxPerRouteConnections(5); + .withServerAddress("https://index.docker.io/v1/"); if (password!=null) { builder = builder.withPassword(password); } @@ -104,7 +104,7 @@ public void afterMethod(ITestResult result) { "################################## END OF {} ##################################\n", result.getName()); } - + protected String asString(InputStream response) { return consumeAsString(response); } @@ -123,7 +123,7 @@ public static String consumeAsString(InputStream response) { LOG.info("line: "+line); } response.close(); - + return logwriter.toString(); } catch (IOException e) { throw new RuntimeException(e); @@ -175,11 +175,11 @@ public static boolean available(int port) { * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) * has {@link VolumeBind}s for the given {@link Volume}s */ - public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, + public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, Volume ... expectedVolumes) { VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds)); - + List volumes = new ArrayList(); for (VolumeBind bind : volumeBinds) { volumes.add(new Volume(bind.getContainerPath())); From 679cb8d8691857317dfd323e85e9920e32709a11 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 28 May 2015 23:34:44 +0200 Subject: [PATCH 0222/1399] Ignore with CirecleCI --- .../com/github/dockerjava/core/command/StatsCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index 1e6baffd2..b82f2f75c 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -51,7 +51,7 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } - @Test + @Test(groups = "ignoreInCircleCi") public void testStatsStreaming() throws InterruptedException, IOException { TimeUnit.SECONDS.sleep(1); From 16c17767051b7aba2dbb22ecd7e5e483ae43447d Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 29 May 2015 06:50:20 +0200 Subject: [PATCH 0223/1399] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c77e896c..7948c6776 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Java API client for [Docker](http://docs.docker.io/ "Docker") -Supports a subset of the Docker Client API v1.18, Docker Server version 1.6.0 +Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/sources/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! From ad50bfdfb50f82bc4c2fb62dcc7d07857e5de3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Spasi=C4=87?= Date: Fri, 29 May 2015 15:43:28 +0200 Subject: [PATCH 0224/1399] Labels are array of Strings (fixes #232) --- src/main/java/com/github/dockerjava/api/model/Info.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Info.java b/src/main/java/com/github/dockerjava/api/model/Info.java index fb63f2ff0..bf96b9fc1 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -60,7 +60,7 @@ public class Info { private String kernelVersion; @JsonProperty("Labels") - private String Labels; + private String[] Labels; @JsonProperty("MemoryLimit") private boolean memoryLimit; @@ -140,7 +140,7 @@ public String getKernelVersion() { return kernelVersion; } - public String getLabels() { + public String[] getLabels() { return Labels; } From cdb2d5f5637ca4fac0ea3762372576a91673703d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 29 May 2015 21:46:59 +0200 Subject: [PATCH 0225/1399] Modify test timing --- .../core/command/EventsCmdImplTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index 569283ce7..46600a160 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -68,13 +68,13 @@ public void testEventStreamTimeBound() throws InterruptedException, EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback) .withSince(startTime).withUntil(endTime); ExecutorService executorService = eventsCmd.exec(); - - boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); - + + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + executorService.shutdown(); eventCallback.close(); - assertTrue(zeroCount, "" + eventCallback.getEvents()); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); } @Test @@ -91,10 +91,10 @@ public void testEventStreaming1() throws InterruptedException, IOException { generateEvents(); - boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); executorService.shutdown(); eventCallback.close(); - assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); } @Test @@ -111,10 +111,10 @@ public void testEventStreaming2() throws InterruptedException, IOException { generateEvents(); - boolean zeroCount = countDownLatch.await(5, TimeUnit.SECONDS); + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); executorService.shutdown(); eventCallback.close(); - assertTrue(zeroCount, "Expected 4 events, [create, start, die, stop]"); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); } /** From 3923cd1ce0182ae0284ba5d3770451e3363ca1b5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 29 May 2015 22:03:29 +0200 Subject: [PATCH 0226/1399] Debug log connection pool --- pom.xml | 17 ++++++++++++----- src/test/resources/logback.xml | 2 ++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f8eb34ced..ee80a9c9e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 @@ -84,7 +85,7 @@ ${jackson-jaxrs.version} - org.glassfish.jersey.connectors + org.glassfish.jersey.connectors jersey-apache-connector ${jersey.version} @@ -100,8 +101,8 @@ de.gesellix - unix-socket-factory - ${unix-socket-factory.version} + unix-socket-factory + ${unix-socket-factory.version} @@ -129,6 +130,12 @@ slf4j-api ${slf4j-api.version} + + org.slf4j + jcl-over-slf4j + 1.7.12 + + com.google.guava guava @@ -189,7 +196,7 @@ test - + ossrh diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index bdb0ee75a..bea30de0e 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -8,6 +8,8 @@ + + From a28cabb62ecf4dd1271eac92e26e83cd87f152ac Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 29 May 2015 22:13:43 +0200 Subject: [PATCH 0227/1399] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea3118178..b71f4e928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ Change Log === Latest SNAPSHOT --- +* [#233](https://github.com/docker-java/docker-java/pull/233) Labels are array of Strings (fixes #232) +* [#189](https://github.com/docker-java/docker-java/pull/189) Add docker stats support v1.3.0 --- From 99f46efbcd09da305f8df2215e6d1ef6cdf1b2c3 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 30 May 2015 00:21:00 +0300 Subject: [PATCH 0228/1399] VolumesFrom is an array --- .../github/dockerjava/api/command/StartContainerCmd.java | 5 +++-- .../dockerjava/core/command/StartContainerCmdImpl.java | 7 ++++--- .../dockerjava/core/command/StartContainerCmdImplTest.java | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index e76598e3e..aeddfd0bd 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -10,6 +10,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.VolumesFrom; /** * Start a container. @@ -56,7 +57,7 @@ public static interface Exec extends DockerCmdExec { public RestartPolicy getRestartPolicy(); - public String getVolumesFrom(); + public VolumesFrom[] getVolumesFrom(); public Boolean isPrivileged(); @@ -165,6 +166,6 @@ public static interface Exec extends DockerCmdExec { public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy); @Deprecated - public StartContainerCmd withVolumesFrom(String volumesFrom); + public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); } diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index dba35fb99..27fca12f8 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -21,6 +21,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.VolumesFrom; /** @@ -57,7 +58,7 @@ public class StartContainerCmdImpl extends AbstrDockerCmd Date: Fri, 5 Jun 2015 18:58:11 +0200 Subject: [PATCH 0229/1399] Fix auto bind test --- .../dockerjava/core/command/StartContainerCmdImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 70108ae68..640839915 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -253,10 +253,10 @@ public void startContainerWithRandomPortBindings() throws DockerException { .getExposedPorts()), contains(tcp22, tcp23)); assertThat(inspectContainerResponse.getNetworkSettings().getPorts() - .getBindings().get(tcp22)[0].getHostPort(), is(notNullValue())); + .getBindings().get(tcp22)[0].getHostPort(), is(not(equalTo(tcp22.getPort())))); assertThat(inspectContainerResponse.getNetworkSettings().getPorts() - .getBindings().get(tcp23)[0], is(notNullValue())); + .getBindings().get(tcp23)[0].getHostPort(), is(not(equalTo(tcp23.getPort())))); } From 43a77ba567be3f366fec11e7f459c9aadf418813 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 5 Jun 2015 20:18:19 +0200 Subject: [PATCH 0230/1399] Add pool timeout --- .../github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index b7469a43d..58f85e7ea 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.URI; +import java.util.concurrent.TimeUnit; import com.github.dockerjava.api.command.*; @@ -22,9 +23,11 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.apache.connector.ApacheClientProperties; + //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; + import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; @@ -84,7 +87,8 @@ public void init(DockerClientConfig dockerClientConfig) { } PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( - getSchemeRegistry(originalUri, sslContext)); + getSchemeRegistry(originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS); + if (dockerClientConfig.getMaxTotalConnections() != null) connManager @@ -315,7 +319,7 @@ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { public EventsCmd.Exec createEventsCmdExec() { return new EventsCmdExec(getBaseResource()); } - + @Override public StatsCmd.Exec createStatsCmdExec() { return new StatsCmdExec(getBaseResource()); From 21b7c06b6c04af2d44ed578081d6dce6f98aa952 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 5 Jun 2015 20:50:39 +0200 Subject: [PATCH 0231/1399] Connect timeout of 10 seconds --- .../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 58f85e7ea..9e375f24a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -72,6 +72,7 @@ public void init(DockerClientConfig dockerClientConfig) { int readTimeout = dockerClientConfig.getReadTimeout(); clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); } + clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); URI originalUri = dockerClientConfig.getUri(); From 4c3e96466e8a45a8cb50122833417dfdad16a9a3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 5 Jun 2015 21:39:38 +0200 Subject: [PATCH 0232/1399] Added connection request timeout --- .../com/github/dockerjava/jaxrs/connector/ApacheConnector.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index 651db983d..d785bff7c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -464,6 +464,9 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing authCache.put(getHost(request), basicScheme); context.setAuthCache(authCache); } + + context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build()); + response = client.execute(getHost(request), request, context); HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(), this.getClass().getName()); From 5c4b0b0fc42c9d0d070ad6dbd131ceec8d4346dc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 5 Jun 2015 22:08:07 +0200 Subject: [PATCH 0233/1399] Connection request timeout --- .../github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 8 +++++++- .../dockerjava/jaxrs/connector/ApacheConnector.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 9e375f24a..1e77e5b26 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -16,6 +16,7 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; +import org.apache.http.client.config.RequestConfig; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; @@ -24,6 +25,7 @@ import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.apache.connector.ApacheClientProperties; + //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; @@ -72,7 +74,8 @@ public void init(DockerClientConfig dockerClientConfig) { int readTimeout = dockerClientConfig.getReadTimeout(); clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); } - clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); + + //clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); URI originalUri = dockerClientConfig.getUri(); @@ -101,6 +104,9 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); + clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, + RequestConfig.custom().setConnectionRequestTimeout(10).build()); + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( clientConfig); diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index d785bff7c..63fea0954 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -465,7 +465,7 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing context.setAuthCache(authCache); } - context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build()); + //context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build()); response = client.execute(getHost(request), request, context); HeaderUtils.checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(), From 2c9e12c3541550cfd983f478fcec93a1666718df Mon Sep 17 00:00:00 2001 From: Zach Marshall Date: Fri, 12 Jun 2015 15:27:23 -0400 Subject: [PATCH 0234/1399] Remove temp tar files created by CompressArchiveUtil CompressArchiveUtil creates tar files in a temporary directory, but does not clean them up after. Call deleteOnExit on this file so that they are automatically cleaned up when the JVM terminates. --- .../java/com/github/dockerjava/core/CompressArchiveUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 297adc766..0afd5171d 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -12,6 +12,7 @@ public class CompressArchiveUtil { public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar"); + tarFile.deleteOnExit(); TarArchiveOutputStream tos = new TarArchiveOutputStream(new FileOutputStream(tarFile)); try { tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); From d6aef1bc03e7cc64c2771314c607977d59996e4f Mon Sep 17 00:00:00 2001 From: scadge Date: Mon, 15 Jun 2015 16:46:45 +0300 Subject: [PATCH 0235/1399] Added ReadonlyFs option. --- .../github/dockerjava/api/model/HostConfig.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java index 9973e6252..6b8cdcd45 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -27,6 +27,9 @@ public class HostConfig { @JsonProperty("Privileged") private boolean privileged; + @JsonProperty("ReadonlyRootfs") + private boolean readonlyRootfs; + @JsonProperty("Dns") private String[] dns; @@ -64,7 +67,7 @@ public HostConfig() { } public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, - boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile, + boolean privileged, boolean readonlyRootfs, String[] dns, String[] dnsSearch, VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts, Ulimit[] ulimits) { this.binds = new Binds(binds); @@ -73,6 +76,7 @@ public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindi this.portBindings = portBindings; this.publishAllPorts = publishAllPorts; this.privileged = privileged; + this.readonlyRootfs = readonlyRootfs; this.dns = dns; this.dnsSearch = dnsSearch; this.volumesFrom = volumesFrom; @@ -95,7 +99,7 @@ public Bind[] getBinds() { public LxcConf[] getLxcConf() { return lxcConf; } - + public Ports getPortBindings() { return portBindings; } @@ -108,6 +112,10 @@ public boolean isPrivileged() { return privileged; } + public boolean isReadonlyRootfs() { + return readonlyRootfs; + } + public String[] getDns() { return dns; } @@ -183,6 +191,10 @@ public void setPrivileged(boolean privileged) { this.privileged = privileged; } + public void setReadonlyRootfs(boolean readonlyRootfs) { + this.readonlyRootfs = readonlyRootfs; + } + public void setDns(String[] dns) { this.dns = dns; } From 3c4b71bd42ec82cc6829dfad41eb6160f8f69e6e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:11:13 +0200 Subject: [PATCH 0236/1399] Adjust timeout --- .../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 1e77e5b26..8a5d5d879 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -105,7 +105,7 @@ public void init(DockerClientConfig dockerClientConfig) { connManager); clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, - RequestConfig.custom().setConnectionRequestTimeout(10).build()); + RequestConfig.custom().setConnectionRequestTimeout(1000).build()); ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( clientConfig); From eb8be7593f583e9a31b71cc49f7abc1431c283af Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:14:20 +0200 Subject: [PATCH 0237/1399] Ignore test in CircleCI --- .../com/github/dockerjava/core/command/EventsCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index 46600a160..0d61c8f59 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -97,7 +97,7 @@ public void testEventStreaming1() throws InterruptedException, IOException { assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); } - @Test + @Test(groups = "ignoreInCircleCi") public void testEventStreaming2() throws InterruptedException, IOException { // Don't include other tests events TimeUnit.SECONDS.sleep(1); From 480a7fefc3205b4483ce0cabf21852e936fef365 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 16 Jun 2015 21:28:37 +0200 Subject: [PATCH 0238/1399] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7948c6776..a4c18a0ce 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Java API client for [Docker](http://docs.docker.io/ "Docker") -Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/sources/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x +Supports a subset of the Docker Remote API [v1.18](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.18.md), Docker Server version 1.6.x The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! From 591e871e09288a6484f6cb3f4cb9349b4237f96e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:35:52 +0200 Subject: [PATCH 0239/1399] Add Domainname attribute on create command --- .../api/command/CreateContainerCmd.java | 66 ++++++++++--------- .../core/command/CreateContainerCmdImpl.java | 23 +++++-- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index 708e3139a..fa8f40f33 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -44,7 +44,7 @@ public CreateContainerResponse exec() throws NotFoundException, public Device[] getDevices(); public String[] getDns(); - + public String[] getDnsSearch(); public String[] getEntrypoint(); @@ -52,19 +52,21 @@ public CreateContainerResponse exec() throws NotFoundException, public String[] getEnv(); public ExposedPort[] getExposedPorts(); - + public String[] getExtraHosts(); public HostConfig getHostConfig(); public String getHostName(); + public String getDomainName(); + public String getImage(); public Link[] getLinks(); - + public LxcConf[] getLxcConf(); - + public String getMacAddress(); public long getMemoryLimit(); @@ -72,13 +74,13 @@ public CreateContainerResponse exec() throws NotFoundException, public long getMemorySwap(); public String getName(); - + public String getNetworkMode(); - + public Ports getPortBindings(); public String[] getPortSpecs(); - + public RestartPolicy getRestartPolicy(); public String getUser(); @@ -96,9 +98,9 @@ public CreateContainerResponse exec() throws NotFoundException, public boolean isAttachStdout(); public boolean isNetworkDisabled(); - + public Boolean isPrivileged(); - + public Boolean isPublishAllPorts(); public boolean isStdInOnce(); @@ -110,9 +112,9 @@ public CreateContainerResponse exec() throws NotFoundException, public CreateContainerCmd withAttachStderr(boolean attachStderr); public CreateContainerCmd withAttachStdin(boolean attachStdin); - + public CreateContainerCmd withAttachStdout(boolean attachStdout); - + public CreateContainerCmd withBinds(Bind... binds); /** @@ -134,9 +136,9 @@ public CreateContainerResponse exec() throws NotFoundException, public CreateContainerCmd withCmd(String... cmd); public CreateContainerCmd withCpuset(String cpuset); - + public CreateContainerCmd withCpuShares(int cpuShares); - + /** * Add host devices to the container */ @@ -148,7 +150,7 @@ public CreateContainerResponse exec() throws NotFoundException, * Set custom DNS servers */ public CreateContainerCmd withDns(String... dns); - + /** * Set custom DNS search domains */ @@ -157,33 +159,35 @@ public CreateContainerResponse exec() throws NotFoundException, public CreateContainerCmd withEntrypoint(String... entrypoint); public CreateContainerCmd withEnv(String... env); - + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); - + /** * Add hostnames to /etc/hosts in the container */ public CreateContainerCmd withExtraHosts(String... extraHosts); - + public CreateContainerCmd withHostConfig(HostConfig hostConfig); public CreateContainerCmd withHostName(String hostName); + public CreateContainerCmd withDomainName(String domainName); + public CreateContainerCmd withImage(String image); /** * Add link to another container. */ public CreateContainerCmd withLinks(Link... links); - + public CreateContainerCmd withLxcConf(LxcConf... lxcConf); public CreateContainerCmd withMemoryLimit(long memoryLimit); - + public CreateContainerCmd withMemorySwap(long memorySwap); - + public CreateContainerCmd withName(String name); - + /** * Set the Network mode for the container @@ -198,28 +202,28 @@ public CreateContainerResponse exec() throws NotFoundException, * */ public CreateContainerCmd withNetworkMode(String networkMode); - + /** * Add one or more {@link PortBinding}s. * This corresponds to the --publish (-p) * option of the docker run CLI command. */ public CreateContainerCmd withPortBindings(PortBinding... portBindings); - + /** * Add the port bindings that are contained in the given {@link Ports} * object. - * + * * @see #withPortBindings(PortBinding...) */ public CreateContainerCmd withPortBindings(Ports portBindings); public CreateContainerCmd withPortSpecs(String... portSpecs); - + public CreateContainerCmd withPrivileged(boolean privileged); - + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts); - + /** * Set custom {@link RestartPolicy} for the container. Defaults to * {@link RestartPolicy#noRestart()} @@ -231,13 +235,13 @@ public CreateContainerResponse exec() throws NotFoundException, public CreateContainerCmd withStdinOpen(boolean stdinOpen); public CreateContainerCmd withTty(boolean tty); - + public CreateContainerCmd withUser(String user); - + public CreateContainerCmd withVolumes(Volume... volumes); - + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); - + public CreateContainerCmd withWorkingDir(String workingDir); public CreateContainerCmd withMacAddress(String macAddress); diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 18b089d4d..4b3f064e2 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -26,9 +26,9 @@ import com.github.dockerjava.api.model.Volumes; /** - * + * * Creates a new container. - * + * */ public class CreateContainerCmdImpl extends AbstrDockerCmd implements @@ -38,6 +38,8 @@ public class CreateContainerCmdImpl extends @JsonProperty("Hostname") private String hostName = ""; + @JsonProperty("Domainname") + private String domainName = ""; @JsonProperty("User") private String user = ""; @JsonProperty("Memory") @@ -182,6 +184,11 @@ public String getHostName() { return hostName; } + @Override + public String getDomainName() { + return domainName; + } + @Override public String getImage() { return image; @@ -198,7 +205,7 @@ public Link[] getLinks() { public LxcConf[] getLxcConf() { return hostConfig.getLxcConf(); } - + public String getMacAddress() { return macAddress; } @@ -432,6 +439,12 @@ public CreateContainerCmdImpl withHostName(String hostName) { return this; } + @Override + public CreateContainerCmdImpl withDomainName(String domainName) { + this.domainName = domainName; + return this; + } + @Override public CreateContainerCmdImpl withImage(String image) { this.image = image; @@ -451,7 +464,7 @@ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { this.hostConfig.setLxcConf(lxcConf); return this; } - + @Override public CreateContainerCmdImpl withMacAddress(String macAddress) { this.macAddress = macAddress; @@ -515,7 +528,7 @@ public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { this.hostConfig.setPublishAllPorts(publishAllPorts); return this; } - + @Override public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { this.hostConfig.setRestartPolicy(restartPolicy); From f3900a3c76ea53c51283a3130d81eab5d106f29c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:40:56 +0200 Subject: [PATCH 0240/1399] code formatting --- .../core/command/CreateContainerCmdImpl.java | 1090 +++++++++-------- 1 file changed, 555 insertions(+), 535 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 4b3f064e2..cc082b61f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -30,551 +30,571 @@ * Creates a new container. * */ -public class CreateContainerCmdImpl extends - AbstrDockerCmd implements - CreateContainerCmd { +public class CreateContainerCmdImpl extends AbstrDockerCmd implements + CreateContainerCmd { - private String name; + private String name; - @JsonProperty("Hostname") - private String hostName = ""; - @JsonProperty("Domainname") + @JsonProperty("Hostname") + private String hostName = ""; + + @JsonProperty("Domainname") private String domainName = ""; - @JsonProperty("User") - private String user = ""; - @JsonProperty("Memory") - private long memoryLimit = 0; - @JsonProperty("MemorySwap") - private long memorySwap = 0; - @JsonProperty("CpuShares") - private int cpuShares = 0; - @JsonProperty("Cpuset") - private String cpuset; - @JsonProperty("AttachStdin") - private boolean attachStdin = false; - @JsonProperty("AttachStdout") - private boolean attachStdout = false; - @JsonProperty("AttachStderr") - private boolean attachStderr = false; - @JsonProperty("PortSpecs") - private String[] portSpecs; - @JsonProperty("Tty") - private boolean tty = false; - @JsonProperty("OpenStdin") - private boolean stdinOpen = false; - @JsonProperty("StdinOnce") - private boolean stdInOnce = false; - @JsonProperty("Env") - private String[] env; - @JsonProperty("Cmd") - private String[] cmd; - @JsonProperty("Entrypoint") - private String[] entrypoint; - @JsonProperty("Image") - private String image; - @JsonProperty("Volumes") - private Volumes volumes = new Volumes(); - @JsonProperty("WorkingDir") - private String workingDir = ""; - @JsonProperty("MacAddress") - private String macAddress; - @JsonProperty("NetworkDisabled") - private boolean networkDisabled = false; - @JsonProperty("ExposedPorts") - private ExposedPorts exposedPorts = new ExposedPorts(); - @JsonProperty("HostConfig") - private HostConfig hostConfig = new HostConfig(); - - public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { - super(exec); - checkNotNull(image, "image was not specified"); - withImage(image); - } - - /** - * @throws NotFoundException - * No such container - * @throws ConflictException - * Named container already exists - */ - @Override - public CreateContainerResponse exec() throws NotFoundException, - ConflictException { - return super.exec(); - } - - @Override - @JsonIgnore - public Bind[] getBinds() { - return hostConfig.getBinds(); - } - - @Override - public Capability[] getCapAdd() { - return hostConfig.getCapAdd(); - } - - @Override - public Capability[] getCapDrop() { - return hostConfig.getCapDrop(); - } - - @Override - public String[] getCmd() { - return cmd; - } - - @Override - public String getCpuset() { - return cpuset; - } - - @Override - public int getCpuShares() { - return cpuShares; - } - - @Override - @JsonIgnore - public Device[] getDevices() { - return hostConfig.getDevices(); - } - - @Override - @JsonIgnore - public String[] getDns() { - return hostConfig.getDns(); - } - - @Override - @JsonIgnore - public String[] getDnsSearch() { - return hostConfig.getDnsSearch(); - } - - @Override - public String[] getEntrypoint() { - return entrypoint; - } - - @Override - public String[] getEnv() { - return env; - } - - @Override - @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); - } - - @Override - @JsonIgnore - public String[] getExtraHosts() { - return hostConfig.getExtraHosts(); - } - - @Override - public HostConfig getHostConfig() { - return hostConfig; - } - - @Override - public String getHostName() { - return hostName; - } - - @Override - public String getDomainName() { + + @JsonProperty("User") + private String user = ""; + + @JsonProperty("Memory") + private long memoryLimit = 0; + + @JsonProperty("MemorySwap") + private long memorySwap = 0; + + @JsonProperty("CpuShares") + private int cpuShares = 0; + + @JsonProperty("Cpuset") + private String cpuset; + + @JsonProperty("AttachStdin") + private boolean attachStdin = false; + + @JsonProperty("AttachStdout") + private boolean attachStdout = false; + + @JsonProperty("AttachStderr") + private boolean attachStderr = false; + + @JsonProperty("PortSpecs") + private String[] portSpecs; + + @JsonProperty("Tty") + private boolean tty = false; + + @JsonProperty("OpenStdin") + private boolean stdinOpen = false; + + @JsonProperty("StdinOnce") + private boolean stdInOnce = false; + + @JsonProperty("Env") + private String[] env; + + @JsonProperty("Cmd") + private String[] cmd; + + @JsonProperty("Entrypoint") + private String[] entrypoint; + + @JsonProperty("Image") + private String image; + + @JsonProperty("Volumes") + private Volumes volumes = new Volumes(); + + @JsonProperty("WorkingDir") + private String workingDir = ""; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("NetworkDisabled") + private boolean networkDisabled = false; + + @JsonProperty("ExposedPorts") + private ExposedPorts exposedPorts = new ExposedPorts(); + + @JsonProperty("HostConfig") + private HostConfig hostConfig = new HostConfig(); + + public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { + super(exec); + checkNotNull(image, "image was not specified"); + withImage(image); + } + + /** + * @throws NotFoundException + * No such container + * @throws ConflictException + * Named container already exists + */ + @Override + public CreateContainerResponse exec() throws NotFoundException, ConflictException { + return super.exec(); + } + + @Override + @JsonIgnore + public Bind[] getBinds() { + return hostConfig.getBinds(); + } + + @Override + public Capability[] getCapAdd() { + return hostConfig.getCapAdd(); + } + + @Override + public Capability[] getCapDrop() { + return hostConfig.getCapDrop(); + } + + @Override + public String[] getCmd() { + return cmd; + } + + @Override + public String getCpuset() { + return cpuset; + } + + @Override + public int getCpuShares() { + return cpuShares; + } + + @Override + @JsonIgnore + public Device[] getDevices() { + return hostConfig.getDevices(); + } + + @Override + @JsonIgnore + public String[] getDns() { + return hostConfig.getDns(); + } + + @Override + @JsonIgnore + public String[] getDnsSearch() { + return hostConfig.getDnsSearch(); + } + + @Override + public String[] getEntrypoint() { + return entrypoint; + } + + @Override + public String[] getEnv() { + return env; + } + + @Override + @JsonIgnore + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); + } + + @Override + @JsonIgnore + public String[] getExtraHosts() { + return hostConfig.getExtraHosts(); + } + + @Override + public HostConfig getHostConfig() { + return hostConfig; + } + + @Override + public String getHostName() { + return hostName; + } + + @Override + public String getDomainName() { return domainName; } - @Override - public String getImage() { - return image; - } - - @Override - @JsonIgnore - public Link[] getLinks() { - return hostConfig.getLinks(); - } - - @Override - @JsonIgnore - public LxcConf[] getLxcConf() { - return hostConfig.getLxcConf(); - } - - public String getMacAddress() { - return macAddress; - } - - @Override - public long getMemoryLimit() { - return memoryLimit; - } - - @Override - public long getMemorySwap() { - return memorySwap; - } - - @Override - public String getName() { - return name; - } - - @Override - @JsonIgnore - public String getNetworkMode() { - return hostConfig.getNetworkMode(); - } - - @Override - @JsonIgnore - public Ports getPortBindings() { - return hostConfig.getPortBindings(); - } - - @Override - public String[] getPortSpecs() { - return portSpecs; - } - - @Override - @JsonIgnore - public RestartPolicy getRestartPolicy() { - return hostConfig.getRestartPolicy(); - } - - @Override - public String getUser() { - return user; - } - - @Override - @JsonIgnore - public Volume[] getVolumes() { - return volumes.getVolumes(); - } - - @Override - @JsonIgnore - public VolumesFrom[] getVolumesFrom() { - return hostConfig.getVolumesFrom(); - } - - @Override - public String getWorkingDir() { - return workingDir; - } - - @Override - public boolean isAttachStderr() { - return attachStderr; - } - - @Override - public boolean isAttachStdin() { - return attachStdin; - } - - @Override - public boolean isAttachStdout() { - return attachStdout; - } - - @Override - public boolean isNetworkDisabled() { - return networkDisabled; - } - - @Override - @JsonIgnore - public Boolean isPrivileged() { - return hostConfig.isPrivileged(); - } - - @Override - @JsonIgnore - public Boolean isPublishAllPorts() { - return hostConfig.isPublishAllPorts(); - } - - @Override - public boolean isStdInOnce() { - return stdInOnce; - } - - @Override - public boolean isStdinOpen() { - return stdinOpen; - } - - @Override - public boolean isTty() { - return tty; - } - - @Override - public String toString() { - return new ToStringBuilder(this).append("create container ") - .append(name != null ? "name=" + name + " " : "").append(this) - .toString(); - } - - @Override - public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { - this.attachStderr = attachStderr; - return this; - } - - @Override - public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { - this.attachStdin = attachStdin; - return this; - } - - @Override - public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { - this.attachStdout = attachStdout; - return this; - } - - @Override - public CreateContainerCmd withBinds(Bind... binds) { - hostConfig.setBinds(binds); - return this; - } - - @Override - public CreateContainerCmd withCapAdd(Capability... capAdd) { - hostConfig.setCapAdd(capAdd); - return this; - } - - @Override - public CreateContainerCmd withCapDrop(Capability... capDrop) { - hostConfig.setCapDrop(capDrop); - return this; - } - - @Override - public CreateContainerCmdImpl withCmd(String... cmd) { - this.cmd = cmd; - return this; - } - - @Override - public CreateContainerCmdImpl withCpuset(String cpuset) { - this.cpuset = cpuset; - return this; - } - - @Override - public CreateContainerCmdImpl withCpuShares(int cpuShares) { - this.cpuShares = cpuShares; - return this; - } - - @Override - public CreateContainerCmd withDevices(Device... devices) { - this.hostConfig.setDevices(devices); - return this; - } - - @Override - public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { - this.networkDisabled = disableNetwork; - return this; - } - - @Override - public CreateContainerCmdImpl withDns(String... dns) { - this.hostConfig.setDns(dns); - return this; - } - - @Override - public CreateContainerCmd withDnsSearch(String... dnsSearch) { - this.hostConfig.setDnsSearch(dnsSearch); - return this; - } - - @Override - public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { - this.entrypoint = entrypoint; - return this; - } - - @Override - public CreateContainerCmdImpl withEnv(String... env) { - this.env = env; - return this; - } - - @Override - public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { - this.exposedPorts = new ExposedPorts(exposedPorts); - return this; - } - - @Override - public CreateContainerCmd withExtraHosts(String... extraHosts) { - this.hostConfig.setExtraHosts(extraHosts); - return this; - } - - @Override - public CreateContainerCmd withHostConfig(HostConfig hostConfig) { - checkNotNull(hostConfig, "no host config was specified"); - this.hostConfig = hostConfig; - return this; - } - - @Override - public CreateContainerCmdImpl withHostName(String hostName) { - this.hostName = hostName; - return this; - } - - @Override + @Override + public String getImage() { + return image; + } + + @Override + @JsonIgnore + public Link[] getLinks() { + return hostConfig.getLinks(); + } + + @Override + @JsonIgnore + public LxcConf[] getLxcConf() { + return hostConfig.getLxcConf(); + } + + public String getMacAddress() { + return macAddress; + } + + @Override + public long getMemoryLimit() { + return memoryLimit; + } + + @Override + public long getMemorySwap() { + return memorySwap; + } + + @Override + public String getName() { + return name; + } + + @Override + @JsonIgnore + public String getNetworkMode() { + return hostConfig.getNetworkMode(); + } + + @Override + @JsonIgnore + public Ports getPortBindings() { + return hostConfig.getPortBindings(); + } + + @Override + public String[] getPortSpecs() { + return portSpecs; + } + + @Override + @JsonIgnore + public RestartPolicy getRestartPolicy() { + return hostConfig.getRestartPolicy(); + } + + @Override + public String getUser() { + return user; + } + + @Override + @JsonIgnore + public Volume[] getVolumes() { + return volumes.getVolumes(); + } + + @Override + @JsonIgnore + public VolumesFrom[] getVolumesFrom() { + return hostConfig.getVolumesFrom(); + } + + @Override + public String getWorkingDir() { + return workingDir; + } + + @Override + public boolean isAttachStderr() { + return attachStderr; + } + + @Override + public boolean isAttachStdin() { + return attachStdin; + } + + @Override + public boolean isAttachStdout() { + return attachStdout; + } + + @Override + public boolean isNetworkDisabled() { + return networkDisabled; + } + + @Override + @JsonIgnore + public Boolean isPrivileged() { + return hostConfig.isPrivileged(); + } + + @Override + @JsonIgnore + public Boolean isPublishAllPorts() { + return hostConfig.isPublishAllPorts(); + } + + @Override + public boolean isStdInOnce() { + return stdInOnce; + } + + @Override + public boolean isStdinOpen() { + return stdinOpen; + } + + @Override + public boolean isTty() { + return tty; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("create container ").append(name != null ? "name=" + name + " " : "") + .append(this).toString(); + } + + @Override + public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + @Override + public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + @Override + public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + @Override + public CreateContainerCmd withBinds(Bind... binds) { + hostConfig.setBinds(binds); + return this; + } + + @Override + public CreateContainerCmd withCapAdd(Capability... capAdd) { + hostConfig.setCapAdd(capAdd); + return this; + } + + @Override + public CreateContainerCmd withCapDrop(Capability... capDrop) { + hostConfig.setCapDrop(capDrop); + return this; + } + + @Override + public CreateContainerCmdImpl withCmd(String... cmd) { + this.cmd = cmd; + return this; + } + + @Override + public CreateContainerCmdImpl withCpuset(String cpuset) { + this.cpuset = cpuset; + return this; + } + + @Override + public CreateContainerCmdImpl withCpuShares(int cpuShares) { + this.cpuShares = cpuShares; + return this; + } + + @Override + public CreateContainerCmd withDevices(Device... devices) { + this.hostConfig.setDevices(devices); + return this; + } + + @Override + public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { + this.networkDisabled = disableNetwork; + return this; + } + + @Override + public CreateContainerCmdImpl withDns(String... dns) { + this.hostConfig.setDns(dns); + return this; + } + + @Override + public CreateContainerCmd withDnsSearch(String... dnsSearch) { + this.hostConfig.setDnsSearch(dnsSearch); + return this; + } + + @Override + public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { + this.entrypoint = entrypoint; + return this; + } + + @Override + public CreateContainerCmdImpl withEnv(String... env) { + this.env = env; + return this; + } + + @Override + public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { + this.exposedPorts = new ExposedPorts(exposedPorts); + return this; + } + + @Override + public CreateContainerCmd withExtraHosts(String... extraHosts) { + this.hostConfig.setExtraHosts(extraHosts); + return this; + } + + @Override + public CreateContainerCmd withHostConfig(HostConfig hostConfig) { + checkNotNull(hostConfig, "no host config was specified"); + this.hostConfig = hostConfig; + return this; + } + + @Override + public CreateContainerCmdImpl withHostName(String hostName) { + this.hostName = hostName; + return this; + } + + @Override public CreateContainerCmdImpl withDomainName(String domainName) { this.domainName = domainName; return this; } - @Override - public CreateContainerCmdImpl withImage(String image) { - this.image = image; - return this; - } - - @Override - public CreateContainerCmdImpl withLinks(Link... links) { - checkNotNull(links, "links was not specified"); - this.hostConfig.setLinks(links); - return this; - } - - @Override - public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - this.hostConfig.setLxcConf(lxcConf); - return this; - } - - @Override - public CreateContainerCmdImpl withMacAddress(String macAddress) { - this.macAddress = macAddress; - return this; - } - - @Override - public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { - this.memoryLimit = memoryLimit; - return this; - } - - @Override - public CreateContainerCmdImpl withMemorySwap(long memorySwap) { - this.memorySwap = memorySwap; - return this; - } - - @Override - public CreateContainerCmdImpl withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; - } - - @Override - public CreateContainerCmd withNetworkMode(String networkMode) { - checkNotNull(networkMode, "networkMode was not specified"); - this.hostConfig.setNetworkMode(networkMode); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(PortBinding... portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.setPortBindings(new Ports(portBindings)); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(Ports portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.setPortBindings(portBindings); - return this; - } - - @Override - public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { - this.portSpecs = portSpecs; - return this; - } - - @Override - public CreateContainerCmd withPrivileged(boolean privileged) { - this.hostConfig.setPrivileged(privileged); - return this; - } - - @Override - public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { - this.hostConfig.setPublishAllPorts(publishAllPorts); - return this; - } - - @Override - public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - this.hostConfig.setRestartPolicy(restartPolicy); - return this; - } - - @Override - public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { - this.stdInOnce = stdInOnce; - return this; - } - - @Override - public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { - this.stdinOpen = stdinOpen; - return this; - } - - @Override - public CreateContainerCmdImpl withTty(boolean tty) { - this.tty = tty; - return this; - } - - @Override - public CreateContainerCmdImpl withUser(String user) { - this.user = user; - return this; - } - - @Override - public CreateContainerCmdImpl withVolumes(Volume... volumes) { - this.volumes = new Volumes(volumes); - return this; - } - - @Override - public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { - this.hostConfig.setVolumesFrom(volumesFrom); - return this; - } - - @Override - public CreateContainerCmdImpl withWorkingDir(String workingDir) { - this.workingDir = workingDir; - return this; - } + @Override + public CreateContainerCmdImpl withImage(String image) { + this.image = image; + return this; + } + + @Override + public CreateContainerCmdImpl withLinks(Link... links) { + checkNotNull(links, "links was not specified"); + this.hostConfig.setLinks(links); + return this; + } + + @Override + public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { + checkNotNull(lxcConf, "lxcConf was not specified"); + this.hostConfig.setLxcConf(lxcConf); + return this; + } + + @Override + public CreateContainerCmdImpl withMacAddress(String macAddress) { + this.macAddress = macAddress; + return this; + } + + @Override + public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { + this.memoryLimit = memoryLimit; + return this; + } + + @Override + public CreateContainerCmdImpl withMemorySwap(long memorySwap) { + this.memorySwap = memorySwap; + return this; + } + + @Override + public CreateContainerCmdImpl withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public CreateContainerCmd withNetworkMode(String networkMode) { + checkNotNull(networkMode, "networkMode was not specified"); + this.hostConfig.setNetworkMode(networkMode); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(PortBinding... portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(new Ports(portBindings)); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(Ports portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(portBindings); + return this; + } + + @Override + public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { + this.portSpecs = portSpecs; + return this; + } + + @Override + public CreateContainerCmd withPrivileged(boolean privileged) { + this.hostConfig.setPrivileged(privileged); + return this; + } + + @Override + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { + this.hostConfig.setPublishAllPorts(publishAllPorts); + return this; + } + + @Override + public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + this.hostConfig.setRestartPolicy(restartPolicy); + return this; + } + + @Override + public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { + this.stdInOnce = stdInOnce; + return this; + } + + @Override + public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { + this.stdinOpen = stdinOpen; + return this; + } + + @Override + public CreateContainerCmdImpl withTty(boolean tty) { + this.tty = tty; + return this; + } + + @Override + public CreateContainerCmdImpl withUser(String user) { + this.user = user; + return this; + } + + @Override + public CreateContainerCmdImpl withVolumes(Volume... volumes) { + this.volumes = new Volumes(volumes); + return this; + } + + @Override + public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { + this.hostConfig.setVolumesFrom(volumesFrom); + return this; + } + + @Override + public CreateContainerCmdImpl withWorkingDir(String workingDir) { + this.workingDir = workingDir; + return this; + } } From 36a17bfdbfc9bcfb148253fb9469365fd1ecc2c2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:40:56 +0200 Subject: [PATCH 0241/1399] code formatting --- .../api/command/CreateContainerCmd.java | 283 +++-- .../core/command/CreateContainerCmdImpl.java | 1090 +++++++++-------- 2 files changed, 693 insertions(+), 680 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index fa8f40f33..be6e83adf 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -16,234 +16,227 @@ import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.core.command.CreateContainerCmdImpl; -public interface CreateContainerCmd extends DockerCmd{ +public interface CreateContainerCmd extends DockerCmd { - public static interface Exec extends DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } - /** - * @throws NotFoundException No such container - * @throws ConflictException Named container already exists - */ + /** + * @throws NotFoundException + * No such container + * @throws ConflictException + * Named container already exists + */ @Override - public CreateContainerResponse exec() throws NotFoundException, - ConflictException; + public CreateContainerResponse exec() throws NotFoundException, ConflictException; - public Bind[] getBinds(); + public Bind[] getBinds(); - public Capability[] getCapAdd(); + public Capability[] getCapAdd(); - public Capability[] getCapDrop(); + public Capability[] getCapDrop(); - public String[] getCmd(); + public String[] getCmd(); - public String getCpuset(); + public String getCpuset(); - public int getCpuShares(); + public int getCpuShares(); - public Device[] getDevices(); + public Device[] getDevices(); - public String[] getDns(); + public String[] getDns(); - public String[] getDnsSearch(); + public String[] getDnsSearch(); - public String[] getEntrypoint(); + public String[] getEntrypoint(); - public String[] getEnv(); + public String[] getEnv(); - public ExposedPort[] getExposedPorts(); + public ExposedPort[] getExposedPorts(); - public String[] getExtraHosts(); + public String[] getExtraHosts(); - public HostConfig getHostConfig(); + public HostConfig getHostConfig(); - public String getHostName(); + public String getHostName(); - public String getDomainName(); + public String getDomainName(); - public String getImage(); + public String getImage(); - public Link[] getLinks(); + public Link[] getLinks(); - public LxcConf[] getLxcConf(); + public LxcConf[] getLxcConf(); - public String getMacAddress(); + public String getMacAddress(); - public long getMemoryLimit(); + public long getMemoryLimit(); - public long getMemorySwap(); + public long getMemorySwap(); - public String getName(); + public String getName(); - public String getNetworkMode(); + public String getNetworkMode(); - public Ports getPortBindings(); + public Ports getPortBindings(); - public String[] getPortSpecs(); + public String[] getPortSpecs(); - public RestartPolicy getRestartPolicy(); + public RestartPolicy getRestartPolicy(); - public String getUser(); + public String getUser(); - public Volume[] getVolumes(); + public Volume[] getVolumes(); - public VolumesFrom[] getVolumesFrom(); + public VolumesFrom[] getVolumesFrom(); - public String getWorkingDir(); + public String getWorkingDir(); - public boolean isAttachStderr(); + public boolean isAttachStderr(); - public boolean isAttachStdin(); + public boolean isAttachStdin(); - public boolean isAttachStdout(); + public boolean isAttachStdout(); - public boolean isNetworkDisabled(); + public boolean isNetworkDisabled(); - public Boolean isPrivileged(); + public Boolean isPrivileged(); - public Boolean isPublishAllPorts(); + public Boolean isPublishAllPorts(); - public boolean isStdInOnce(); + public boolean isStdInOnce(); - public boolean isStdinOpen(); + public boolean isStdinOpen(); - public boolean isTty(); + public boolean isTty(); - public CreateContainerCmd withAttachStderr(boolean attachStderr); + public CreateContainerCmd withAttachStderr(boolean attachStderr); - public CreateContainerCmd withAttachStdin(boolean attachStdin); + public CreateContainerCmd withAttachStdin(boolean attachStdin); - public CreateContainerCmd withAttachStdout(boolean attachStdout); + public CreateContainerCmd withAttachStdout(boolean attachStdout); - public CreateContainerCmd withBinds(Bind... binds); + public CreateContainerCmd withBinds(Bind... binds); - /** - * Add linux kernel - * capability to the container. For example: adding {@link Capability#MKNOD} - * allows the container to create special files using the 'mknod' command. - */ - public CreateContainerCmd withCapAdd(Capability... capAdd); + /** + * Add linux kernel capability to the + * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the + * 'mknod' command. + */ + public CreateContainerCmd withCapAdd(Capability... capAdd); - /** - * Drop linux kernel - * capability from the container. For example: dropping {@link Capability#CHOWN} - * prevents the container from changing the owner of any files. - */ - public CreateContainerCmd withCapDrop(Capability... capDrop); + /** + * Drop linux kernel capability from the + * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any + * files. + */ + public CreateContainerCmd withCapDrop(Capability... capDrop); - public CreateContainerCmd withCmd(String... cmd); + public CreateContainerCmd withCmd(String... cmd); - public CreateContainerCmd withCpuset(String cpuset); + public CreateContainerCmd withCpuset(String cpuset); - public CreateContainerCmd withCpuShares(int cpuShares); + public CreateContainerCmd withCpuShares(int cpuShares); - /** - * Add host devices to the container - */ - public CreateContainerCmd withDevices(Device... devices); + /** + * Add host devices to the container + */ + public CreateContainerCmd withDevices(Device... devices); - public CreateContainerCmd withNetworkDisabled(boolean disableNetwork); + public CreateContainerCmd withNetworkDisabled(boolean disableNetwork); - /** - * Set custom DNS servers - */ - public CreateContainerCmd withDns(String... dns); + /** + * Set custom DNS servers + */ + public CreateContainerCmd withDns(String... dns); - /** - * Set custom DNS search domains - */ - public CreateContainerCmd withDnsSearch(String... dnsSearch); + /** + * Set custom DNS search domains + */ + public CreateContainerCmd withDnsSearch(String... dnsSearch); - public CreateContainerCmd withEntrypoint(String... entrypoint); + public CreateContainerCmd withEntrypoint(String... entrypoint); - public CreateContainerCmd withEnv(String... env); + public CreateContainerCmd withEnv(String... env); - public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); - /** - * Add hostnames to /etc/hosts in the container - */ - public CreateContainerCmd withExtraHosts(String... extraHosts); + /** + * Add hostnames to /etc/hosts in the container + */ + public CreateContainerCmd withExtraHosts(String... extraHosts); - public CreateContainerCmd withHostConfig(HostConfig hostConfig); + public CreateContainerCmd withHostConfig(HostConfig hostConfig); - public CreateContainerCmd withHostName(String hostName); + public CreateContainerCmd withHostName(String hostName); - public CreateContainerCmd withDomainName(String domainName); + public CreateContainerCmd withDomainName(String domainName); - public CreateContainerCmd withImage(String image); + public CreateContainerCmd withImage(String image); - /** - * Add link to another container. - */ - public CreateContainerCmd withLinks(Link... links); + /** + * Add link to another container. + */ + public CreateContainerCmd withLinks(Link... links); - public CreateContainerCmd withLxcConf(LxcConf... lxcConf); + public CreateContainerCmd withLxcConf(LxcConf... lxcConf); - public CreateContainerCmd withMemoryLimit(long memoryLimit); + public CreateContainerCmd withMemoryLimit(long memoryLimit); - public CreateContainerCmd withMemorySwap(long memorySwap); + public CreateContainerCmd withMemorySwap(long memorySwap); - public CreateContainerCmd withName(String name); + public CreateContainerCmd withName(String name); + /** + * Set the Network mode for the container + *

    + *
  • 'bridge': creates a new network stack for the container on the docker bridge
  • + *
  • 'none': no networking for this container
  • + *
  • 'container:': reuses another container network stack
  • + *
  • 'host': use the host network stack inside the container. Note: the host mode gives the container full access + * to local system services such as D-bus and is therefore considered insecure.
  • + *
+ */ + public CreateContainerCmd withNetworkMode(String networkMode); - /** - * Set the Network mode for the container - *
    - *
  • 'bridge': creates a new network stack for the container on the docker - * bridge
  • - *
  • 'none': no networking for this container
  • - *
  • 'container:': reuses another container network stack
  • - *
  • 'host': use the host network stack inside the container. Note: the - * host mode gives the container full access to local system services such - * as D-bus and is therefore considered insecure.
  • - *
- */ - public CreateContainerCmd withNetworkMode(String networkMode); + /** + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of + * the docker run CLI command. + */ + public CreateContainerCmd withPortBindings(PortBinding... portBindings); - /** - * Add one or more {@link PortBinding}s. - * This corresponds to the --publish (-p) - * option of the docker run CLI command. - */ - public CreateContainerCmd withPortBindings(PortBinding... portBindings); + /** + * Add the port bindings that are contained in the given {@link Ports} object. + * + * @see #withPortBindings(PortBinding...) + */ + public CreateContainerCmd withPortBindings(Ports portBindings); - /** - * Add the port bindings that are contained in the given {@link Ports} - * object. - * - * @see #withPortBindings(PortBinding...) - */ - public CreateContainerCmd withPortBindings(Ports portBindings); + public CreateContainerCmd withPortSpecs(String... portSpecs); - public CreateContainerCmd withPortSpecs(String... portSpecs); + public CreateContainerCmd withPrivileged(boolean privileged); - public CreateContainerCmd withPrivileged(boolean privileged); + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts); - public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts); + /** + * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()} + */ + public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); - /** - * Set custom {@link RestartPolicy} for the container. Defaults to - * {@link RestartPolicy#noRestart()} - */ - public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + public CreateContainerCmd withStdInOnce(boolean stdInOnce); - public CreateContainerCmd withStdInOnce(boolean stdInOnce); + public CreateContainerCmd withStdinOpen(boolean stdinOpen); - public CreateContainerCmd withStdinOpen(boolean stdinOpen); + public CreateContainerCmd withTty(boolean tty); - public CreateContainerCmd withTty(boolean tty); + public CreateContainerCmd withUser(String user); - public CreateContainerCmd withUser(String user); + public CreateContainerCmd withVolumes(Volume... volumes); - public CreateContainerCmd withVolumes(Volume... volumes); + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); - public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); + public CreateContainerCmd withWorkingDir(String workingDir); - public CreateContainerCmd withWorkingDir(String workingDir); - - public CreateContainerCmd withMacAddress(String macAddress); + public CreateContainerCmd withMacAddress(String macAddress); } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 4b3f064e2..cc082b61f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -30,551 +30,571 @@ * Creates a new container. * */ -public class CreateContainerCmdImpl extends - AbstrDockerCmd implements - CreateContainerCmd { +public class CreateContainerCmdImpl extends AbstrDockerCmd implements + CreateContainerCmd { - private String name; + private String name; - @JsonProperty("Hostname") - private String hostName = ""; - @JsonProperty("Domainname") + @JsonProperty("Hostname") + private String hostName = ""; + + @JsonProperty("Domainname") private String domainName = ""; - @JsonProperty("User") - private String user = ""; - @JsonProperty("Memory") - private long memoryLimit = 0; - @JsonProperty("MemorySwap") - private long memorySwap = 0; - @JsonProperty("CpuShares") - private int cpuShares = 0; - @JsonProperty("Cpuset") - private String cpuset; - @JsonProperty("AttachStdin") - private boolean attachStdin = false; - @JsonProperty("AttachStdout") - private boolean attachStdout = false; - @JsonProperty("AttachStderr") - private boolean attachStderr = false; - @JsonProperty("PortSpecs") - private String[] portSpecs; - @JsonProperty("Tty") - private boolean tty = false; - @JsonProperty("OpenStdin") - private boolean stdinOpen = false; - @JsonProperty("StdinOnce") - private boolean stdInOnce = false; - @JsonProperty("Env") - private String[] env; - @JsonProperty("Cmd") - private String[] cmd; - @JsonProperty("Entrypoint") - private String[] entrypoint; - @JsonProperty("Image") - private String image; - @JsonProperty("Volumes") - private Volumes volumes = new Volumes(); - @JsonProperty("WorkingDir") - private String workingDir = ""; - @JsonProperty("MacAddress") - private String macAddress; - @JsonProperty("NetworkDisabled") - private boolean networkDisabled = false; - @JsonProperty("ExposedPorts") - private ExposedPorts exposedPorts = new ExposedPorts(); - @JsonProperty("HostConfig") - private HostConfig hostConfig = new HostConfig(); - - public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { - super(exec); - checkNotNull(image, "image was not specified"); - withImage(image); - } - - /** - * @throws NotFoundException - * No such container - * @throws ConflictException - * Named container already exists - */ - @Override - public CreateContainerResponse exec() throws NotFoundException, - ConflictException { - return super.exec(); - } - - @Override - @JsonIgnore - public Bind[] getBinds() { - return hostConfig.getBinds(); - } - - @Override - public Capability[] getCapAdd() { - return hostConfig.getCapAdd(); - } - - @Override - public Capability[] getCapDrop() { - return hostConfig.getCapDrop(); - } - - @Override - public String[] getCmd() { - return cmd; - } - - @Override - public String getCpuset() { - return cpuset; - } - - @Override - public int getCpuShares() { - return cpuShares; - } - - @Override - @JsonIgnore - public Device[] getDevices() { - return hostConfig.getDevices(); - } - - @Override - @JsonIgnore - public String[] getDns() { - return hostConfig.getDns(); - } - - @Override - @JsonIgnore - public String[] getDnsSearch() { - return hostConfig.getDnsSearch(); - } - - @Override - public String[] getEntrypoint() { - return entrypoint; - } - - @Override - public String[] getEnv() { - return env; - } - - @Override - @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); - } - - @Override - @JsonIgnore - public String[] getExtraHosts() { - return hostConfig.getExtraHosts(); - } - - @Override - public HostConfig getHostConfig() { - return hostConfig; - } - - @Override - public String getHostName() { - return hostName; - } - - @Override - public String getDomainName() { + + @JsonProperty("User") + private String user = ""; + + @JsonProperty("Memory") + private long memoryLimit = 0; + + @JsonProperty("MemorySwap") + private long memorySwap = 0; + + @JsonProperty("CpuShares") + private int cpuShares = 0; + + @JsonProperty("Cpuset") + private String cpuset; + + @JsonProperty("AttachStdin") + private boolean attachStdin = false; + + @JsonProperty("AttachStdout") + private boolean attachStdout = false; + + @JsonProperty("AttachStderr") + private boolean attachStderr = false; + + @JsonProperty("PortSpecs") + private String[] portSpecs; + + @JsonProperty("Tty") + private boolean tty = false; + + @JsonProperty("OpenStdin") + private boolean stdinOpen = false; + + @JsonProperty("StdinOnce") + private boolean stdInOnce = false; + + @JsonProperty("Env") + private String[] env; + + @JsonProperty("Cmd") + private String[] cmd; + + @JsonProperty("Entrypoint") + private String[] entrypoint; + + @JsonProperty("Image") + private String image; + + @JsonProperty("Volumes") + private Volumes volumes = new Volumes(); + + @JsonProperty("WorkingDir") + private String workingDir = ""; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("NetworkDisabled") + private boolean networkDisabled = false; + + @JsonProperty("ExposedPorts") + private ExposedPorts exposedPorts = new ExposedPorts(); + + @JsonProperty("HostConfig") + private HostConfig hostConfig = new HostConfig(); + + public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { + super(exec); + checkNotNull(image, "image was not specified"); + withImage(image); + } + + /** + * @throws NotFoundException + * No such container + * @throws ConflictException + * Named container already exists + */ + @Override + public CreateContainerResponse exec() throws NotFoundException, ConflictException { + return super.exec(); + } + + @Override + @JsonIgnore + public Bind[] getBinds() { + return hostConfig.getBinds(); + } + + @Override + public Capability[] getCapAdd() { + return hostConfig.getCapAdd(); + } + + @Override + public Capability[] getCapDrop() { + return hostConfig.getCapDrop(); + } + + @Override + public String[] getCmd() { + return cmd; + } + + @Override + public String getCpuset() { + return cpuset; + } + + @Override + public int getCpuShares() { + return cpuShares; + } + + @Override + @JsonIgnore + public Device[] getDevices() { + return hostConfig.getDevices(); + } + + @Override + @JsonIgnore + public String[] getDns() { + return hostConfig.getDns(); + } + + @Override + @JsonIgnore + public String[] getDnsSearch() { + return hostConfig.getDnsSearch(); + } + + @Override + public String[] getEntrypoint() { + return entrypoint; + } + + @Override + public String[] getEnv() { + return env; + } + + @Override + @JsonIgnore + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); + } + + @Override + @JsonIgnore + public String[] getExtraHosts() { + return hostConfig.getExtraHosts(); + } + + @Override + public HostConfig getHostConfig() { + return hostConfig; + } + + @Override + public String getHostName() { + return hostName; + } + + @Override + public String getDomainName() { return domainName; } - @Override - public String getImage() { - return image; - } - - @Override - @JsonIgnore - public Link[] getLinks() { - return hostConfig.getLinks(); - } - - @Override - @JsonIgnore - public LxcConf[] getLxcConf() { - return hostConfig.getLxcConf(); - } - - public String getMacAddress() { - return macAddress; - } - - @Override - public long getMemoryLimit() { - return memoryLimit; - } - - @Override - public long getMemorySwap() { - return memorySwap; - } - - @Override - public String getName() { - return name; - } - - @Override - @JsonIgnore - public String getNetworkMode() { - return hostConfig.getNetworkMode(); - } - - @Override - @JsonIgnore - public Ports getPortBindings() { - return hostConfig.getPortBindings(); - } - - @Override - public String[] getPortSpecs() { - return portSpecs; - } - - @Override - @JsonIgnore - public RestartPolicy getRestartPolicy() { - return hostConfig.getRestartPolicy(); - } - - @Override - public String getUser() { - return user; - } - - @Override - @JsonIgnore - public Volume[] getVolumes() { - return volumes.getVolumes(); - } - - @Override - @JsonIgnore - public VolumesFrom[] getVolumesFrom() { - return hostConfig.getVolumesFrom(); - } - - @Override - public String getWorkingDir() { - return workingDir; - } - - @Override - public boolean isAttachStderr() { - return attachStderr; - } - - @Override - public boolean isAttachStdin() { - return attachStdin; - } - - @Override - public boolean isAttachStdout() { - return attachStdout; - } - - @Override - public boolean isNetworkDisabled() { - return networkDisabled; - } - - @Override - @JsonIgnore - public Boolean isPrivileged() { - return hostConfig.isPrivileged(); - } - - @Override - @JsonIgnore - public Boolean isPublishAllPorts() { - return hostConfig.isPublishAllPorts(); - } - - @Override - public boolean isStdInOnce() { - return stdInOnce; - } - - @Override - public boolean isStdinOpen() { - return stdinOpen; - } - - @Override - public boolean isTty() { - return tty; - } - - @Override - public String toString() { - return new ToStringBuilder(this).append("create container ") - .append(name != null ? "name=" + name + " " : "").append(this) - .toString(); - } - - @Override - public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { - this.attachStderr = attachStderr; - return this; - } - - @Override - public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { - this.attachStdin = attachStdin; - return this; - } - - @Override - public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { - this.attachStdout = attachStdout; - return this; - } - - @Override - public CreateContainerCmd withBinds(Bind... binds) { - hostConfig.setBinds(binds); - return this; - } - - @Override - public CreateContainerCmd withCapAdd(Capability... capAdd) { - hostConfig.setCapAdd(capAdd); - return this; - } - - @Override - public CreateContainerCmd withCapDrop(Capability... capDrop) { - hostConfig.setCapDrop(capDrop); - return this; - } - - @Override - public CreateContainerCmdImpl withCmd(String... cmd) { - this.cmd = cmd; - return this; - } - - @Override - public CreateContainerCmdImpl withCpuset(String cpuset) { - this.cpuset = cpuset; - return this; - } - - @Override - public CreateContainerCmdImpl withCpuShares(int cpuShares) { - this.cpuShares = cpuShares; - return this; - } - - @Override - public CreateContainerCmd withDevices(Device... devices) { - this.hostConfig.setDevices(devices); - return this; - } - - @Override - public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { - this.networkDisabled = disableNetwork; - return this; - } - - @Override - public CreateContainerCmdImpl withDns(String... dns) { - this.hostConfig.setDns(dns); - return this; - } - - @Override - public CreateContainerCmd withDnsSearch(String... dnsSearch) { - this.hostConfig.setDnsSearch(dnsSearch); - return this; - } - - @Override - public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { - this.entrypoint = entrypoint; - return this; - } - - @Override - public CreateContainerCmdImpl withEnv(String... env) { - this.env = env; - return this; - } - - @Override - public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { - this.exposedPorts = new ExposedPorts(exposedPorts); - return this; - } - - @Override - public CreateContainerCmd withExtraHosts(String... extraHosts) { - this.hostConfig.setExtraHosts(extraHosts); - return this; - } - - @Override - public CreateContainerCmd withHostConfig(HostConfig hostConfig) { - checkNotNull(hostConfig, "no host config was specified"); - this.hostConfig = hostConfig; - return this; - } - - @Override - public CreateContainerCmdImpl withHostName(String hostName) { - this.hostName = hostName; - return this; - } - - @Override + @Override + public String getImage() { + return image; + } + + @Override + @JsonIgnore + public Link[] getLinks() { + return hostConfig.getLinks(); + } + + @Override + @JsonIgnore + public LxcConf[] getLxcConf() { + return hostConfig.getLxcConf(); + } + + public String getMacAddress() { + return macAddress; + } + + @Override + public long getMemoryLimit() { + return memoryLimit; + } + + @Override + public long getMemorySwap() { + return memorySwap; + } + + @Override + public String getName() { + return name; + } + + @Override + @JsonIgnore + public String getNetworkMode() { + return hostConfig.getNetworkMode(); + } + + @Override + @JsonIgnore + public Ports getPortBindings() { + return hostConfig.getPortBindings(); + } + + @Override + public String[] getPortSpecs() { + return portSpecs; + } + + @Override + @JsonIgnore + public RestartPolicy getRestartPolicy() { + return hostConfig.getRestartPolicy(); + } + + @Override + public String getUser() { + return user; + } + + @Override + @JsonIgnore + public Volume[] getVolumes() { + return volumes.getVolumes(); + } + + @Override + @JsonIgnore + public VolumesFrom[] getVolumesFrom() { + return hostConfig.getVolumesFrom(); + } + + @Override + public String getWorkingDir() { + return workingDir; + } + + @Override + public boolean isAttachStderr() { + return attachStderr; + } + + @Override + public boolean isAttachStdin() { + return attachStdin; + } + + @Override + public boolean isAttachStdout() { + return attachStdout; + } + + @Override + public boolean isNetworkDisabled() { + return networkDisabled; + } + + @Override + @JsonIgnore + public Boolean isPrivileged() { + return hostConfig.isPrivileged(); + } + + @Override + @JsonIgnore + public Boolean isPublishAllPorts() { + return hostConfig.isPublishAllPorts(); + } + + @Override + public boolean isStdInOnce() { + return stdInOnce; + } + + @Override + public boolean isStdinOpen() { + return stdinOpen; + } + + @Override + public boolean isTty() { + return tty; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("create container ").append(name != null ? "name=" + name + " " : "") + .append(this).toString(); + } + + @Override + public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + @Override + public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + @Override + public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + @Override + public CreateContainerCmd withBinds(Bind... binds) { + hostConfig.setBinds(binds); + return this; + } + + @Override + public CreateContainerCmd withCapAdd(Capability... capAdd) { + hostConfig.setCapAdd(capAdd); + return this; + } + + @Override + public CreateContainerCmd withCapDrop(Capability... capDrop) { + hostConfig.setCapDrop(capDrop); + return this; + } + + @Override + public CreateContainerCmdImpl withCmd(String... cmd) { + this.cmd = cmd; + return this; + } + + @Override + public CreateContainerCmdImpl withCpuset(String cpuset) { + this.cpuset = cpuset; + return this; + } + + @Override + public CreateContainerCmdImpl withCpuShares(int cpuShares) { + this.cpuShares = cpuShares; + return this; + } + + @Override + public CreateContainerCmd withDevices(Device... devices) { + this.hostConfig.setDevices(devices); + return this; + } + + @Override + public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { + this.networkDisabled = disableNetwork; + return this; + } + + @Override + public CreateContainerCmdImpl withDns(String... dns) { + this.hostConfig.setDns(dns); + return this; + } + + @Override + public CreateContainerCmd withDnsSearch(String... dnsSearch) { + this.hostConfig.setDnsSearch(dnsSearch); + return this; + } + + @Override + public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { + this.entrypoint = entrypoint; + return this; + } + + @Override + public CreateContainerCmdImpl withEnv(String... env) { + this.env = env; + return this; + } + + @Override + public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { + this.exposedPorts = new ExposedPorts(exposedPorts); + return this; + } + + @Override + public CreateContainerCmd withExtraHosts(String... extraHosts) { + this.hostConfig.setExtraHosts(extraHosts); + return this; + } + + @Override + public CreateContainerCmd withHostConfig(HostConfig hostConfig) { + checkNotNull(hostConfig, "no host config was specified"); + this.hostConfig = hostConfig; + return this; + } + + @Override + public CreateContainerCmdImpl withHostName(String hostName) { + this.hostName = hostName; + return this; + } + + @Override public CreateContainerCmdImpl withDomainName(String domainName) { this.domainName = domainName; return this; } - @Override - public CreateContainerCmdImpl withImage(String image) { - this.image = image; - return this; - } - - @Override - public CreateContainerCmdImpl withLinks(Link... links) { - checkNotNull(links, "links was not specified"); - this.hostConfig.setLinks(links); - return this; - } - - @Override - public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - this.hostConfig.setLxcConf(lxcConf); - return this; - } - - @Override - public CreateContainerCmdImpl withMacAddress(String macAddress) { - this.macAddress = macAddress; - return this; - } - - @Override - public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { - this.memoryLimit = memoryLimit; - return this; - } - - @Override - public CreateContainerCmdImpl withMemorySwap(long memorySwap) { - this.memorySwap = memorySwap; - return this; - } - - @Override - public CreateContainerCmdImpl withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; - } - - @Override - public CreateContainerCmd withNetworkMode(String networkMode) { - checkNotNull(networkMode, "networkMode was not specified"); - this.hostConfig.setNetworkMode(networkMode); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(PortBinding... portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.setPortBindings(new Ports(portBindings)); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(Ports portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.setPortBindings(portBindings); - return this; - } - - @Override - public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { - this.portSpecs = portSpecs; - return this; - } - - @Override - public CreateContainerCmd withPrivileged(boolean privileged) { - this.hostConfig.setPrivileged(privileged); - return this; - } - - @Override - public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { - this.hostConfig.setPublishAllPorts(publishAllPorts); - return this; - } - - @Override - public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - this.hostConfig.setRestartPolicy(restartPolicy); - return this; - } - - @Override - public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { - this.stdInOnce = stdInOnce; - return this; - } - - @Override - public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { - this.stdinOpen = stdinOpen; - return this; - } - - @Override - public CreateContainerCmdImpl withTty(boolean tty) { - this.tty = tty; - return this; - } - - @Override - public CreateContainerCmdImpl withUser(String user) { - this.user = user; - return this; - } - - @Override - public CreateContainerCmdImpl withVolumes(Volume... volumes) { - this.volumes = new Volumes(volumes); - return this; - } - - @Override - public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { - this.hostConfig.setVolumesFrom(volumesFrom); - return this; - } - - @Override - public CreateContainerCmdImpl withWorkingDir(String workingDir) { - this.workingDir = workingDir; - return this; - } + @Override + public CreateContainerCmdImpl withImage(String image) { + this.image = image; + return this; + } + + @Override + public CreateContainerCmdImpl withLinks(Link... links) { + checkNotNull(links, "links was not specified"); + this.hostConfig.setLinks(links); + return this; + } + + @Override + public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { + checkNotNull(lxcConf, "lxcConf was not specified"); + this.hostConfig.setLxcConf(lxcConf); + return this; + } + + @Override + public CreateContainerCmdImpl withMacAddress(String macAddress) { + this.macAddress = macAddress; + return this; + } + + @Override + public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { + this.memoryLimit = memoryLimit; + return this; + } + + @Override + public CreateContainerCmdImpl withMemorySwap(long memorySwap) { + this.memorySwap = memorySwap; + return this; + } + + @Override + public CreateContainerCmdImpl withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public CreateContainerCmd withNetworkMode(String networkMode) { + checkNotNull(networkMode, "networkMode was not specified"); + this.hostConfig.setNetworkMode(networkMode); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(PortBinding... portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(new Ports(portBindings)); + return this; + } + + @Override + public CreateContainerCmd withPortBindings(Ports portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + this.hostConfig.setPortBindings(portBindings); + return this; + } + + @Override + public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { + this.portSpecs = portSpecs; + return this; + } + + @Override + public CreateContainerCmd withPrivileged(boolean privileged) { + this.hostConfig.setPrivileged(privileged); + return this; + } + + @Override + public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { + this.hostConfig.setPublishAllPorts(publishAllPorts); + return this; + } + + @Override + public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + this.hostConfig.setRestartPolicy(restartPolicy); + return this; + } + + @Override + public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { + this.stdInOnce = stdInOnce; + return this; + } + + @Override + public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { + this.stdinOpen = stdinOpen; + return this; + } + + @Override + public CreateContainerCmdImpl withTty(boolean tty) { + this.tty = tty; + return this; + } + + @Override + public CreateContainerCmdImpl withUser(String user) { + this.user = user; + return this; + } + + @Override + public CreateContainerCmdImpl withVolumes(Volume... volumes) { + this.volumes = new Volumes(volumes); + return this; + } + + @Override + public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { + this.hostConfig.setVolumesFrom(volumesFrom); + return this; + } + + @Override + public CreateContainerCmdImpl withWorkingDir(String workingDir) { + this.workingDir = workingDir; + return this; + } } From d22fe533358dc74bfa2988f529a0c627130cfadd Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 21:52:21 +0200 Subject: [PATCH 0242/1399] Fix imports --- .../com/github/dockerjava/api/command/CreateContainerCmd.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index be6e83adf..3b558b6d9 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -14,7 +14,6 @@ import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; -import com.github.dockerjava.core.command.CreateContainerCmdImpl; public interface CreateContainerCmd extends DockerCmd { From 651446b7a6da43eb1a96699cab7868b25ddc1f48 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 16 Jun 2015 23:05:35 +0200 Subject: [PATCH 0243/1399] Removed deprecated start options --- .../api/command/StartContainerCmd.java | 170 +--- .../core/command/StartContainerCmdImpl.java | 298 +------ .../command/StartContainerCmdImplTest.java | 830 ++++++++---------- 3 files changed, 401 insertions(+), 897 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index aeddfd0bd..2195e1eca 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -2,170 +2,26 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Capability; -import com.github.dockerjava.api.model.Device; -import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.LxcConf; -import com.github.dockerjava.api.model.PortBinding; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.RestartPolicy; -import com.github.dockerjava.api.model.VolumesFrom; /** * Start a container. - * - * TODO: Almost all methods are deprecated as they have corresponding siblings in {@link CreateContainerCmd} now. + * */ public interface StartContainerCmd extends DockerCmd { - public static interface Exec extends DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } - /** - * @throws NotFoundException - * No such container - * @throws NotModifiedException - * Container already started - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException; + String getContainerId(); - public Bind[] getBinds(); - - public Capability[] getCapAdd(); - - public Capability[] getCapDrop(); - - public String getContainerId(); - - public Device[] getDevices(); - - public String[] getDns(); - - public String[] getDnsSearch(); - - public String[] getExtraHosts(); - - public Link[] getLinks(); - - public LxcConf[] getLxcConf(); - - public String getNetworkMode(); - - public Ports getPortBindings(); - - public RestartPolicy getRestartPolicy(); - - public VolumesFrom[] getVolumesFrom(); - - public Boolean isPrivileged(); - - public Boolean isPublishAllPorts(); - - @Deprecated - public StartContainerCmd withBinds(Bind... binds); - - /** - * Add linux kernel - * capability to the container. For example: adding {@link Capability#MKNOD} - * allows the container to create special files using the 'mknod' command. - */ - @Deprecated - public StartContainerCmd withCapAdd(Capability... capAdd); - - /** - * Drop linux kernel - * capability from the container. For example: dropping {@link Capability#CHOWN} - * prevents the container from changing the owner of any files. - */ - @Deprecated - public StartContainerCmd withCapDrop(Capability... capDrop); - - @Deprecated - public StartContainerCmd withContainerId(String containerId); - - /** - * Add host devices to the container - */ - @Deprecated - public StartContainerCmd withDevices(Device... devices); - - /** - * Set custom DNS servers - */ - @Deprecated - public StartContainerCmd withDns(String... dns); - - /** - * Set custom DNS search domains - */ - @Deprecated - public StartContainerCmd withDnsSearch(String... dnsSearch); - - /** - * Add hostnames to /etc/hosts in the container - */ - @Deprecated - public StartContainerCmd withExtraHosts(String... extraHosts); - - /** - * Add link to another container. - */ - @Deprecated - public StartContainerCmd withLinks(Link... links); - - @Deprecated - public StartContainerCmd withLxcConf(LxcConf... lxcConf); - - /** - * Set the Network mode for the container - *
    - *
  • 'bridge': creates a new network stack for the container on the docker - * bridge
  • - *
  • 'none': no networking for this container
  • - *
  • 'container:': reuses another container network stack
  • - *
  • 'host': use the host network stack inside the container. Note: the - * host mode gives the container full access to local system services such - * as D-bus and is therefore considered insecure.
  • - *
- */ - @Deprecated - public StartContainerCmd withNetworkMode(String networkMode); - - /** - * Add one or more {@link PortBinding}s. - * This corresponds to the --publish (-p) - * option of the docker run CLI command. - */ - @Deprecated - public StartContainerCmd withPortBindings(PortBinding... portBindings); - - /** - * Add the port bindings that are contained in the given {@link Ports} - * object. - * - * @see #withPortBindings(PortBinding...) - */ - @Deprecated - public StartContainerCmd withPortBindings(Ports portBindings); - - @Deprecated - public StartContainerCmd withPrivileged(Boolean privileged); - - @Deprecated - public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts); - - /** - * Set custom {@link RestartPolicy} for the container. Defaults to - * {@link RestartPolicy#noRestart()} - */ - @Deprecated - public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy); - - @Deprecated - public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); + StartContainerCmd withContainerId(String containerId); + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already started + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException; } diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 27fca12f8..6fe60734d 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -7,22 +7,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Binds; -import com.github.dockerjava.api.model.Capability; -import com.github.dockerjava.api.model.Device; -import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.Links; -import com.github.dockerjava.api.model.LxcConf; -import com.github.dockerjava.api.model.PortBinding; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.RestartPolicy; -import com.github.dockerjava.api.model.VolumesFrom; - /** * Start a container @@ -30,276 +17,39 @@ @JsonInclude(NON_EMPTY) public class StartContainerCmdImpl extends AbstrDockerCmd implements StartContainerCmd { - @JsonIgnore - private String containerId; - - @JsonProperty("Binds") - private Binds binds; - - @JsonProperty("Links") - private Links links; - - @JsonProperty("LxcConf") - private LxcConf[] lxcConf; - - @JsonProperty("PortBindings") - private Ports portBindings; - - @JsonProperty("PublishAllPorts") - private Boolean publishAllPorts; - - @JsonProperty("Privileged") - private Boolean privileged; - - @JsonProperty("Dns") - private String[] dns; - - @JsonProperty("DnsSearch") - private String[] dnsSearch; - - @JsonProperty("VolumesFrom") - private VolumesFrom[] volumesFrom; - - @JsonProperty("NetworkMode") - private String networkMode; - - @JsonProperty("Devices") - private Device[] devices; - - @JsonProperty("ExtraHosts") - private String[] extraHosts; - - @JsonProperty("RestartPolicy") - private RestartPolicy restartPolicy; - - @JsonProperty("CapAdd") - private Capability[] capAdd; - - @JsonProperty("CapDrop") - private Capability[] capDrop; - - public StartContainerCmdImpl(StartContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } - - @Override - @JsonIgnore - public Bind[] getBinds() { - return (binds == null) ? new Bind[0] : binds.getBinds(); - } - - @Override - @JsonIgnore - public Link[] getLinks() { - return (links == null) ? new Link[0] : links.getLinks(); - } + @JsonIgnore + private String containerId; - @Override - public LxcConf[] getLxcConf() { - return lxcConf; - } - - @Override - public Ports getPortBindings() { - return portBindings; - } - - @Override - public Boolean isPublishAllPorts() { - return publishAllPorts; - } - - @Override - public Boolean isPrivileged() { - return privileged; - } - - @Override - public String[] getDns() { - return dns; - } - - @Override - public String[] getDnsSearch() { - return dnsSearch; - } - - @Override - public VolumesFrom[] getVolumesFrom() { - return volumesFrom; - } - - @Override - public String getContainerId() { - return containerId; - } - - @Override - public String getNetworkMode() { - return networkMode; - } - - @Override - public Device[] getDevices() { - return devices; - } - - @Override - public String[] getExtraHosts() { - return extraHosts; - } - - @Override - public RestartPolicy getRestartPolicy() { - return restartPolicy; + public StartContainerCmdImpl(StartContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); } - - @Override - public Capability[] getCapAdd() { - return capAdd; - } - + @Override - public Capability[] getCapDrop() { - return capDrop; + public StartContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; } - @Override - @JsonIgnore - public StartContainerCmd withBinds(Bind... binds) { - checkNotNull(binds, "binds was not specified"); - this.binds = new Binds(binds); - return this; - } - - @Override - @JsonIgnore - public StartContainerCmd withLinks(Link... links) { - checkNotNull(links, "links was not specified"); - this.links = new Links(links); - return this; - } - - @Override - public StartContainerCmd withLxcConf(LxcConf... lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - this.lxcConf = lxcConf; - return this; - } - - @Override - public StartContainerCmd withPortBindings(Ports portBindings) { - checkNotNull(portBindings, - "portBindings was not specified"); - this.portBindings = portBindings; - return this; - } - - @Override - public StartContainerCmd withPortBindings(PortBinding... portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - if (this.portBindings == null) { - this.portBindings = new Ports(); - } - this.portBindings.add(portBindings); - return this; - } - - @Override - public StartContainerCmd withPrivileged(Boolean privileged) { - this.privileged = privileged; - return this; - } - - @Override - public StartContainerCmd withPublishAllPorts(Boolean publishAllPorts) { - this.publishAllPorts = publishAllPorts; - return this; - } - - @Override - public StartContainerCmd withDns(String... dns) { - checkNotNull(dns, "dns was not specified"); - this.dns = dns; - return this; - } - - @Override - public StartContainerCmd withDnsSearch(String... dnsSearch) { - checkNotNull(dnsSearch, "dnsSearch was not specified"); - this.dnsSearch = dnsSearch; - return this; - } - - @Override - public StartContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) { - checkNotNull(volumesFrom, "volumesFrom was not specified"); - this.volumesFrom = volumesFrom; - return this; - } - - @Override - public StartContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; + @Override + public String getContainerId() { + return containerId; } @Override - public StartContainerCmd withNetworkMode(String networkMode) { - checkNotNull(networkMode, "networkMode was not specified"); - this.networkMode = networkMode; - return this; + public String toString() { + return ToStringBuilder.reflectionToString(this).toString(); } - - @Override - public StartContainerCmd withDevices(Device... devices) { - checkNotNull(devices, "devices was not specified"); - this.devices = devices; - return this; - } + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already started + */ @Override - public StartContainerCmd withExtraHosts(String... extraHosts) { - checkNotNull(extraHosts, "extraHosts was not specified"); - this.extraHosts = extraHosts; - return this; - } - - - @Override - public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - checkNotNull(restartPolicy, "restartPolicy was not specified"); - this.restartPolicy = restartPolicy; - return this; - } - - @Override - public StartContainerCmd withCapAdd(Capability... capAdd) { - checkNotNull(capAdd, "capAdd was not specified"); - this.capAdd = capAdd; - return this; - } - - @Override - public StartContainerCmd withCapDrop(Capability... capDrop) { - checkNotNull(capDrop, "capDrop was not specified"); - this.capDrop = capDrop; - return this; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this).toString(); - } - - /** - * @throws NotFoundException No such container - * @throws NotModifiedException Container already started - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException { - return super.exec(); - } + public Void exec() throws NotFoundException, NotModifiedException { + return super.exec(); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 640839915..d690f4e13 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -1,8 +1,8 @@ package com.github.dockerjava.core.command; import static com.github.dockerjava.api.model.AccessMode.ro; -import static com.github.dockerjava.api.model.Capability.*; -import static org.hamcrest.CoreMatchers.nullValue; +import static com.github.dockerjava.api.model.Capability.MKNOD; +import static com.github.dockerjava.api.model.Capability.NET_ADMIN; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; @@ -13,16 +13,8 @@ import static org.hamcrest.Matchers.startsWith; import java.lang.reflect.Method; -import java.util.*; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.model.*; +import java.util.Arrays; +import java.util.UUID; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -31,624 +23,530 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeRW; +import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class StartContainerCmdImplTest extends AbstractDockerClientTest { - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void startContainerWithVolumes() throws DockerException { + + // see http://docs.docker.io/use/working_with_volumes/ + Volume volume1 = new Volume("/opt/webapp1"); + + Volume volume2 = new Volume("/opt/webapp2"); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume1, volume2) + .withCmd("true").withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)) + .exec(); - @AfterTest - public void afterTest() { - super.afterTest(); - } + LOG.info("Created container {}", container.toString()); - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + assertThat(container.getId(), not(isEmptyString())); - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - @Test - public void startContainerWithVolumes() throws DockerException { + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/opt/webapp1", "/opt/webapp2")); - // see http://docs.docker.io/use/working_with_volumes/ - Volume volume1 = new Volume("/opt/webapp1"); + dockerClient.startContainerCmd(container.getId()).exec(); - Volume volume2 = new Volume("/opt/webapp2"); + dockerClient.waitContainerCmd(container.getId()).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withVolumes(volume1, volume2) - .withCmd("true").exec(); + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - LOG.info("Created container {}", container.toString()); + assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); - assertThat(container.getId(), not(isEmptyString())); + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), + contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2))); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + } - assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), - contains("/opt/webapp1", "/opt/webapp2")); + @Test + public void startContainerWithVolumesFrom() throws DockerException { - dockerClient - .startContainerCmd(container.getId()) - .withBinds(new Bind("/src/webapp1", volume1, ro), - new Bind("/src/webapp2", volume2)).exec(); + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); - dockerClient.waitContainerCmd(container.getId()).exec(); + String container1Name = UUID.randomUUID().toString(); - inspectContainerResponse = dockerClient.inspectContainerCmd( - container.getId()).exec(); + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name) + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Created container1 {}", container1.toString()); - assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); + dockerClient.startContainerCmd(container1.getId()).exec(); + LOG.info("Started container1 {}", container1.toString()); - assertThat( - Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW( - volume2))); + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); - } + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); - @Test - public void startContainerWithVolumesFrom() throws DockerException { + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withVolumesFrom(new VolumesFrom(container1Name)).exec(); + LOG.info("Created container2 {}", container2.toString()); - Volume volume1 = new Volume("/opt/webapp1"); - Volume volume2 = new Volume("/opt/webapp2"); + dockerClient.startContainerCmd(container2.getId()).exec(); + LOG.info("Started container2 {}", container2.toString()); - String container1Name = UUID.randomUUID().toString(); + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container1Name).exec(); - LOG.info("Created container1 {}", container1.toString()); + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } - dockerClient - .startContainerCmd(container1.getId()) - .withBinds(new Bind("/src/webapp1", volume1), - new Bind("/src/webapp2", volume2)).exec(); - LOG.info("Started container1 {}", container1.toString()); + @Test + public void startContainerWithDns() throws DockerException { - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); + String aDnsServer = "8.8.8.8"; + String anotherDnsServer = "8.8.4.4"; - assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDns(aDnsServer, anotherDnsServer).exec(); - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container2 {}", container2.toString()); + LOG.info("Created container {}", container.toString()); - dockerClient.startContainerCmd(container2.getId()) - .withVolumesFrom(new VolumesFrom(container1Name)).exec(); - LOG.info("Started container2 {}", container2.toString()); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); - } + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - @Test - public void startContainerWithDns() throws DockerException { + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(aDnsServer, anotherDnsServer)); + } - String aDnsServer = "8.8.8.8"; - String anotherDnsServer = "8.8.4.4"; + @Test + public void startContainerWithDnsSearch() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); + String dnsSearch = "example.com"; - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDnsSearch(dnsSearch).exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container {}", container.toString()); - dockerClient.startContainerCmd(container.getId()) - .withDns(aDnsServer, anotherDnsServer).exec(); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDns()), contains(aDnsServer, anotherDnsServer)); - } + dockerClient.startContainerCmd(container.getId()).exec(); - @Test - public void startContainerWithDnsSearch() throws DockerException { + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - String dnsSearch = "example.com"; + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDnsSearch()), contains(dnsSearch)); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); + @Test + public void startContainerWithPortBindings() throws DockerException { - LOG.info("Created container {}", container.toString()); + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); - assertThat(container.getId(), not(isEmptyString())); + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); - dockerClient.startContainerCmd(container.getId()) - .withDnsSearch(dnsSearch).exec(); + LOG.info("Created container {}", container.toString()); - inspectContainerResponse = dockerClient.inspectContainerCmd( - container.getId()).exec(); + assertThat(container.getId(), not(isEmptyString())); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDnsSearch()), contains(dnsSearch)); - } + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - @Test - public void startContainerWithPortBindings() throws DockerException { + dockerClient.startContainerCmd(container.getId()).exec(); - ExposedPort tcp22 = ExposedPort.tcp(22); - ExposedPort tcp23 = ExposedPort.tcp(23); + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23).exec(); + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); - LOG.info("Created container {}", container.toString()); + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], + is(equalTo(Ports.Binding(11022)))); - assertThat(container.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], + is(equalTo(Ports.Binding(11023)))); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], + is(equalTo(Ports.Binding(11024)))); - Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + } - dockerClient.startContainerCmd(container.getId()) - .withPortBindings(portBindings).exec(); + @Test + public void startContainerWithRandomPortBindings() throws DockerException { - inspectContainerResponse = dockerClient.inspectContainerCmd( - container.getId()).exec(); + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); - assertThat(Arrays.asList(inspectContainerResponse.getConfig() - .getExposedPorts()), contains(tcp22, tcp23)); + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(null)); + portBindings.bind(tcp23, Ports.Binding(null)); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022)))); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).exec(); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023)))); + LOG.info("Created container {}", container.toString()); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024)))); + assertThat(container.getId(), not(isEmptyString())); - } + dockerClient.startContainerCmd(container.getId()).exec(); - @Test - public void startContainerWithRandomPortBindings() throws DockerException { + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - ExposedPort tcp22 = ExposedPort.tcp(22); - ExposedPort tcp23 = ExposedPort.tcp(23); + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); - Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(null)); - portBindings.bind(tcp23, Ports.Binding(null)); + assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp22)[0].getHostPort(), + is(not(equalTo(tcp22.getPort())))); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings) - .withPublishAllPorts(true).exec(); + assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp23)[0].getHostPort(), + is(not(equalTo(tcp23.getPort())))); - LOG.info("Created container {}", container.toString()); + } - assertThat(container.getId(), not(isEmptyString())); + @Test + public void startContainerWithConflictingPortBindings() throws DockerException { - dockerClient.startContainerCmd(container.getId()).exec(); + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11022)); - assertThat(Arrays.asList(inspectContainerResponse.getConfig() - .getExposedPorts()), contains(tcp22, tcp23)); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); - assertThat(inspectContainerResponse.getNetworkSettings().getPorts() - .getBindings().get(tcp22)[0].getHostPort(), is(not(equalTo(tcp22.getPort())))); + LOG.info("Created container {}", container.toString()); - assertThat(inspectContainerResponse.getNetworkSettings().getPorts() - .getBindings().get(tcp23)[0].getHostPort(), is(not(equalTo(tcp23.getPort())))); + assertThat(container.getId(), not(isEmptyString())); - } + try { + dockerClient.startContainerCmd(container.getId()).exec(); + fail("expected InternalServerErrorException"); + } catch (InternalServerErrorException e) { - @Test - public void startContainerWithConflictingPortBindings() - throws DockerException { + } - ExposedPort tcp22 = ExposedPort.tcp(22); - ExposedPort tcp23 = ExposedPort.tcp(23); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23).exec(); + @Test + public void startContainerWithLinkingDeprecated() throws DockerException { - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); - Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11022)); + dockerClient.startContainerCmd(container1.getId()).exec(); - try { - dockerClient.startContainerCmd(container.getId()) - .withPortBindings(portBindings).exec(); - fail("expected InternalServerErrorException"); - } catch (InternalServerErrorException e) { + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - } + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - } + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } - @Test - public void startContainerWithLinkingDeprecated() throws DockerException { + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container1").exec(); + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); - LOG.info("Created container1 {}", container1.toString()); - assertThat(container1.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container2.getId()).exec(); - dockerClient.startContainerCmd(container1.getId()).exec(); + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getState(), is(notNullValue())); + assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); - assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getId(), - startsWith(container1.getId())); - assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); - assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + } - if (!inspectContainerResponse1.getState().isRunning()) { - assertThat(inspectContainerResponse1.getState().getExitCode(), - is(equalTo(0))); - } + @Test + public void startContainerWithLinking() throws DockerException { - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container2").exec(); + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); - LOG.info("Created container2 {}", container2.toString()); - assertThat(container2.getId(), not(isEmptyString())); + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container2.getId()) - .withLinks(new Link("container1", "container1Link")).exec(); + dockerClient.startContainerCmd(container1.getId()).exec(); - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getHostConfig(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), - is(notNullValue())); - assertThat( - inspectContainerResponse2.getHostConfig().getLinks(), - equalTo(new Link[] { new Link("container1", "container1Link") })); - assertThat(inspectContainerResponse2.getId(), - startsWith(container2.getId())); - assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); - assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getState(), is(notNullValue())); - assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - } - - @Test - public void startContainerWithLinking() throws DockerException { - - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container1").exec(); - - LOG.info("Created container1 {}", container1.toString()); - assertThat(container1.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container1.getId()).exec(); - - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - - assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getId(), - startsWith(container1.getId())); - assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); - assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - - if (!inspectContainerResponse1.getState().isRunning()) { - assertThat(inspectContainerResponse1.getState().getExitCode(), - is(equalTo(0))); - } - - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container2") - .withLinks(new Link("container1", "container1Link")).exec(); - - LOG.info("Created container2 {}", container2.toString()); - assertThat(container2.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container2.getId()).exec(); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - - assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getHostConfig(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), - is(notNullValue())); - assertThat( - inspectContainerResponse2.getHostConfig().getLinks(), - equalTo(new Link[] { new Link("container1", "container1Link") })); - assertThat(inspectContainerResponse2.getId(), - startsWith(container2.getId())); - assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); - assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getState(), is(notNullValue())); - assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); - - } - - @Test - public void startContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd(new String[] { "top" }) - .exec(); + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } - LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); - dockerClient.startContainerCmd(container.getId()).exec(); + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + dockerClient.startContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse.getId(), not(isEmptyString())); + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - assertThat(inspectContainerResponse.getId(), - startsWith(container.getId())); + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getState(), is(notNullValue())); + assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); - assertThat(inspectContainerResponse.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse.getState(), is(notNullValue())); + } - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + @Test + public void startContainer() throws DockerException { - if (!inspectContainerResponse.getState().isRunning()) { - assertThat(inspectContainerResponse.getState().getExitCode(), - is(equalTo(0))); - } - } + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] { "top" }) + .exec(); - @Test - public void testStartNonExistingContainer() throws DockerException { - try { - dockerClient.startContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - /** - * This tests support for --net option for the docker run command: - * --net="bridge" Set the Network mode for the container 'bridge': creates a - * new network stack for the container on the docker bridge 'none': no - * networking for this container 'container:': reuses another container - * network stack 'host': use the host network stack inside the container. - * Note: the host mode gives the container full access to local system - * services such as D-bus and is therefore considered insecure. - */ - @Test - public void startContainerWithNetworkMode() throws DockerException { + dockerClient.startContainerCmd(container.getId()).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - LOG.info("Created container {}", container.toString()); + assertThat(inspectContainerResponse.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse.getId(), not(isEmptyString())); - assertThat(container.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse.getId(), startsWith(container.getId())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse.getState(), is(notNullValue())); - dockerClient.startContainerCmd(container.getId()) - .withNetworkMode("host").exec(); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - inspectContainerResponse = dockerClient.inspectContainerCmd( - container.getId()).exec(); + if (!inspectContainerResponse.getState().isRunning()) { + assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(0))); + } + } - assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), - is(equalTo("host"))); - } + @Test + public void testStartNonExistingContainer() throws DockerException { + try { + dockerClient.startContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } - @Test - public void startContainerWithCapAddAndCapDrop() throws DockerException { + /** + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the + * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for + * this container 'container:': reuses another container network stack 'host': use the host network stack inside the + * container. Note: the host mode gives the container full access to local system services such as D-bus and is + * therefore considered insecure. + */ + @Test + public void startContainerWithNetworkMode() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withNetworkMode("host").exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).withCapAdd(NET_ADMIN) - .withCapDrop(MKNOD).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapAdd()), contains(NET_ADMIN)); + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host"))); + } - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapDrop()), contains(MKNOD)); - } + @Test + public void startContainerWithCapAddAndCapDrop() throws DockerException { - @Test - public void startContainerWithDevices() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withCapAdd(NET_ADMIN).withCapDrop(MKNOD).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container {}", container.toString()); - LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.startContainerCmd(container.getId()) - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) - .exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN)); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDevices()), contains(new Device("rwm", "/dev/nulo", - "/dev/zero"))); - } + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD)); + } - @Test - public void startContainerWithExtraHosts() throws DockerException { + @Test + public void startContainerWithDevices() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()) - .withExtraHosts("dockerhost:127.0.0.1").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getExtraHosts()), contains("dockerhost:127.0.0.1")); - } + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", + "/dev/nulo", "/dev/zero"))); + } - @Test - public void startContainerWithRestartPolicy() throws DockerException { + @Test + public void startContainerWithExtraHosts() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withExtraHosts("dockerhost:127.0.0.1").exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); + dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.startContainerCmd(container.getId()) - .withRestartPolicy(restartPolicy).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), + contains("dockerhost:127.0.0.1")); + } - assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), - is(equalTo(restartPolicy))); - } + @Test + public void startContainerWithRestartPolicy() throws DockerException { - @Test - public void existingHostConfigIsPreservedByBlankStartCmd() - throws DockerException { + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - String dnsServer = "8.8.8.8"; + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy).exec(); - // prepare a container with custom DNS - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withDns(dnsServer) - .withCmd("true").exec(); + LOG.info("Created container {}", container.toString()); - LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); - // start container _without_any_customization_ (important!) - dockerClient.startContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); - // The DNS setting survived. - assertThat(inspectContainerResponse.getHostConfig().getDns(), - is(notNullValue())); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDns()), contains(dnsServer)); - } + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); + } - @Test - public void existingHostConfigIsResetByConfiguredStartCmd() - throws DockerException { - // As of version 1.3.2, Docker assumes that you either configure a - // container - // when creating it or when starting it, but not mixing both. - // See https://github.com/docker-java/docker-java/pull/111 - // If this test starts to fail, this behavior changed and a review of - // implementation - // and documentation might be needed. + @Test + public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerException { - String dnsServer = "8.8.8.8"; + String dnsServer = "8.8.8.8"; - // prepare a container with custom DNS - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withDns(dnsServer) - .withCmd("true").exec(); + // prepare a container with custom DNS + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withDns(dnsServer) + .withCmd("true").exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - // modify another setting in start command. Leave DNS unchanged. - dockerClient.startContainerCmd(container.getId()) - .withPublishAllPorts(true).exec(); + // start container _without_any_customization_ (important!) + dockerClient.startContainerCmd(container.getId()).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - // although start did not modify DNS Settings, they were reset to their - // default. - assertThat(inspectContainerResponse.getHostConfig().getDns(), - is(nullValue(String[].class))); - } + // The DNS setting survived. + assertThat(inspectContainerResponse.getHostConfig().getDns(), is(notNullValue())); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), contains(dnsServer)); + } - @Test - public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception { - ObjectMapper objectMapper = new ObjectMapper(); - StartContainerCmd command = dockerClient.startContainerCmd(""); - assertThat(objectMapper.writeValueAsString(command), is("{}")); - } + @Test + public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + StartContainerCmd command = dockerClient.startContainerCmd(""); + assertThat(objectMapper.writeValueAsString(command), is("{}")); + } } From 8cefba38e675fcdac985081e777450b7f545566c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 16 Jun 2015 23:10:30 +0200 Subject: [PATCH 0244/1399] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b71f4e928..b76a052d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ Change Log === Latest SNAPSHOT --- +* [#248](https://github.com/docker-java/docker-java/pull/233) Removed deprecated start options +* [#247](https://github.com/docker-java/docker-java/pull/247) Add Domainname attribute on create command +* [#245](https://github.com/docker-java/docker-java/pull/245) Added ReadonlyRootfs option * [#233](https://github.com/docker-java/docker-java/pull/233) Labels are array of Strings (fixes #232) * [#189](https://github.com/docker-java/docker-java/pull/189) Add docker stats support From f557ea4fa810c1b3c630aa4b184de4f5629f53ce Mon Sep 17 00:00:00 2001 From: Chris Pheby Date: Tue, 16 Jun 2015 22:12:26 +0100 Subject: [PATCH 0245/1399] Fixing execution on Windows platforms --- .../dockerjava/core/command/FrameReader.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index c39791460..bb36c1764 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -38,23 +38,34 @@ private static StreamType streamType(byte streamType) { */ public Frame readFrame() throws IOException { byte[] header = new byte[HEADER_SIZE]; - int headerSize = inputStream.read(header); - if (headerSize == -1) { - return null; - } + int actualHeaderSize = 0; - if (headerSize != HEADER_SIZE) { - throw new IOException(String.format("header must be %d bytes long, but was %d", HEADER_SIZE, headerSize)); - } + do { + int headerCount = inputStream.read(header, actualHeaderSize, HEADER_SIZE - actualHeaderSize); + + if (headerCount == -1) { + return null; + } + actualHeaderSize += headerCount; + } while (actualHeaderSize < HEADER_SIZE); int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); byte[] payload = new byte[payloadSize]; - int actualPayloadSize = inputStream.read(payload); - if (actualPayloadSize != payloadSize) { - throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize)); - } + int actualPayloadSize = 0; + + do { + int count = inputStream.read(payload, actualPayloadSize, payloadSize - actualPayloadSize); + + if (count == -1) { + if (actualPayloadSize != payloadSize) { + throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize)); + } + break; + } + actualPayloadSize += count; + } while (actualPayloadSize < payloadSize); return new Frame(streamType(header[0]), payload); } From 6d98872847e3f33b534bbc94e6264aad31aaedbf Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 17 Jun 2015 00:32:06 +0300 Subject: [PATCH 0246/1399] Update CreateContainer with 1.19 changes --- .../api/command/CreateContainerCmd.java | 40 +++++++++++++ .../core/command/CreateContainerCmdImpl.java | 56 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index 3b558b6d9..136b5aecc 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -41,6 +41,26 @@ public static interface Exec extends DockerCmdExec Date: Sat, 20 Jun 2015 19:35:39 -0700 Subject: [PATCH 0247/1399] Adding Node type for Swarm support: --- .../github/dockerjava/api/model/Event.java | 9 +++++ .../com/github/dockerjava/api/model/Node.java | 37 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/model/Node.java diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java index cb961f97d..b68d5b9a6 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -1,10 +1,12 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.apache.commons.lang.builder.ToStringBuilder; /** * Representation of a Docker event. */ +@JsonIgnoreProperties(ignoreUnknown = true) public class Event { private String status; @@ -14,6 +16,9 @@ public class Event { private long time; + @JsonIgnoreProperties + private Node node; + /** * Default constructor for the deserialization. */ @@ -71,6 +76,10 @@ public long getTime() { return time; } + public Node getNode() { + return node; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/model/Node.java b/src/main/java/com/github/dockerjava/api/model/Node.java new file mode 100644 index 000000000..4fcf04e69 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Node.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * A node as returned by the /events API, for instance, when Swarm is used. + */ +public class Node { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Id") + private String id; + + @JsonProperty("Addr") + private String addr; + + @JsonProperty("Ip") + private String ip; + + public String getName() { + return name; + } + + public String getId() { + return id; + } + + public String getAddr() { + return addr; + } + + public String getIp() { + return ip; + } +} From 10e246728806f9363a6fe663748b60a52992f925 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 17 Jun 2015 08:33:38 +0200 Subject: [PATCH 0248/1399] Refactored streaming API's --- .../github/dockerjava/api/DockerClient.java | 174 ++-- .../dockerjava/api/async/ResultCallback.java | 18 + .../dockerjava/api/async/StreamCallback.java | 18 - .../api/command/AsyncDockerCmd.java | 20 + .../api/command/AttachContainerCmd.java | 13 +- .../dockerjava/api/command/EventsCmd.java | 14 +- .../api/command/LogContainerCmd.java | 17 +- .../dockerjava/api/command/StatsCmd.java | 19 +- .../dockerjava/core/DockerClientImpl.java | 625 ++++++++------- .../core/async/FrameStreamProcessor.java | 51 ++ .../core/async/JsonStreamProcessor.java | 59 ++ .../core/async/ResponseStreamProcessor.java | 20 + .../core/async/ResultCallbackTemplate.java | 70 ++ .../core/command/AttachContainerCmdImpl.java | 34 +- .../core/command/EventsCmdImpl.java | 31 +- .../core/command/LogContainerCmdImpl.java | 30 +- .../dockerjava/core/command/StatsCmdImpl.java | 18 +- .../jaxrs/AttachContainerCmdExec.java | 30 +- .../dockerjava/jaxrs/EventsCmdExec.java | 77 +- .../dockerjava/jaxrs/LogContainerCmdExec.java | 26 +- .../github/dockerjava/jaxrs/StatsCmdExec.java | 50 +- .../jaxrs/async/AbstractCallbackNotifier.java | 78 ++ .../jaxrs/async/GETCallbackNotifier.java | 29 + .../jaxrs/async/POSTCallbackNotifier.java | 29 + .../dockerjava/jaxrs/util/Streaming.java | 52 -- .../client/AbstractDockerClientTest.java | 35 + .../command/AttachContainerCmdImplTest.java | 70 ++ .../core/command/BuildImageCmdImplTest.java | 52 +- .../command/CreateContainerCmdImplTest.java | 758 ++++++++---------- .../core/command/EventsCmdImplTest.java | 17 +- .../core/command/ExecStartCmdImplTest.java | 30 +- .../core/command/FrameReaderITest.java | 159 ++-- .../core/command/LogContainerCmdImplTest.java | 169 ++-- .../core/command/StatsCmdImplTest.java | 7 +- 34 files changed, 1648 insertions(+), 1251 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/async/ResultCallback.java delete mode 100644 src/main/java/com/github/dockerjava/api/async/StreamCallback.java create mode 100644 src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java create mode 100644 src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java create mode 100644 src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java create mode 100644 src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java create mode 100644 src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 82f727355..ef16085bb 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -1,124 +1,158 @@ package com.github.dockerjava.api; -import java.io.*; - -import com.github.dockerjava.api.command.*; -import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; -import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.Statistics; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { - public AuthConfig authConfig() throws DockerException; + public AuthConfig authConfig() throws DockerException; - /** - * Authenticate with the server, useful for checking authentication. - */ - public AuthCmd authCmd(); + /** + * Authenticate with the server, useful for checking authentication. + */ + public AuthCmd authCmd(); - public InfoCmd infoCmd(); + public InfoCmd infoCmd(); - public PingCmd pingCmd(); + public PingCmd pingCmd(); - public VersionCmd versionCmd(); + public VersionCmd versionCmd(); - /** - * * IMAGE API * - */ + /** + * * IMAGE API * + */ - public PullImageCmd pullImageCmd(String repository); + public PullImageCmd pullImageCmd(String repository); - public PushImageCmd pushImageCmd(String name); + public PushImageCmd pushImageCmd(String name); - public PushImageCmd pushImageCmd(Identifier identifier); + public PushImageCmd pushImageCmd(Identifier identifier); - public CreateImageCmd createImageCmd(String repository, - InputStream imageStream); + public CreateImageCmd createImageCmd(String repository, InputStream imageStream); - public SearchImagesCmd searchImagesCmd(String term); + public SearchImagesCmd searchImagesCmd(String term); - public RemoveImageCmd removeImageCmd(String imageId); + public RemoveImageCmd removeImageCmd(String imageId); - public ListImagesCmd listImagesCmd(); + public ListImagesCmd listImagesCmd(); - public InspectImageCmd inspectImageCmd(String imageId); + public InspectImageCmd inspectImageCmd(String imageId); public SaveImageCmd saveImageCmd(String name); - /** - * * CONTAINER API * - */ - - public ListContainersCmd listContainersCmd(); - - public CreateContainerCmd createContainerCmd(String image); - - /** - * Creates a new {@link StartContainerCmd} for the container with the - * given ID. - * The command can then be further customized by using builder - * methods on it like {@link StartContainerCmd#withDns(String...)}. - *

- * If you customize the command, any existing configuration of the - * target container will get reset to its default before applying the - * new configuration. To preserve the existing configuration, use an - * unconfigured {@link StartContainerCmd}. - *

- * This command corresponds to the /containers/{id}/start - * endpoint of the Docker Remote API. - */ - public StartContainerCmd startContainerCmd(String containerId); + /** + * * CONTAINER API * + */ + + public ListContainersCmd listContainersCmd(); + + public CreateContainerCmd createContainerCmd(String image); + + /** + * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further + * customized by using builder methods on it like {@link StartContainerCmd#withDns(String...)}. + *

+ * If you customize the command, any existing configuration of the target container will get reset to its default + * before applying the new configuration. To preserve the existing configuration, use an unconfigured + * {@link StartContainerCmd}. + *

+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API. + */ + public StartContainerCmd startContainerCmd(String containerId); public ExecCreateCmd execCreateCmd(String containerId); - public InspectContainerCmd inspectContainerCmd(String containerId); + public InspectContainerCmd inspectContainerCmd(String containerId); - public RemoveContainerCmd removeContainerCmd(String containerId); + public RemoveContainerCmd removeContainerCmd(String containerId); - public WaitContainerCmd waitContainerCmd(String containerId); + public WaitContainerCmd waitContainerCmd(String containerId); - public AttachContainerCmd attachContainerCmd(String containerId); + public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback); public ExecStartCmd execStartCmd(String containerId); public InspectExecCmd inspectExecCmd(String execId); - public LogContainerCmd logContainerCmd(String containerId); + public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback); - public CopyFileFromContainerCmd copyFileFromContainerCmd( - String containerId, String resource); + public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); - public ContainerDiffCmd containerDiffCmd(String containerId); + public ContainerDiffCmd containerDiffCmd(String containerId); - public StopContainerCmd stopContainerCmd(String containerId); + public StopContainerCmd stopContainerCmd(String containerId); - public KillContainerCmd killContainerCmd(String containerId); + public KillContainerCmd killContainerCmd(String containerId); - public RestartContainerCmd restartContainerCmd(String containerId); + public RestartContainerCmd restartContainerCmd(String containerId); - public CommitCmd commitCmd(String containerId); + public CommitCmd commitCmd(String containerId); public BuildImageCmd buildImageCmd(); - public BuildImageCmd buildImageCmd(File dockerFileOrFolder); + public BuildImageCmd buildImageCmd(File dockerFileOrFolder); - public BuildImageCmd buildImageCmd(InputStream tarInputStream); + public BuildImageCmd buildImageCmd(InputStream tarInputStream); - public TopContainerCmd topContainerCmd(String containerId); + public TopContainerCmd topContainerCmd(String containerId); - public TagImageCmd tagImageCmd(String imageId, String repository, String tag); + public TagImageCmd tagImageCmd(String imageId, String repository, String tag); - public PauseContainerCmd pauseContainerCmd(String containerId); + public PauseContainerCmd pauseContainerCmd(String containerId); - public UnpauseContainerCmd unpauseContainerCmd(String containerId); + public UnpauseContainerCmd unpauseContainerCmd(String containerId); - public EventsCmd eventsCmd(EventStreamCallback eventCallback); + public EventsCmd eventsCmd(ResultCallback resultCallback); - public StatsCmd statsCmd(StatisticsCallback statisticsCallback); + public StatsCmd statsCmd(ResultCallback resultCallback); - @Override - public void close() throws IOException; + @Override + public void close() throws IOException; } diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java new file mode 100644 index 000000000..f4f519d3e --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.async; + +import java.io.Closeable; + +/** + * Result callback + */ +public interface ResultCallback { + /** Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the processing */ + void onStart(Closeable closeable); + /** Called when an async result event occurs */ + void onResult(RES_T object); + /** Called when an exception occurs while processing */ + void onError(Throwable throwable); + /** Called when processing was finished either by reaching the end or by aborting it */ + void onFinish(); + +} diff --git a/src/main/java/com/github/dockerjava/api/async/StreamCallback.java b/src/main/java/com/github/dockerjava/api/async/StreamCallback.java deleted file mode 100644 index b719c227c..000000000 --- a/src/main/java/com/github/dockerjava/api/async/StreamCallback.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.dockerjava.api.async; - -import java.io.Closeable; - -/** - * Stream callback - */ -public interface StreamCallback { - /** Called when the stream starts. The passed {@link Closeable} can be used to close/interrupt the stream */ - void onStart(Closeable stream); - /** Called when a stream event occurs */ - void onStream(T object); - /** Called when an exception occurs while processing the stream */ - void onError(Throwable throwable); - /** Called when streaming was finished either by reaching the end of the stream or by aborting it */ - void onFinish(); - -} diff --git a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java new file mode 100644 index 000000000..4745fae18 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java @@ -0,0 +1,20 @@ +/* + * Created on 17.06.2015 + */ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; + +/** + * + * + * @author marcus + * + */ +public interface AsyncDockerCmd, A_RES_T, RES_T> extends DockerCmd { + + public ResultCallback getResultCallback(); + + public CMD_T withResultCallback(ResultCallback resultCallback); + +} diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 0fb72d452..ffb282095 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -4,13 +4,14 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.model.Frame; /** * Attach to container - * + * * @param logs * - true or false, includes logs. Defaults to false. - * + * * @param followStream * - true or false, return stream. Defaults to false. * @param stdout @@ -21,7 +22,7 @@ * - true or false, if true, print timestamps for every log line. * Defaults to false. */ -public interface AttachContainerCmd extends DockerCmd { +public interface AttachContainerCmd extends AsyncDockerCmd { public String getContainerId(); @@ -67,15 +68,15 @@ public interface AttachContainerCmd extends DockerCmd { /** * Its the responsibility of the caller to consume and/or close the * {@link InputStream} to prevent connection leaks. - * + * * @throws NotFoundException * No such container */ @Override - public InputStream exec() throws NotFoundException; + public Void exec() throws NotFoundException; public static interface Exec extends - DockerCmdExec { + DockerCmdExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index fdab3700e..17ec37248 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.async.StreamCallback; import com.github.dockerjava.api.model.Event; @@ -10,7 +9,7 @@ * @param since - Show all events created since timestamp * @param until - Stream events until this timestamp */ -public interface EventsCmd extends DockerCmd { +public interface EventsCmd extends AsyncDockerCmd { public EventsCmd withSince(String since); public EventsCmd withUntil(String until); @@ -19,17 +18,6 @@ public interface EventsCmd extends DockerCmd { public String getUntil(); - public EventStreamCallback getEventCallback(); - - public EventsCmd withEventCallback(EventStreamCallback eventCallback); - public static interface Exec extends DockerCmdExec { } - - /** - * {@link Event} stream callback - */ - public interface EventStreamCallback extends StreamCallback { - } - } diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index c966ef953..2eff3c217 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -2,12 +2,14 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.model.Frame; import java.io.InputStream; +import java.util.concurrent.Future; /** * Get container logs - * + * * @param followStream * - true or false, return stream. Defaults to false. * @param stdout @@ -20,13 +22,12 @@ * @param tail * - `all` or ``, Output specified number of lines at the end * of logs - * + * * Consider wrapping any input stream you get with a frame reader to * make reading frame easier. - * - * @see com.github.dockerjava.core.command.FrameReader + * */ -public interface LogContainerCmd extends DockerCmd { +public interface LogContainerCmd extends AsyncDockerCmd { public String getContainerId(); @@ -74,15 +75,15 @@ public interface LogContainerCmd extends DockerCmd { /** * Its the responsibility of the caller to consume and/or close the * {@link InputStream} to prevent connection leaks. - * + * * @throws NotFoundException * No such container */ @Override - public InputStream exec() throws NotFoundException; + public Void exec() throws NotFoundException; public static interface Exec extends - DockerCmdExec { + DockerCmdExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java index d06d09835..0547cc616 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -1,28 +1,17 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.async.StreamCallback; import com.github.dockerjava.api.model.Statistics; /** - * Get stats - * + * Get container stats. The result of {@link Statistics} is handled asynchronously because + * the docker remote API will block when a container is stopped until + * the container is up again. */ -public interface StatsCmd extends DockerCmd { +public interface StatsCmd extends AsyncDockerCmd { public StatsCmd withContainerId(String containerId); public String getContainerId(); - public StatsCmd withStatisticsCallback(StatisticsCallback callback); - - public StatisticsCallback getStatisticsCallback(); - public static interface Exec extends DockerCmdExec { } - - /** - * {@link Statistics} stream callback - */ - public interface StatisticsCallback extends StreamCallback { - } - } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 4503e4f17..b9bdb7edc 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -8,13 +8,86 @@ import java.io.InputStream; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.*; -import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; -import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Identifier; -import com.github.dockerjava.core.command.*; +import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.core.command.AttachContainerCmdImpl; +import com.github.dockerjava.core.command.AuthCmdImpl; +import com.github.dockerjava.core.command.BuildImageCmdImpl; +import com.github.dockerjava.core.command.CommitCmdImpl; +import com.github.dockerjava.core.command.ContainerDiffCmdImpl; +import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; +import com.github.dockerjava.core.command.CreateContainerCmdImpl; +import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.EventsCmdImpl; +import com.github.dockerjava.core.command.ExecCreateCmdImpl; +import com.github.dockerjava.core.command.ExecStartCmdImpl; +import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.core.command.InspectContainerCmdImpl; +import com.github.dockerjava.core.command.InspectExecCmdImpl; +import com.github.dockerjava.core.command.InspectImageCmdImpl; +import com.github.dockerjava.core.command.KillContainerCmdImpl; +import com.github.dockerjava.core.command.ListContainersCmdImpl; +import com.github.dockerjava.core.command.ListImagesCmdImpl; +import com.github.dockerjava.core.command.LogContainerCmdImpl; +import com.github.dockerjava.core.command.PauseContainerCmdImpl; +import com.github.dockerjava.core.command.PingCmdImpl; +import com.github.dockerjava.core.command.PullImageCmdImpl; +import com.github.dockerjava.core.command.PushImageCmdImpl; +import com.github.dockerjava.core.command.RemoveContainerCmdImpl; +import com.github.dockerjava.core.command.RemoveImageCmdImpl; +import com.github.dockerjava.core.command.RestartContainerCmdImpl; +import com.github.dockerjava.core.command.SaveImageCmdImpl; +import com.github.dockerjava.core.command.SearchImagesCmdImpl; +import com.github.dockerjava.core.command.StartContainerCmdImpl; +import com.github.dockerjava.core.command.StatsCmdImpl; +import com.github.dockerjava.core.command.StopContainerCmdImpl; +import com.github.dockerjava.core.command.TagImageCmdImpl; +import com.github.dockerjava.core.command.TopContainerCmdImpl; +import com.github.dockerjava.core.command.UnpauseContainerCmdImpl; +import com.github.dockerjava.core.command.VersionCmdImpl; +import com.github.dockerjava.core.command.WaitContainerCmdImpl; /** * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -23,221 +96,197 @@ */ public class DockerClientImpl implements Closeable, DockerClient { - private final DockerClientConfig dockerClientConfig; - - private DockerCmdExecFactory dockerCmdExecFactory; - - private DockerClientImpl() { - this(DockerClientConfig.createDefaultConfigBuilder().build()); - } - - private DockerClientImpl(String serverUrl) { - this(configWithServerUrl(serverUrl)); - } - - private DockerClientImpl(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, - "config was not specified"); - this.dockerClientConfig = dockerClientConfig; - } - - private static DockerClientConfig configWithServerUrl(String serverUrl) { - return DockerClientConfig.createDefaultConfigBuilder() - .withUri(serverUrl).build(); - } - - public static DockerClientImpl getInstance() { - return new DockerClientImpl(); - } - - public static DockerClientImpl getInstance( - DockerClientConfig dockerClientConfig) { - return new DockerClientImpl(dockerClientConfig); - } - - public static DockerClientImpl getInstance(String serverUrl) { - return new DockerClientImpl(serverUrl); - } - - public DockerClientImpl withDockerCmdExecFactory( - DockerCmdExecFactory dockerCmdExecFactory) { - checkNotNull(dockerCmdExecFactory, - "dockerCmdExecFactory was not specified"); - this.dockerCmdExecFactory = dockerCmdExecFactory; - this.dockerCmdExecFactory.init(dockerClientConfig); - return this; - } - - private DockerCmdExecFactory getDockerCmdExecFactory() { - checkNotNull(dockerCmdExecFactory, - "dockerCmdExecFactory was not specified"); - return dockerCmdExecFactory; - } - - @Override - public AuthConfig authConfig() { - checkNotNull(dockerClientConfig.getUsername(), - "Configured username is null."); - checkNotNull(dockerClientConfig.getServerAddress(), - "Configured serverAddress is null."); - - AuthConfig authConfig = new AuthConfig(); - authConfig.setUsername(dockerClientConfig.getUsername()); - authConfig.setPassword(dockerClientConfig.getPassword()); - authConfig.setEmail(dockerClientConfig.getEmail()); - authConfig.setServerAddress(dockerClientConfig.getServerAddress()); - - return authConfig; - } - - /** - * * MISC API * - */ - - /** - * Authenticate with the server, useful for checking authentication. - */ - @Override - public AuthCmd authCmd() { - return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), - authConfig()); - } - - @Override - public InfoCmd infoCmd() { - return new InfoCmdImpl(getDockerCmdExecFactory().createInfoCmdExec()); - } - - @Override - public PingCmd pingCmd() { - return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec()); - } - - @Override - public VersionCmd versionCmd() { - return new VersionCmdImpl(getDockerCmdExecFactory() - .createVersionCmdExec()); - } - - /** - * * IMAGE API * - */ - @Override - public PullImageCmd pullImageCmd(String repository) { - return new PullImageCmdImpl(getDockerCmdExecFactory() - .createPullImageCmdExec(), dockerClientConfig.effectiveAuthConfig(repository), repository); - } - - @Override - public PushImageCmd pushImageCmd(String name) { - PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory() - .createPushImageCmdExec(), name); - - AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); - if( cfg != null ) + private final DockerClientConfig dockerClientConfig; + + private DockerCmdExecFactory dockerCmdExecFactory; + + private DockerClientImpl() { + this(DockerClientConfig.createDefaultConfigBuilder().build()); + } + + private DockerClientImpl(String serverUrl) { + this(configWithServerUrl(serverUrl)); + } + + private DockerClientImpl(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + this.dockerClientConfig = dockerClientConfig; + } + + private static DockerClientConfig configWithServerUrl(String serverUrl) { + return DockerClientConfig.createDefaultConfigBuilder().withUri(serverUrl).build(); + } + + public static DockerClientImpl getInstance() { + return new DockerClientImpl(); + } + + public static DockerClientImpl getInstance(DockerClientConfig dockerClientConfig) { + return new DockerClientImpl(dockerClientConfig); + } + + public static DockerClientImpl getInstance(String serverUrl) { + return new DockerClientImpl(serverUrl); + } + + public DockerClientImpl withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) { + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + this.dockerCmdExecFactory = dockerCmdExecFactory; + this.dockerCmdExecFactory.init(dockerClientConfig); + return this; + } + + private DockerCmdExecFactory getDockerCmdExecFactory() { + checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + return dockerCmdExecFactory; + } + + @Override + public AuthConfig authConfig() { + checkNotNull(dockerClientConfig.getUsername(), "Configured username is null."); + checkNotNull(dockerClientConfig.getServerAddress(), "Configured serverAddress is null."); + + AuthConfig authConfig = new AuthConfig(); + authConfig.setUsername(dockerClientConfig.getUsername()); + authConfig.setPassword(dockerClientConfig.getPassword()); + authConfig.setEmail(dockerClientConfig.getEmail()); + authConfig.setServerAddress(dockerClientConfig.getServerAddress()); + + return authConfig; + } + + /** + * * MISC API * + */ + + /** + * Authenticate with the server, useful for checking authentication. + */ + @Override + public AuthCmd authCmd() { + return new AuthCmdImpl(getDockerCmdExecFactory().createAuthCmdExec(), authConfig()); + } + + @Override + public InfoCmd infoCmd() { + return new InfoCmdImpl(getDockerCmdExecFactory().createInfoCmdExec()); + } + + @Override + public PingCmd pingCmd() { + return new PingCmdImpl(getDockerCmdExecFactory().createPingCmdExec()); + } + + @Override + public VersionCmd versionCmd() { + return new VersionCmdImpl(getDockerCmdExecFactory().createVersionCmdExec()); + } + + /** + * * IMAGE API * + */ + @Override + public PullImageCmd pullImageCmd(String repository) { + return new PullImageCmdImpl(getDockerCmdExecFactory().createPullImageCmdExec(), + dockerClientConfig.effectiveAuthConfig(repository), repository); + } + + @Override + public PushImageCmd pushImageCmd(String name) { + PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory().createPushImageCmdExec(), name); + + AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); + if (cfg != null) cmd.withAuthConfig(cfg); - return cmd; - } + return cmd; + } - @Override - public PushImageCmd pushImageCmd(Identifier identifier) { - PushImageCmd cmd = pushImageCmd(identifier.repository.name); - if( identifier.tag.isPresent() ) + @Override + public PushImageCmd pushImageCmd(Identifier identifier) { + PushImageCmd cmd = pushImageCmd(identifier.repository.name); + if (identifier.tag.isPresent()) cmd.withTag(identifier.tag.get()); - AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(identifier.repository.name); - if( cfg != null ) + AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(identifier.repository.name); + if (cfg != null) cmd.withAuthConfig(cfg); - return cmd; - } + return cmd; + } - @Override + @Override public SaveImageCmd saveImageCmd(String name) { return new SaveImageCmdImpl(getDockerCmdExecFactory().createSaveImageCmdExec(), name); } - @Override - public CreateImageCmd createImageCmd(String repository, - InputStream imageStream) { - return new CreateImageCmdImpl(getDockerCmdExecFactory() - .createCreateImageCmdExec(), repository, imageStream); - } - - @Override - public SearchImagesCmd searchImagesCmd(String term) { - return new SearchImagesCmdImpl(getDockerCmdExecFactory() - .createSearchImagesCmdExec(), term); - } - - @Override - public RemoveImageCmd removeImageCmd(String imageId) { - return new RemoveImageCmdImpl(getDockerCmdExecFactory() - .createRemoveImageCmdExec(), imageId); - } - - @Override - public ListImagesCmd listImagesCmd() { - return new ListImagesCmdImpl(getDockerCmdExecFactory() - .createListImagesCmdExec()); - } - - @Override - public InspectImageCmd inspectImageCmd(String imageId) { - return new InspectImageCmdImpl(getDockerCmdExecFactory() - .createInspectImageCmdExec(), imageId); - } - - /** - * * CONTAINER API * - */ - - @Override - public ListContainersCmd listContainersCmd() { - return new ListContainersCmdImpl(getDockerCmdExecFactory() - .createListContainersCmdExec()); - } - - @Override - public CreateContainerCmd createContainerCmd(String image) { - return new CreateContainerCmdImpl(getDockerCmdExecFactory() - .createCreateContainerCmdExec(), image); - } - - @Override - public StartContainerCmd startContainerCmd(String containerId) { - return new StartContainerCmdImpl(getDockerCmdExecFactory() - .createStartContainerCmdExec(), containerId); - } - - @Override - public InspectContainerCmd inspectContainerCmd(String containerId) { - return new InspectContainerCmdImpl(getDockerCmdExecFactory() - .createInspectContainerCmdExec(), containerId); - } + @Override + public CreateImageCmd createImageCmd(String repository, InputStream imageStream) { + return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream); + } + + @Override + public SearchImagesCmd searchImagesCmd(String term) { + return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term); + } + + @Override + public RemoveImageCmd removeImageCmd(String imageId) { + return new RemoveImageCmdImpl(getDockerCmdExecFactory().createRemoveImageCmdExec(), imageId); + } + + @Override + public ListImagesCmd listImagesCmd() { + return new ListImagesCmdImpl(getDockerCmdExecFactory().createListImagesCmdExec()); + } + + @Override + public InspectImageCmd inspectImageCmd(String imageId) { + return new InspectImageCmdImpl(getDockerCmdExecFactory().createInspectImageCmdExec(), imageId); + } + + /** + * * CONTAINER API * + */ + + @Override + public ListContainersCmd listContainersCmd() { + return new ListContainersCmdImpl(getDockerCmdExecFactory().createListContainersCmdExec()); + } + + @Override + public CreateContainerCmd createContainerCmd(String image) { + return new CreateContainerCmdImpl(getDockerCmdExecFactory().createCreateContainerCmdExec(), image); + } + + @Override + public StartContainerCmd startContainerCmd(String containerId) { + return new StartContainerCmdImpl(getDockerCmdExecFactory().createStartContainerCmdExec(), containerId); + } + + @Override + public InspectContainerCmd inspectContainerCmd(String containerId) { + return new InspectContainerCmdImpl(getDockerCmdExecFactory().createInspectContainerCmdExec(), containerId); + } @Override public ExecCreateCmd execCreateCmd(String containerId) { return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); } - @Override - public RemoveContainerCmd removeContainerCmd(String containerId) { - return new RemoveContainerCmdImpl(getDockerCmdExecFactory() - .createRemoveContainerCmdExec(), containerId); - } + @Override + public RemoveContainerCmd removeContainerCmd(String containerId) { + return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId); + } - @Override - public WaitContainerCmd waitContainerCmd(String containerId) { - return new WaitContainerCmdImpl(getDockerCmdExecFactory() - .createWaitContainerCmdExec(), containerId); - } + @Override + public WaitContainerCmd waitContainerCmd(String containerId) { + return new WaitContainerCmdImpl(getDockerCmdExecFactory().createWaitContainerCmdExec(), containerId); + } - @Override - public AttachContainerCmd attachContainerCmd(String containerId) { - return new AttachContainerCmdImpl(getDockerCmdExecFactory() - .createAttachContainerCmdExec(), containerId); - } + @Override + public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback) { + return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId, resultCallback); + } @Override public ExecStartCmd execStartCmd(String containerId) { @@ -250,114 +299,100 @@ public InspectExecCmd inspectExecCmd(String execId) { } @Override - public LogContainerCmd logContainerCmd(String containerId) { - return new LogContainerCmdImpl(getDockerCmdExecFactory() - .createLogContainerCmdExec(), containerId); - } + public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback) { + return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId, resultCallback); + } - @Override - public CopyFileFromContainerCmd copyFileFromContainerCmd( - String containerId, String resource) { - return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory() - .createCopyFileFromContainerCmdExec(), containerId, resource); - } + @Override + public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) { + return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(), + containerId, resource); + } - @Override - public ContainerDiffCmd containerDiffCmd(String containerId) { - return new ContainerDiffCmdImpl(getDockerCmdExecFactory() - .createContainerDiffCmdExec(), containerId); - } + @Override + public ContainerDiffCmd containerDiffCmd(String containerId) { + return new ContainerDiffCmdImpl(getDockerCmdExecFactory().createContainerDiffCmdExec(), containerId); + } - @Override - public StopContainerCmd stopContainerCmd(String containerId) { - return new StopContainerCmdImpl(getDockerCmdExecFactory() - .createStopContainerCmdExec(), containerId); - } + @Override + public StopContainerCmd stopContainerCmd(String containerId) { + return new StopContainerCmdImpl(getDockerCmdExecFactory().createStopContainerCmdExec(), containerId); + } - @Override - public KillContainerCmd killContainerCmd(String containerId) { - return new KillContainerCmdImpl(getDockerCmdExecFactory() - .createKillContainerCmdExec(), containerId); - } + @Override + public KillContainerCmd killContainerCmd(String containerId) { + return new KillContainerCmdImpl(getDockerCmdExecFactory().createKillContainerCmdExec(), containerId); + } - @Override - public RestartContainerCmd restartContainerCmd(String containerId) { - return new RestartContainerCmdImpl(getDockerCmdExecFactory() - .createRestartContainerCmdExec(), containerId); - } + @Override + public RestartContainerCmd restartContainerCmd(String containerId) { + return new RestartContainerCmdImpl(getDockerCmdExecFactory().createRestartContainerCmdExec(), containerId); + } - @Override - public CommitCmd commitCmd(String containerId) { - return new CommitCmdImpl(getDockerCmdExecFactory() - .createCommitCmdExec(), containerId); - } + @Override + public CommitCmd commitCmd(String containerId) { + return new CommitCmdImpl(getDockerCmdExecFactory().createCommitCmdExec(), containerId); + } @Override public BuildImageCmd buildImageCmd() { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec())); + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec())); } - @Override - public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec(), dockerFileOrFolder)); - } + @Override + public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), + dockerFileOrFolder)); + } @Override public BuildImageCmd buildImageCmd(InputStream tarInputStream) { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory() - .createBuildImageCmdExec(), tarInputStream)); - } - - private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) { - final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations(); - if (!authConfigurations.getConfigs().isEmpty()) { - buildImageCmd.withBuildAuthConfigs(authConfigurations); - } - - return buildImageCmd; - } - - @Override - public TopContainerCmd topContainerCmd(String containerId) { - return new TopContainerCmdImpl(getDockerCmdExecFactory() - .createTopContainerCmdExec(), containerId); - } - - @Override - public TagImageCmd tagImageCmd(String imageId, String repository, String tag) { - return new TagImageCmdImpl(getDockerCmdExecFactory() - .createTagImageCmdExec(), imageId, repository, tag); - } - - @Override - public PauseContainerCmd pauseContainerCmd(String containerId) { - return new PauseContainerCmdImpl(getDockerCmdExecFactory() - .createPauseContainerCmdExec(), containerId); - } - - @Override - public UnpauseContainerCmd unpauseContainerCmd(String containerId) { - return new UnpauseContainerCmdImpl(getDockerCmdExecFactory() - .createUnpauseContainerCmdExec(), containerId); - } - - @Override - public EventsCmd eventsCmd(EventStreamCallback eventCallback) { - return new EventsCmdImpl(getDockerCmdExecFactory() - .createEventsCmdExec(), eventCallback); - } - - @Override - public StatsCmd statsCmd(StatisticsCallback statisticsCallback) { - return new StatsCmdImpl(getDockerCmdExecFactory() - .createStatsCmdExec(), statisticsCallback); - } - - @Override - public void close() throws IOException { - getDockerCmdExecFactory().close(); - } + return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), + tarInputStream)); + } + + private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) { + final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations(); + if (!authConfigurations.getConfigs().isEmpty()) { + buildImageCmd.withBuildAuthConfigs(authConfigurations); + } + + return buildImageCmd; + } + + @Override + public TopContainerCmd topContainerCmd(String containerId) { + return new TopContainerCmdImpl(getDockerCmdExecFactory().createTopContainerCmdExec(), containerId); + } + + @Override + public TagImageCmd tagImageCmd(String imageId, String repository, String tag) { + return new TagImageCmdImpl(getDockerCmdExecFactory().createTagImageCmdExec(), imageId, repository, tag); + } + + @Override + public PauseContainerCmd pauseContainerCmd(String containerId) { + return new PauseContainerCmdImpl(getDockerCmdExecFactory().createPauseContainerCmdExec(), containerId); + } + + @Override + public UnpauseContainerCmd unpauseContainerCmd(String containerId) { + return new UnpauseContainerCmdImpl(getDockerCmdExecFactory().createUnpauseContainerCmdExec(), containerId); + } + + @Override + public EventsCmd eventsCmd(ResultCallback eventCallback) { + return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback); + } + + @Override + public StatsCmd statsCmd(ResultCallback statisticsCallback) { + return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), statisticsCallback); + } + + @Override + public void close() throws IOException { + getDockerCmdExecFactory().close(); + } } diff --git a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java new file mode 100644 index 000000000..cc6474d09 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java @@ -0,0 +1,51 @@ +/* + * Created on 23.06.2015 + */ +package com.github.dockerjava.core.async; + +import java.io.IOException; +import java.io.InputStream; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.command.FrameReader; + +/** + * + * + * @author marcus + * + */ +public class FrameStreamProcessor implements ResponseStreamProcessor { + + @Override + public void processResponseStream(InputStream response, ResultCallback resultCallback) { + resultCallback.onStart(response); + + FrameReader frameReader = new FrameReader(response); + try { + + Frame frame = frameReader.readFrame(); + while (frame != null) { + try { + resultCallback.onResult(frame); + } catch (Exception e) { + resultCallback.onError(e); + } finally { + frame = frameReader.readFrame(); + } + } + } catch (Throwable t) { + resultCallback.onError(t); + } finally { + try { + frameReader.close(); + response.close(); + } catch (IOException e) { + resultCallback.onError(e); + } finally { + resultCallback.onFinish(); + } + } + } +} diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java new file mode 100644 index 000000000..24d83b129 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -0,0 +1,59 @@ +/* + * Created on 18.06.2015 + */ +package com.github.dockerjava.core.async; + +import java.io.IOException; +import java.io.InputStream; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.async.ResultCallback; + +/** + * + * @author marcus + * + */ +public class JsonStreamProcessor implements ResponseStreamProcessor { + + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private final Class clazz; + + public JsonStreamProcessor(Class clazz) { + this.clazz = clazz; + } + + @Override + public void processResponseStream(InputStream response, ResultCallback resultCallback) { + + resultCallback.onStart(response); + + try { + JsonParser jp = JSON_FACTORY.createParser(response); + while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) { + try { + resultCallback.onResult(OBJECT_MAPPER.readValue(jp, clazz)); + } catch (Exception e) { + resultCallback.onError(e); + } + } + } catch (Throwable t) { + resultCallback.onError(t); + } finally { + try { + response.close(); + } catch (IOException e) { + resultCallback.onError(e); + } finally { + resultCallback.onFinish(); + } + } + + } +} diff --git a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java new file mode 100644 index 000000000..c88575889 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java @@ -0,0 +1,20 @@ +/* + * Created on 18.06.2015 + */ +package com.github.dockerjava.core.async; + +import java.io.InputStream; + +import com.github.dockerjava.api.async.ResultCallback; + +/** + * + * @author marcus + * + */ +public interface ResponseStreamProcessor { + + void processResponseStream(InputStream response, + ResultCallback resultCallback); + +} diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java new file mode 100644 index 000000000..c98cddf4c --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -0,0 +1,70 @@ +/* + * Created on 16.06.2015 + */ +package com.github.dockerjava.core.async; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import com.github.dockerjava.api.async.ResultCallback; + +/** + * Template implementation of {@link ResultCallback} + * + * @author marcus + * + */ +public class ResultCallbackTemplate implements ResultCallback, Closeable { + + private final CountDownLatch finished = new CountDownLatch(1); + + private Closeable stream; + + @Override + public void onStart(Closeable stream) { + this.stream = stream; + } + + @Override + public void onResult(T object) { + } + + @Override + public void onError(Throwable throwable) { + try { + throw new RuntimeException(throwable); + } finally { + try { + close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void onFinish() { + try { + close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() throws IOException { + if(stream != null) + stream.close(); + finished.countDown(); + } + + public void awaitFinish() throws InterruptedException { + finished.await(); + } + + public void awaitFinish(long timeout, TimeUnit timeUnit) throws InterruptedException { + finished.await(timeout, timeUnit); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index fc38ae7d9..749f61500 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -2,17 +2,17 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.InputStream; - import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.model.Frame; /** * Attach to container - * + * * @param logs * - true or false, includes logs. Defaults to false. - * + * * @param followStream * - true or false, return stream. Defaults to false. * @param stdout @@ -23,17 +23,31 @@ * - true or false, if true, print timestamps for every log line. * Defaults to false. */ -public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { +public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { + + private ResultCallback resultCallback; private String containerId; private boolean logs, followStream, timestamps, stdout, stderr; - public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId) { + public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { super(exec); withContainerId(containerId); + withResultCallback(resultCallback); } + public ResultCallback getResultCallback() { + return resultCallback; + } + + @Override + public AttachContainerCmd withResultCallback(ResultCallback resultCallback) { + checkNotNull(resultCallback, "resultCallback was not specified"); + this.resultCallback = resultCallback; + return this; + } + @Override public String getContainerId() { return containerId; @@ -115,17 +129,17 @@ public AttachContainerCmd withLogs(boolean logs) { this.logs = logs; return this; } - + @Override public AttachContainerCmd withLogs() { return withLogs(true); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException No such container */ @Override - public InputStream exec() throws NotFoundException { + public Void exec() throws NotFoundException { return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index 07180bdf9..d1de2e60f 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -1,6 +1,8 @@ package com.github.dockerjava.core.command; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.model.Event; /** * Stream docker events @@ -8,12 +10,14 @@ public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd { private String since; + private String until; - private EventStreamCallback eventCallback; - public EventsCmdImpl(EventsCmd.Exec exec, EventStreamCallback eventCallback) { + private ResultCallback resultCallback; + + public EventsCmdImpl(EventsCmd.Exec exec, ResultCallback resultCallback) { super(exec); - withEventCallback(eventCallback); + withResultCallback(resultCallback); } @Override @@ -27,10 +31,10 @@ public EventsCmd withUntil(String until) { this.until = until; return this; } - + @Override - public EventsCmd withEventCallback(EventStreamCallback eventCallback) { - this.eventCallback = eventCallback; + public EventsCmd withResultCallback(ResultCallback resultCallback) { + this.resultCallback = resultCallback; return this; } @@ -45,20 +49,13 @@ public String getUntil() { } @Override - public EventStreamCallback getEventCallback() { - return eventCallback; + public ResultCallback getResultCallback() { + return resultCallback; } -// @Override -// public InputStream exec() { -// return super.exec(); -// } - @Override public String toString() { - return new StringBuilder("events") - .append(since != null ? " --since=" + since : "") - .append(until != null ? " --until=" + until : "") - .toString(); + return new StringBuilder("events").append(since != null ? " --since=" + since : "") + .append(until != null ? " --until=" + until : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index d405a8026..bd518ddb7 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -3,9 +3,12 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.io.InputStream; +import java.util.concurrent.Future; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.model.Frame; /** * Get container logs @@ -22,7 +25,9 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs */ -public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd { +public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd { + + private ResultCallback resultCallback; private String containerId; @@ -30,9 +35,10 @@ public class LogContainerCmdImpl extends AbstrDockerCmd resultCallback) { super(exec); withContainerId(containerId); + withResultCallback(resultCallback); } @Override @@ -40,6 +46,18 @@ public String getContainerId() { return containerId; } + @Override + public ResultCallback getResultCallback() { + return resultCallback; + } + + @Override + public LogContainerCmd withResultCallback(ResultCallback resultCallback) { + checkNotNull(resultCallback, "resultCallback was not specified"); + this.resultCallback = resultCallback; + return this; + } + @Override public int getTail() { return tail; @@ -82,7 +100,7 @@ public LogContainerCmd withFollowStream(boolean followStream) { this.followStream = followStream; return this; } - + @Override public LogContainerCmd withTimestamps() { return withTimestamps(true); @@ -137,12 +155,14 @@ public String toString() { .append(containerId) .toString(); } - + /** * @throws NotFoundException No such container */ @Override - public InputStream exec() throws NotFoundException { + public Void exec() throws NotFoundException { return super.exec(); } + + } diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java index c10f00e57..678a9ef49 100644 --- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -2,20 +2,22 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Statistics; /** - * Stream docker stats + * Container stats */ public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd { private String containerId; - private StatisticsCallback statisticsCallback; + private ResultCallback resultCallback; - public StatsCmdImpl(StatsCmd.Exec exec, StatisticsCallback statisticsCallback) { + public StatsCmdImpl(StatsCmd.Exec exec, ResultCallback resultCallback) { super(exec); - withStatisticsCallback(statisticsCallback); + withResultCallback(resultCallback); } @Override @@ -31,14 +33,14 @@ public String getContainerId() { } @Override - public StatsCmd withStatisticsCallback(StatisticsCallback statisticsCallback) { - this.statisticsCallback = statisticsCallback; + public StatsCmd withResultCallback(ResultCallback resultCallback) { + this.resultCallback = resultCallback; return this; } @Override - public StatisticsCallback getStatisticsCallback() { - return statisticsCallback; + public ResultCallback getResultCallback() { + return resultCallback; } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index de4bb3f0c..29f331a2f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -1,19 +1,19 @@ package com.github.dockerjava.jaxrs; -import java.io.InputStream; - import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.AttachContainerCmd; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.FrameStreamProcessor; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; public class AttachContainerCmdExec extends - AbstrDockerCmdExec implements + AbstrDockerCmdExec implements AttachContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory @@ -24,8 +24,8 @@ public AttachContainerCmdExec(WebTarget baseResource) { } @Override - protected InputStream execute(AttachContainerCmd command) { - WebTarget webResource = getBaseResource() + protected Void execute(AttachContainerCmd command) { + WebTarget webTarget = getBaseResource() .path("/containers/{id}/attach") .resolveTemplate("id", command.getContainerId()) .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") @@ -35,13 +35,15 @@ protected InputStream execute(AttachContainerCmd command) { .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); - LOGGER.trace("POST: {}", webResource); + LOGGER.trace("POST: {}", webTarget); + + POSTCallbackNotifier callbackNotifier = new POSTCallbackNotifier( + new FrameStreamProcessor(), command.getResultCallback(), webTarget); + + AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); + + return null; - Response response = webResource.request() - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(null, Response.class); - - return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index aa60ef60a..98b93fd48 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,76 +1,37 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.jaxrs.util.Streaming; - -public class EventsCmdExec extends AbstrDockerCmdExec - implements EventsCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(EventsCmdExec.class); - - public EventsCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(EventsCmd command) { - - - WebTarget webTarget = getBaseResource().path("/events") - .queryParam("since", command.getSince()) - .queryParam("until", command.getUntil()); - - LOGGER.trace("GET: {}", webTarget); - ExecutorService executorService = Executors.newSingleThreadExecutor(); - EventNotifier eventNotifier = EventNotifier.create( - command.getEventCallback(), webTarget); - executorService.submit(eventNotifier); - executorService.shutdown(); - - return null; - } - - private static class EventNotifier implements Callable { - - private final EventsCmd.EventStreamCallback eventCallback; - private final WebTarget webTarget; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; - private EventNotifier(EventsCmd.EventStreamCallback eventCallback, - WebTarget webTarget) { - this.eventCallback = eventCallback; - this.webTarget = webTarget; - } +public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); - public static EventNotifier create(EventsCmd.EventStreamCallback eventCallback, - WebTarget webTarget) { - checkNotNull(eventCallback, "An EventCallback must be provided"); - checkNotNull(webTarget, "An WebTarget must be provided"); - return new EventNotifier(eventCallback, webTarget); - } + public EventsCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - public Void call() throws Exception { + @Override + protected Void execute(EventsCmd command) { - Response response = webTarget.request().get(Response.class); + WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) + .queryParam("until", command.getUntil()); - Streaming.processJsonStream(response, eventCallback, Event.class); + LOGGER.trace("GET: {}", webTarget); - return null; - } - } + GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( + new JsonStreamProcessor(Event.class), command.getResultCallback(), webTarget); + AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 7d031bddd..a738ef976 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -1,16 +1,18 @@ package com.github.dockerjava.jaxrs; -import java.io.InputStream; - import javax.ws.rs.client.WebTarget; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.FrameStreamProcessor; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; -public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { +public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); @@ -19,8 +21,8 @@ public LogContainerCmdExec(WebTarget baseResource) { } @Override - protected InputStream execute(LogContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/logs") + protected Void execute(LogContainerCmd command) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/logs") .resolveTemplate("id", command.getContainerId()) .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") @@ -28,9 +30,15 @@ protected InputStream execute(LogContainerCmd command) { .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); - LOGGER.trace("GET: {}", webResource); - - return new WrappedResponseInputStream(webResource.request().get()); + LOGGER.trace("GET: {}", webTarget); + + GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( + new FrameStreamProcessor(), command.getResultCallback(), webTarget); + + AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); + + return null; } + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java index 9749a21da..908b2522d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -1,21 +1,15 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.StatsCmd; -import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback; import com.github.dockerjava.api.model.Statistics; -import com.github.dockerjava.jaxrs.util.Streaming; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; public class StatsCmdExec extends AbstrDockerCmdExec implements StatsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); @@ -26,41 +20,17 @@ public StatsCmdExec(WebTarget baseResource) { @Override protected Void execute(StatsCmd command) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); - - WebTarget webResource = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id", + WebTarget webTarget = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id", command.getContainerId()); - LOGGER.trace("GET: {}", webResource); - StatsNotifier eventNotifier = StatsNotifier.create(command.getStatisticsCallback(), webResource); - executorService.submit(eventNotifier); - executorService.shutdown(); - - return null; - } + LOGGER.trace("GET: {}", webTarget); - private static class StatsNotifier implements Callable { - private final StatisticsCallback statisticsCallback; - private final WebTarget webTarget; + GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( + new JsonStreamProcessor(Statistics.class), command.getResultCallback(), webTarget); - private StatsNotifier(StatisticsCallback statisticsCallback, WebTarget webTarget) { - this.statisticsCallback = statisticsCallback; - this.webTarget = webTarget; - } + AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); - public static StatsNotifier create(StatisticsCallback statisticsCallback, WebTarget webTarget) { - checkNotNull(statisticsCallback, "An StatsCallback must be provided"); - checkNotNull(webTarget, "An WebTarget must be provided"); - return new StatsNotifier(statisticsCallback, webTarget); - } - - @Override - public Void call() throws Exception { - Response response = webTarget.request().get(Response.class); - - Streaming.processJsonStream(response, statisticsCallback, Statistics.class); - - return null; - } + return null; } + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java new file mode 100644 index 000000000..f8baeef98 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -0,0 +1,78 @@ +/* + * Created on 17.06.2015 + */ +package com.github.dockerjava.jaxrs.async; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.InputStream; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.core.async.ResponseStreamProcessor; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; + +public abstract class AbstractCallbackNotifier implements Callable { + + private final ResponseStreamProcessor responseStreamProcessor; + + private final ResultCallback resultCallback; + + protected final WebTarget webTarget; + + protected AbstractCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, + WebTarget webTarget) { + checkNotNull(webTarget, "An WebTarget must be provided"); + checkNotNull(responseStreamProcessor, "A ResponseStreamProcessor must be provided"); + this.responseStreamProcessor = responseStreamProcessor; + this.resultCallback = resultCallback; + this.webTarget = webTarget; + } + + @Override + public Void call() throws Exception { + + Response response = null; + + try { + response = response(); + } catch (ProcessingException e) { + if (resultCallback != null) { + resultCallback.onError(e.getCause()); + } + return null; + } + + try { + InputStream inputStream = new WrappedResponseInputStream(response); + + if (resultCallback != null) + responseStreamProcessor.processResponseStream(inputStream, resultCallback); + + return null; + } catch (Exception e) { + if (resultCallback != null) { + resultCallback.onError(e); + } + + return null; + } + } + + protected abstract Response response(); + + public static Future startAsyncProcessing(AbstractCallbackNotifier callbackNotifier) { + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + Future response = executorService.submit(callbackNotifier); + executorService.shutdown(); + return response; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java new file mode 100644 index 000000000..cddfe49ed --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java @@ -0,0 +1,29 @@ +/* + * Created on 23.06.2015 + */ +package com.github.dockerjava.jaxrs.async; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.core.async.ResponseStreamProcessor; + +/** + * + * + * @author marcus + * + */ +public class GETCallbackNotifier extends AbstractCallbackNotifier { + + public GETCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, + WebTarget webTarget) { + super(responseStreamProcessor, resultCallback, webTarget); + } + + protected Response response() { + return webTarget.request().get(Response.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java new file mode 100644 index 000000000..0d380b5db --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java @@ -0,0 +1,29 @@ +/* + * Created on 23.06.2015 + */ +package com.github.dockerjava.jaxrs.async; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.core.async.ResponseStreamProcessor; + +/** + * + * + * @author marcus + * + */ +public class POSTCallbackNotifier extends AbstractCallbackNotifier { + + public POSTCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, + WebTarget webTarget) { + super(responseStreamProcessor, resultCallback, webTarget); + } + + protected Response response() { + return webTarget.request().post(null, Response.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java b/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java deleted file mode 100644 index 73990bf51..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs/util/Streaming.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.github.dockerjava.jaxrs.util; - -import java.io.IOException; -import java.io.InputStream; - -import javax.ws.rs.core.Response; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.async.StreamCallback; - -public class Streaming { - - private static final JsonFactory JSON_FACTORY = new JsonFactory(); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - public static void processJsonStream(Response response, - StreamCallback objectStreamCallback, Class clazz) { - - InputStream inputStream = new WrappedResponseInputStream( - response); - - objectStreamCallback.onStart(inputStream); - - try { - JsonParser jp = JSON_FACTORY.createParser(inputStream); - while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) { - try { - objectStreamCallback.onStream(OBJECT_MAPPER.readValue(jp, - clazz)); - } catch (Exception e) { - objectStreamCallback.onError(e); - } - } - } catch (Throwable t) { - objectStreamCallback.onError(t); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - objectStreamCallback.onError(e); - } finally { - objectStreamCallback.onFinish(); - } - } - } - - - -} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 373680471..9eda0cbc5 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -6,11 +6,13 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.TestDockerCmdExecFactory; +import com.github.dockerjava.core.async.ResultCallbackTemplate; import com.google.common.base.Joiner; import org.apache.commons.io.IOUtils; @@ -187,4 +189,37 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon assertThat(volumes, contains(expectedVolumes)); } + public static class CollectFramesCallback extends ResultCallbackTemplate { + public final List frames = new ArrayList(); + private final StringBuffer log = new StringBuffer(); + + @Override + public void onError(Throwable throwable) { + throwable.printStackTrace(); + super.onError(throwable); + } + + @Override + public void onResult(Frame frame) { + frames.add(frame); + log.append(new String(frame.getPayload()).trim()); + } + + @Override + public String toString() { + return log.toString(); + } + } + + protected String containerLog(String containerId) throws Exception { + + CollectFramesCallback collectFramesCallback = new CollectFramesCallback(); + + dockerClient.logContainerCmd(containerId, collectFramesCallback).withStdOut().exec(); + + collectFramesCallback.awaitFinish(); + + return collectFramesCallback.toString(); + } + } diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java new file mode 100644 index 000000000..dec4a3b3b --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -0,0 +1,70 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class AttachContainerCmdImplTest extends AbstractDockerClientTest { + + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void attachContainer() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + CollectFramesCallback collectFramesCallback = new CollectFramesCallback(); + + dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut() + .withFollowStream().withLogs().exec(); + + collectFramesCallback.awaitFinish(10, TimeUnit.SECONDS); + + collectFramesCallback.close(); + + // LOG.info("resonse: " + log); + + assertThat(collectFramesCallback.toString(), endsWith(snippet)); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index c9bd51b90..a94209fea 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -19,7 +19,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.commons.lang.StringUtils; - import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -59,7 +58,7 @@ public void beforeMethod(Method method) { public void afterMethod(ITestResult result) { super.afterMethod(result); } - + @Test public void testNginxDockerfileBuilder() { File baseDir = new File(Thread.currentThread().getContextClassLoader() @@ -77,7 +76,7 @@ public void testNginxDockerfileBuilder() { .inspectImageCmd(imageId).exec(); assertThat(inspectImageResponse, not(nullValue())); LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - + assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); } @@ -112,7 +111,7 @@ public void testNonstandard2() { } @Test - public void testDockerBuilderFromTar() throws IOException { + public void testDockerBuilderFromTar() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile()); Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString()); @@ -121,7 +120,7 @@ public void testDockerBuilderFromTar() throws IOException { } @Test - public void testDockerBuilderAddUrl() { + public void testDockerBuilderAddUrl() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddUrl").getFile()); String response = dockerfileBuild(baseDir); @@ -129,17 +128,15 @@ public void testDockerBuilderAddUrl() { } @Test - public void testDockerBuilderAddFileInSubfolder() throws DockerException, - IOException { + public void testDockerBuilderAddFileInSubfolder() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddFileInSubfolder").getFile()); String response = dockerfileBuild(baseDir); assertThat(response, containsString("Successfully executed testrun.sh")); } - + @Test - public void testDockerBuilderAddFilesViaWildcard() throws DockerException, - IOException { + public void testDockerBuilderAddFilesViaWildcard() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddFilesViaWildcard").getFile()); String response = dockerfileBuild(baseDir); @@ -148,32 +145,30 @@ public void testDockerBuilderAddFilesViaWildcard() throws DockerException, } @Test - public void testDockerBuilderAddFolder() throws DockerException, - IOException { + public void testDockerBuilderAddFolder() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testAddFolder").getFile()); String response = dockerfileBuild(baseDir); assertThat(response, containsString("Successfully executed testAddFolder.sh")); } - + @Test - public void testDockerBuilderEnv() throws DockerException, - IOException { + public void testDockerBuilderEnv() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testEnv").getFile()); String response = dockerfileBuild(baseDir); assertThat(response, containsString("Successfully executed testrun.sh")); } - private String dockerfileBuild(InputStream tarInputStream) { + private String dockerfileBuild(InputStream tarInputStream) throws Exception { return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream)); } - private String dockerfileBuild(File baseDir) { + private String dockerfileBuild(File baseDir) throws Exception { return execBuild(dockerClient.buildImageCmd(baseDir)); } - private String execBuild(BuildImageCmd buildImageCmd) { + private String execBuild(BuildImageCmd buildImageCmd) throws Exception { // Build image InputStream response = buildImageCmd.withNoCache().exec(); @@ -191,17 +186,11 @@ private String execBuild(BuildImageCmd buildImageCmd) { dockerClient.startContainerCmd(container.getId()).exec(); dockerClient.waitContainerCmd(container.getId()).exec(); - // Log container - InputStream logResponse = logContainer(container.getId()); - - //assertThat(asString(logResponse), containsString(expectedText)); + return containerLog(container.getId()); - return asString(logResponse); } - private InputStream logContainer(String containerId) { - return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec(); - } + @Test(expectedExceptions={DockerClientException.class}) public void testDockerfileIgnored() { @@ -218,8 +207,7 @@ public void testInvalidDockerIgnorePattern() { } @Test(groups = "ignoreInCircleCi") - public void testDockerIgnore() throws DockerException, - IOException { + public void testDockerIgnore() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testDockerignore").getFile()); String response = dockerfileBuild(baseDir); @@ -242,7 +230,7 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti "Successfully built ", "\n").trim(); } } - + assertNotNull(imageId, "Not successful in build"); @@ -251,12 +239,12 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti assertThat(inspectImageResponse, not(nullValue())); assertThat(inspectImageResponse.getId(), not(nullValue())); LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - + CreateContainerResponse container = dockerClient.createContainerCmd( inspectImageResponse.getId()).exec(); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); - + InspectContainerResponse inspectContainerResponse = dockerClient .inspectContainerCmd(container.getId()).exec(); @@ -275,7 +263,7 @@ public void testNetCatDockerfileBuilder() throws InterruptedException, IOExcepti } @Test - public void testAddAndCopySubstitution () throws DockerException, IOException { + public void testAddAndCopySubstitution () throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testENVSubstitution").getFile()); String response = dockerfileBuild(baseDir); diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index c652f51d7..94d4cff62 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -23,153 +23,138 @@ @Test(groups = "integration") public class CreateContainerCmdImplTest extends AbstractDockerClientTest { - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - @Test - public void createContainerWithExistingName() throws DockerException { + @Test + public void createContainerWithExistingName() throws DockerException { - String containerName = "generated_" + new SecureRandom().nextInt(); + String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("env") - .withName(containerName).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("env") + .withName(containerName).exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - try { - dockerClient.createContainerCmd("busybox").withCmd("env") - .withName(containerName).exec(); - fail("expected ConflictException"); - } catch (ConflictException e) { - } - } + try { + dockerClient.createContainerCmd("busybox").withCmd("env").withName(containerName).exec(); + fail("expected ConflictException"); + } catch (ConflictException e) { + } + } - @Test - public void createContainerWithVolume() throws DockerException { + @Test + public void createContainerWithVolume() throws DockerException { - Volume volume = new Volume("/var/log"); - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withVolumes(volume).withCmd("true").exec(); + Volume volume = new Volume("/var/log"); - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume) + .withCmd("true").exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container {}", container.toString()); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(container.getId(), not(isEmptyString())); - LOG.info("Inspect container {}", inspectContainerResponse.getConfig() - .getVolumes()); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), - contains("/var/log")); - - assertThat(inspectContainerResponse.getVolumesRW(), - hasItemInArray(new VolumeRW(volume, AccessMode.rw))); - } - - @Test - public void createContainerWithReadOnlyVolume() throws DockerException { + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); - Volume volume = new Volume("/srv/test"); - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withVolumes(volume) - .withCmd("true") - .exec(); + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); - LOG.info("Created container {}", container.toString()); + assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw))); + } - assertThat(container.getId(), not(isEmptyString())); + @Test + public void createContainerWithReadOnlyVolume() throws DockerException { - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + Volume volume = new Volume("/srv/test"); - LOG.info("Inspect container {}", inspectContainerResponse.getConfig() - .getVolumes()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume) + .withCmd("true").exec(); - assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), - contains("/srv/test")); - - assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(new VolumeRW(volume))); - } - - @Test - public void createContainerWithVolumesFrom() throws DockerException { - - Volume volume1 = new Volume("/opt/webapp1"); - Volume volume2 = new Volume("/opt/webapp2"); - - String container1Name = UUID.randomUUID().toString(); - - // create a running container with bind mounts - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container1Name) - .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)) - .exec(); - LOG.info("Created container1 {}", container1.toString()); - - dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("Started container1 {}", container1.toString()); - - InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( - container1.getId()).exec(); - - assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); - - // create a second container with volumes from first container - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withVolumesFrom(new VolumesFrom(container1Name)).exec(); - LOG.info("Created container2 {}", container2.toString()); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - - // No volumes are created, the information is just stored in .HostConfig.VolumesFrom - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name))); - - // To ensure that the information stored in VolumesFrom really is considered - // when starting the container, we start it and verify that it has the same - // bind mounts as the first container. - // This is somehow out of scope here, but it helped me to understand how the - // VolumesFrom feature really works. - dockerClient.startContainerCmd(container2.getId()).exec(); - LOG.info("Started container2 {}", container2.toString()); - - inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); - - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name))); - assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); - } + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); + + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test")); + + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume))); + } + + @Test + public void createContainerWithVolumesFrom() throws DockerException { + + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); + + String container1Name = UUID.randomUUID().toString(); + + // create a running container with bind mounts + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name) + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Created container1 {}", container1.toString()); + + dockerClient.startContainerCmd(container1.getId()).exec(); + LOG.info("Started container1 {}", container1.toString()); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + + // create a second container with volumes from first container + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withVolumesFrom(new VolumesFrom(container1Name)).exec(); + LOG.info("Created container2 {}", container2.toString()); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + + // No volumes are created, the information is just stored in .HostConfig.VolumesFrom + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); - @Test - public void createContainerWithEnv() throws DockerException { + // To ensure that the information stored in VolumesFrom really is considered + // when starting the container, we start it and verify that it has the same + // bind mounts as the first container. + // This is somehow out of scope here, but it helped me to understand how the + // VolumesFrom feature really works. + dockerClient.startContainerCmd(container2.getId()).exec(); + LOG.info("Started container2 {}", container2.toString()); + + inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); + + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } + + @Test + public void createContainerWithEnv() throws Exception { CreateContainerResponse container = dockerClient .createContainerCmd("busybox").withEnv("VARIABLE=success") @@ -188,381 +173,324 @@ public void createContainerWithEnv() throws DockerException { dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(asString(dockerClient.logContainerCmd(container.getId()) - .withStdOut().exec()), containsString("VARIABLE=success")); + assertThat(containerLog(container.getId()), containsString("VARIABLE=success")); } - @Test - public void createContainerWithHostname() throws DockerException { + @Test + public void createContainerWithHostname() throws Exception { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withHostName("docker-java") - .withCmd("env").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withHostName("docker-java") + .withCmd("env").exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getConfig().getHostName(), - equalTo("docker-java")); + assertThat(inspectContainerResponse.getConfig().getHostName(), equalTo("docker-java")); - dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(asString(dockerClient.logContainerCmd(container.getId()) - .withStdOut().exec()), containsString("HOSTNAME=docker-java")); - } + assertThat(containerLog(container.getId()), + containsString("HOSTNAME=docker-java")); + } - @Test - public void createContainerWithName() throws DockerException { + @Test + public void createContainerWithName() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withCmd("env").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withCmd("env").exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getName(), equalTo("/container")); + assertThat(inspectContainerResponse.getName(), equalTo("/container")); - try { - dockerClient.createContainerCmd("busybox").withName("container") - .withCmd("env").exec(); - fail("Expected ConflictException"); - } catch (ConflictException e) { - } + try { + dockerClient.createContainerCmd("busybox").withName("container").withCmd("env").exec(); + fail("Expected ConflictException"); + } catch (ConflictException e) { + } - } - - @Test - public void createContainerWithLink() throws DockerException { - - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").withName("container1").exec(); - LOG.info("Created container1 {}", container1.toString()); - assertThat(container1.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container1.getId()).exec(); - - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - - HostConfig hostConfig = new HostConfig(); - hostConfig.setLinks(new Link("container1", "container1Link")); - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withName("container2").withHostConfig(hostConfig) - .withCmd("env").exec(); - LOG.info("Created container {}", container2.toString()); - assertThat(container2.getId(), not(isEmptyString())); + } - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); - } + @Test + public void createContainerWithLink() throws DockerException { - @Test - public void createContainerWithCapAddAndCapDrop() throws DockerException { + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCapAdd(NET_ADMIN) - .withCapDrop(MKNOD).exec(); + dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("Created container {}", container.toString()); + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - assertThat(container.getId(), not(isEmptyString())); + HostConfig hostConfig = new HostConfig(); + hostConfig.setLinks(new Link("container1", "container1Link")); + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withName("container2") + .withHostConfig(hostConfig).withCmd("env").exec(); + LOG.info("Created container {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + } - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapAdd()), contains(NET_ADMIN)); + @Test + public void createContainerWithCapAddAndCapDrop() throws DockerException { - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapDrop()), contains(MKNOD)); - } + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD).exec(); - @Test - public void createContainerWithDns() throws DockerException { + LOG.info("Created container {}", container.toString()); - String aDnsServer = "8.8.8.8"; - String anotherDnsServer = "8.8.4.4"; + assertThat(container.getId(), not(isEmptyString())); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true").withDns(aDnsServer, anotherDnsServer).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - LOG.info("Created container {}", container.toString()); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN)); - assertThat(container.getId(), not(isEmptyString())); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD)); + } - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + @Test + public void createContainerWithDns() throws DockerException { - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), - contains(aDnsServer, anotherDnsServer)); - } - - @Test - public void createContainerWithEntrypoint() throws DockerException { + String aDnsServer = "8.8.8.8"; + String anotherDnsServer = "8.8.4.4"; - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withEntrypoint("sleep", "9999").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDns(aDnsServer, anotherDnsServer).exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999")); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(aDnsServer, anotherDnsServer)); + } - } + @Test + public void createContainerWithEntrypoint() throws DockerException { - @Test - public void createContainerWithExtraHosts() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withEntrypoint("sleep", "9999").exec(); - String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"}; + LOG.info("Created container {}", container.toString()); - HostConfig hostConfig = new HostConfig(); - hostConfig.setExtraHosts(extraHosts); + assertThat(container.getId(), not(isEmptyString())); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withHostConfig(hostConfig).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - LOG.info("Created container {}", container.toString()); + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999")); - assertThat(container.getId(), not(isEmptyString())); + } - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + @Test + public void createContainerWithExtraHosts() throws DockerException { - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), - containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); - } - - @Test - public void createContainerWithDevices() throws DockerException { + String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" }; - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) - .exec(); + HostConfig hostConfig = new HostConfig(); + hostConfig.setExtraHosts(extraHosts); - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withHostConfig(hostConfig).exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container {}", container.toString()); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(container.getId(), not(isEmptyString())); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDevices()), contains(new Device("rwm", "/dev/nulo", - "/dev/zero"))); - } - - @Test - public void createContainerWithPortBindings() throws DockerException { - - ExposedPort tcp22 = ExposedPort.tcp(22); - ExposedPort tcp23 = ExposedPort.tcp(23); - - Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23) - .withPortBindings(portBindings) - .exec(); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), + containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); + } - LOG.info("Created container {}", container.toString()); + @Test + public void createContainerWithDevices() throws DockerException { - assertThat(container.getId(), not(isEmptyString())); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + LOG.info("Created container {}", container.toString()); - assertThat(Arrays.asList(inspectContainerResponse.getConfig() - .getExposedPorts()), contains(tcp22, tcp23)); + assertThat(container.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022)))); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023)))); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", + "/dev/nulo", "/dev/zero"))); + } - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024)))); + @Test + public void createContainerWithPortBindings() throws DockerException { - } - - @Test - public void createContainerWithLinking() throws DockerException { - - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999") - .withName("container1").exec(); - - LOG.info("Created container1 {}", container1.toString()); - assertThat(container1.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container1.getId()).exec(); - - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - - assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getId(), - startsWith(container1.getId())); - assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); - assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - - if (!inspectContainerResponse1.getState().isRunning()) { - assertThat(inspectContainerResponse1.getState().getExitCode(), - is(equalTo(0))); - } - - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container2") - .withLinks(new Link("container1", "container1Link")) - .exec(); - - LOG.info("Created container2 {}", container2.toString()); - assertThat(container2.getId(), not(isEmptyString())); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - - assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getHostConfig(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); - assertThat(inspectContainerResponse2.getId(), - startsWith(container2.getId())); - assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); - assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); - + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); - } - - @Test - public void createContainerWithRestartPolicy() throws DockerException { + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); - RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999") - .withRestartPolicy(restartPolicy) - .exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); - LOG.info("Created container {}", container.toString()); + LOG.info("Created container {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), - is(equalTo(restartPolicy))); - } + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); - /** - * This tests support for --net option for the docker run command: - * --net="bridge" Set the Network mode for the container 'bridge': creates a - * new network stack for the container on the docker bridge 'none': no - * networking for this container 'container:': reuses another container - * network stack 'host': use the host network stack inside the container. - * Note: the host mode gives the container full access to local system - * services such as D-bus and is therefore considered insecure. - */ - @Test - public void createContainerWithNetworkMode() throws DockerException { + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], + is(equalTo(Ports.Binding(11022)))); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true") - .withNetworkMode("host") - .exec(); + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], + is(equalTo(Ports.Binding(11023)))); - LOG.info("Created container {}", container.toString()); + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], + is(equalTo(Ports.Binding(11024)))); - assertThat(container.getId(), not(isEmptyString())); + } - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + @Test + public void createContainerWithLinking() throws DockerException { - assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), - is(equalTo("host"))); - } - - @Test - public void createContainerWithMacAddress() throws DockerException { + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withMacAddress("00:80:41:ae:fd:7e") - .withCmd("true") - .exec(); + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); - LOG.info("Created container {}", container.toString()); + dockerClient.startContainerCmd(container1.getId()).exec(); - assertThat(container.getId(), not(isEmptyString())); + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - assertEquals(inspectContainerResponse.getConfig().getMacAddress(), - "00:80:41:ae:fd:7e"); - } + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } - @Test(groups = "ignoreInCircleCi") - public void createContainerWithULimits() throws DockerException { + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); - Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); - HostConfig hostConfig = new HostConfig(); - hostConfig.setUlimits(ulimits); + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withHostConfig(hostConfig).exec(); + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); - LOG.info("Created container {}", container.toString()); + } - assertThat(container.getId(), not(isEmptyString())); + @Test + public void createContainerWithRestartPolicy() throws DockerException { - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()), - containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096))); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); + } + + /** + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the + * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for + * this container 'container:': reuses another container network stack 'host': use the host network stack inside the + * container. Note: the host mode gives the container full access to local system services such as D-bus and is + * therefore considered insecure. + */ + @Test + public void createContainerWithNetworkMode() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withNetworkMode("host").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host"))); + } + + @Test + public void createContainerWithMacAddress() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withMacAddress("00:80:41:ae:fd:7e").withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertEquals(inspectContainerResponse.getConfig().getMacAddress(), "00:80:41:ae:fd:7e"); + } + + @Test(groups = "ignoreInCircleCi") + public void createContainerWithULimits() throws DockerException { + + Ulimit[] ulimits = { new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096) }; + + HostConfig hostConfig = new HostConfig(); + hostConfig.setUlimits(ulimits); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withHostConfig(hostConfig).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()), + containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096))); + + } - } - } diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index 34a74ad80..ecb7ab66c 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -1,14 +1,11 @@ package com.github.dockerjava.core.command; -import java.io.Closeable; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -20,10 +17,9 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.EventsCmd.EventStreamCallback; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.async.DefaultCallback; +import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { @@ -54,6 +50,9 @@ public void afterMethod(ITestResult result) { super.afterMethod(result); } + /* + * This specific test may fail with boot2docker as time may not in sync with host system + */ @Test public void testEventStreamTimeBound() throws InterruptedException, IOException { @@ -132,7 +131,7 @@ private int generateEvents() { return KNOWN_NUM_EVENTS; } - private class EventCallbackTest extends DefaultCallback implements EventStreamCallback { + private class EventCallbackTest extends ResultCallbackTemplate { private final CountDownLatch countDownLatch; @@ -142,16 +141,12 @@ public EventCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } - public void onStream(Event event) { + public void onResult(Event event) { LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); countDownLatch.countDown(); events.add(event); } - public void onError(Throwable throwable) { - LOG.error("Error occurred: {}", throwable.getMessage()); - } - public List getEvents() { return new ArrayList(events); } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 80619efeb..a62a5bd9a 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -38,7 +38,7 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void execStartTest() throws Exception { + public void execStart() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient @@ -64,4 +64,32 @@ public void execStartTest() throws Exception { assertNotNull(responseAsString); assertTrue(responseAsString.length() > 0); } + + @Test(groups = "ignoreInCircleCi") + public void execStartAttached() throws Exception { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox") + .withCmd("sleep", "9999") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true) + .withCmd("touch", "/execStartTest.log").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).exec(); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 24c833559..6f847ebed 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; import static org.testng.Assert.assertEquals; -import static org.testng.AssertJUnit.assertNull; +import static org.testng.Assert.assertFalse; -import java.io.IOException; -import java.io.InputStream; +import java.util.Iterator; +import java.util.List; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; @@ -13,85 +13,86 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; +import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.DockerClientBuilder; @Test(groups = "integration") public class FrameReaderITest { - private DockerClient dockerClient; - private DockerfileFixture dockerfileFixture; - - @BeforeTest - public void beforeTest() throws Exception { - dockerClient = DockerClientBuilder.getInstance().build(); - dockerfileFixture = new DockerfileFixture(dockerClient, - "frameReaderDockerfile"); - dockerfileFixture.open(); - } - - @AfterTest - public void deleteDockerContainerImage() throws Exception { - dockerfileFixture.close(); - dockerClient.close(); - } - - @Test - public void canCloseFrameReaderAndReadExpectedLines() throws Exception { - - // wait for the container to be successfully executed - int exitCode = dockerClient.waitContainerCmd( - dockerfileFixture.getContainerId()).exec(); - assertEquals(0, exitCode); - - InputStream response = getLoggerStream(); - - try (FrameReader reader = new FrameReader(response)) { - assertEquals(reader.readFrame(), new Frame(StreamType.STDOUT, - "to stdout\n".getBytes())); - assertEquals(reader.readFrame(), new Frame(StreamType.STDERR, - "to stderr\n".getBytes())); - assertNull(reader.readFrame()); - } - } - - private InputStream getLoggerStream() { - - return dockerClient.logContainerCmd(dockerfileFixture.getContainerId()) - .withStdOut() - .withStdErr() - .withTailAll() - // we can't follow stream here as it blocks reading from resulting InputStream infinitely - //.withFollowStream() - .exec(); - } - - @Test - public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception { - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - try (FrameReader reader = new FrameReader(getLoggerStream())) { - // noinspection StatementWithEmptyBody - while (reader.readFrame() != null) { - // nop - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }); - - thread.start(); - - try (DockerfileFixture busyboxDockerfile = new DockerfileFixture( - dockerClient, "busyboxDockerfile")) { - busyboxDockerfile.open(); - } - - thread.join(); - - } + private DockerClient dockerClient; + + private DockerfileFixture dockerfileFixture; + + @BeforeTest + public void beforeTest() throws Exception { + dockerClient = DockerClientBuilder.getInstance().build(); + dockerfileFixture = new DockerfileFixture(dockerClient, "frameReaderDockerfile"); + dockerfileFixture.open(); + } + + @AfterTest + public void deleteDockerContainerImage() throws Exception { + dockerfileFixture.close(); + dockerClient.close(); + } + + @Test + public void canCloseFrameReaderAndReadExpectedLines() throws Exception { + + // wait for the container to be successfully executed + int exitCode = dockerClient.waitContainerCmd(dockerfileFixture.getContainerId()).exec(); + assertEquals(0, exitCode); + + Iterator response = getLoggingFrames().iterator(); + + assertEquals(response.next(), new Frame(StreamType.STDOUT, "to stdout\n".getBytes())); + assertEquals(response.next(), new Frame(StreamType.STDERR, "to stderr\n".getBytes())); + assertFalse(response.hasNext()); + + } + + private List getLoggingFrames() throws Exception { + + AbstractDockerClientTest.CollectFramesCallback collectFramesCallback = new AbstractDockerClientTest.CollectFramesCallback(); + + dockerClient.logContainerCmd(dockerfileFixture.getContainerId(), collectFramesCallback).withStdOut() + .withStdErr().withTailAll() + // we can't follow stream here as it blocks reading from resulting InputStream infinitely + // .withFollowStream() + .exec(); + + collectFramesCallback.awaitFinish(); + + return collectFramesCallback.frames; + } + + @Test + public void canLogInOneThreadAndExecuteCommandsInAnother() throws Exception { + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + + Iterator frames = getLoggingFrames().iterator(); + + while (frames.hasNext()) { + frames.next(); + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + + thread.start(); + + try (DockerfileFixture busyboxDockerfile = new DockerfileFixture(dockerClient, "busyboxDockerfile")) { + busyboxDockerfile.open(); + } + + thread.join(); + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java index 94a27b1d3..7b43e1312 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -1,13 +1,14 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; -import java.io.InputStream; +import java.io.IOException; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -19,101 +20,127 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class LogContainerCmdImplTest extends AbstractDockerClientTest { - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - @Test - public void logContainer() throws Exception { + @Test + public void asyncLogContainer() throws Exception { - String snippet = "hello world"; + String snippet = "hello world"; - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("/bin/echo", snippet).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(exitCode, equalTo(0)); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); - InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + assertThat(exitCode, equalTo(0)); - String log = asString(response); - - //LOG.info("resonse: " + log); - - assertThat(log, endsWith(snippet)); - } - - @Test - public void logNonExistingContainer() throws Exception { + CollectFramesCallback loggingCallback = new CollectFramesCallback(); - try { - dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } - - @Test - public void multipleLogContainer() throws Exception { + dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); - String snippet = "hello world"; + loggingCallback.awaitFinish(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("/bin/echo", snippet).exec(); + assertTrue(loggingCallback.toString().contains(snippet)); + } - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + @Test + public void asyncLogNonExistingContainer() throws Exception { - dockerClient.startContainerCmd(container.getId()).exec(); - - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + CollectFramesCallback loggingCallback = new CollectFramesCallback() { + @Override + public void onError(Throwable throwable) { - assertThat(exitCode, equalTo(0)); + assertEquals(throwable.getClass().getName(), NotFoundException.class.getName()); - InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + try { + // close the callback to prevent the call to onFinish + close(); + } catch (IOException e) { + throw new RuntimeException(); + } - response.close(); - - //String log = asString(response); - - response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + super.onError(throwable); + } - //log = asString(response); - response.close(); - - response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + public void onFinish() { + super.onFinish(); + fail("expected NotFoundException"); + }; + }; + + dockerClient.logContainerCmd("non-existing", loggingCallback).withStdErr().withStdOut().exec(); + + loggingCallback.awaitFinish(); + } + + @Test + public void asyncMultipleLogContainer() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + + assertThat(exitCode, equalTo(0)); + + CollectFramesCallback loggingCallback = new CollectFramesCallback(); + + dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + + loggingCallback.close(); + + loggingCallback = new CollectFramesCallback(); + + dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + + loggingCallback.close(); + + loggingCallback = new CollectFramesCallback(); + + dockerClient.logContainerCmd(container.getId(), loggingCallback).withStdErr().withStdOut().exec(); + + loggingCallback.awaitFinish(); + + assertTrue(loggingCallback.toString().contains(snippet)); + } - String log = asString(response); - - assertThat(log, endsWith(snippet)); - } } diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index e809e25e3..845f8f9c1 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -20,10 +20,9 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.StatsCmd; -import com.github.dockerjava.api.command.StatsCmd.StatisticsCallback; import com.github.dockerjava.api.model.Statistics; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.async.DefaultCallback; +import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class StatsCmdImplTest extends AbstractDockerClientTest { @@ -85,7 +84,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { } - private class StatsCallbackTest extends DefaultCallback implements StatisticsCallback { + private class StatsCallbackTest extends ResultCallbackTemplate { private final CountDownLatch countDownLatch; private boolean gotStats = false; @@ -95,7 +94,7 @@ public StatsCallbackTest(CountDownLatch countDownLatch) { } @Override - public void onStream(Statistics stats) { + public void onResult(Statistics stats) { LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats); if (stats != null) { gotStats = true; From be236cc0935369bd33c36c1954e457cb0b71f26e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 26 Jun 2015 20:41:26 +0200 Subject: [PATCH 0249/1399] Refact streaming --- .../dockerjava/api/async/ResultCallback.java | 6 +- .../dockerjava/api/model/StreamType.java | 3 +- .../core/async/FrameStreamProcessor.java | 4 +- .../core/async/JsonStreamProcessor.java | 4 +- .../core/async/ResultCallbackTemplate.java | 6 +- .../dockerjava/core/command/FrameReader.java | 79 +++++++++++-------- .../client/AbstractDockerClientTest.java | 4 +- .../command/AttachContainerCmdImplTest.java | 69 ++++++++++++++-- .../core/command/EventsCmdImplTest.java | 2 +- .../core/command/LogContainerCmdImplTest.java | 4 +- .../core/command/StatsCmdImplTest.java | 2 +- .../attachContainerTestDockerfile/Dockerfile | 8 ++ .../attachContainerTestDockerfile/echo.sh | 2 + 13 files changed, 137 insertions(+), 56 deletions(-) create mode 100644 src/test/resources/attachContainerTestDockerfile/Dockerfile create mode 100644 src/test/resources/attachContainerTestDockerfile/echo.sh diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index f4f519d3e..2954b9242 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -5,14 +5,14 @@ /** * Result callback */ -public interface ResultCallback { +public interface ResultCallback extends Closeable { /** Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the processing */ void onStart(Closeable closeable); /** Called when an async result event occurs */ - void onResult(RES_T object); + void onNext(RES_T object); /** Called when an exception occurs while processing */ void onError(Throwable throwable); /** Called when processing was finished either by reaching the end or by aborting it */ - void onFinish(); + void onComplete(); } diff --git a/src/main/java/com/github/dockerjava/api/model/StreamType.java b/src/main/java/com/github/dockerjava/api/model/StreamType.java index eb11c5536..0040c1bc8 100644 --- a/src/main/java/com/github/dockerjava/api/model/StreamType.java +++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java @@ -3,5 +3,6 @@ public enum StreamType { STDIN, STDOUT, - STDERR + STDERR, + RAW } diff --git a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java index cc6474d09..220cd80ef 100644 --- a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java @@ -28,7 +28,7 @@ public void processResponseStream(InputStream response, ResultCallback re Frame frame = frameReader.readFrame(); while (frame != null) { try { - resultCallback.onResult(frame); + resultCallback.onNext(frame); } catch (Exception e) { resultCallback.onError(e); } finally { @@ -44,7 +44,7 @@ public void processResponseStream(InputStream response, ResultCallback re } catch (IOException e) { resultCallback.onError(e); } finally { - resultCallback.onFinish(); + resultCallback.onComplete(); } } } diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 24d83b129..5339b3ed0 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -38,7 +38,7 @@ public void processResponseStream(InputStream response, ResultCallback result JsonParser jp = JSON_FACTORY.createParser(response); while (!jp.isClosed() && jp.nextToken() != JsonToken.END_OBJECT) { try { - resultCallback.onResult(OBJECT_MAPPER.readValue(jp, clazz)); + resultCallback.onNext(OBJECT_MAPPER.readValue(jp, clazz)); } catch (Exception e) { resultCallback.onError(e); } @@ -51,7 +51,7 @@ public void processResponseStream(InputStream response, ResultCallback result } catch (IOException e) { resultCallback.onError(e); } finally { - resultCallback.onFinish(); + resultCallback.onComplete(); } } diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java index c98cddf4c..f56db8db4 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -16,7 +16,7 @@ * @author marcus * */ -public class ResultCallbackTemplate implements ResultCallback, Closeable { +public class ResultCallbackTemplate implements ResultCallback { private final CountDownLatch finished = new CountDownLatch(1); @@ -28,7 +28,7 @@ public void onStart(Closeable stream) { } @Override - public void onResult(T object) { + public void onNext(T object) { } @Override @@ -45,7 +45,7 @@ public void onError(Throwable throwable) { } @Override - public void onFinish() { + public void onComplete() { try { close(); } catch (IOException e) { diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index bb36c1764..69114dae8 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -1,35 +1,43 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.StreamType; - import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; + +import org.apache.commons.io.HexDump; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; /** * Breaks the input into frame. Similar to how a buffered reader would readLies. *

- * See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container} + * See: {@link }http://docs.docker.com/v1.6/reference/api/docker_remote_api_v1.13/#attach-to-a-container} */ public class FrameReader implements AutoCloseable { + private static final int BUFFER_SIZE = 100; + private static final int HEADER_SIZE = 8; + private final InputStream inputStream; + private boolean rawDetected = false; + public FrameReader(InputStream inputStream) { this.inputStream = inputStream; } private static StreamType streamType(byte streamType) { switch (streamType) { - case 0: - return StreamType.STDIN; - case 1: - return StreamType.STDOUT; - case 2: - return StreamType.STDERR; - default: - throw new IllegalArgumentException("invalid streamType"); + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + throw new IllegalArgumentException("invalid streamType"); } } @@ -37,41 +45,44 @@ private static StreamType streamType(byte streamType) { * @return A frame, or null if no more frames. */ public Frame readFrame() throws IOException { - byte[] header = new byte[HEADER_SIZE]; - int actualHeaderSize = 0; + byte[] buffer = new byte[BUFFER_SIZE]; - do { - int headerCount = inputStream.read(header, actualHeaderSize, HEADER_SIZE - actualHeaderSize); + int readBytes = inputStream.read(buffer); - if (headerCount == -1) { - return null; - } - actualHeaderSize += headerCount; - } while (actualHeaderSize < HEADER_SIZE); + if (readBytes == -1) { + return null; + } + + if (rawDetected || readBytes != HEADER_SIZE) { + rawDetected = true; - int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); + byte[] read = Arrays.copyOfRange(buffer, 0, readBytes); - byte[] payload = new byte[payloadSize]; - int actualPayloadSize = 0; + return new Frame(StreamType.RAW, read); + } else { - do { - int count = inputStream.read(payload, actualPayloadSize, payloadSize - actualPayloadSize); + int payloadSize = ((buffer[4] & 0xff) << 24) + ((buffer[5] & 0xff) << 16) + ((buffer[6] & 0xff) << 8) + + (buffer[7] & 0xff); - if (count == -1) { - if (actualPayloadSize != payloadSize) { - throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize)); - } - break; + byte[] payload = new byte[payloadSize]; + int actualPayloadSize = inputStream.read(payload); + if (actualPayloadSize != payloadSize) { + throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, + actualPayloadSize)); } - actualPayloadSize += count; - } while (actualPayloadSize < payloadSize); - return new Frame(streamType(header[0]), payload); + return new Frame(streamType(buffer[0]), payload); + + } + } @Override public void close() throws IOException { inputStream.close(); } + + + } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 9eda0cbc5..ec70de4c7 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -200,9 +200,9 @@ public void onError(Throwable throwable) { } @Override - public void onResult(Frame frame) { + public void onNext(Frame frame) { frames.add(frame); - log.append(new String(frame.getPayload()).trim()); + log.append(new String(frame.getPayload())); } @Override diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java index dec4a3b3b..c4147f1a5 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -1,13 +1,19 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.containsString; +import java.io.File; +import java.io.InputStream; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; +import org.apache.commons.io.HexDump; +import org.apache.commons.lang.StringUtils; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -17,6 +23,8 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -43,28 +51,79 @@ public void afterMethod(ITestResult result) { } @Test - public void attachContainer() throws Exception { + public void attachContainerWithoutTTY() throws Exception { String snippet = "hello world"; - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("echo", snippet) + .withTty(false).exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); - CollectFramesCallback collectFramesCallback = new CollectFramesCallback(); + CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + @Override + public void onNext(Frame frame) { + assertEquals(frame.getStreamType(), StreamType.RAW); + super.onNext(frame); + }; + }; dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut() .withFollowStream().withLogs().exec(); + collectFramesCallback.awaitFinish(30, TimeUnit.SECONDS); + + collectFramesCallback.close(); + + assertThat(collectFramesCallback.toString(), endsWith(snippet)); + } + + + @Test + public void attachContainerWithTTY() throws Exception { + + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("attachContainerTestDockerfile").getFile()); + + InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + + String imageId = StringUtils.substringBetween(fullLog, + "Successfully built ", "\\n\"}").trim(); + + CreateContainerResponse container = dockerClient.createContainerCmd(imageId) + .withTty(true).exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + @Override + public void onNext(Frame frame) { + assertEquals(frame.getStreamType(), StreamType.RAW); + super.onNext(frame); + }; + }; + + dockerClient.attachContainerCmd(container.getId(), collectFramesCallback).withStdErr().withStdOut() + .withFollowStream().exec(); + collectFramesCallback.awaitFinish(10, TimeUnit.SECONDS); collectFramesCallback.close(); - // LOG.info("resonse: " + log); + System.out.println("log: " + collectFramesCallback.toString()); - assertThat(collectFramesCallback.toString(), endsWith(snippet)); + + HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); + + assertThat(collectFramesCallback.toString(), containsString("stdout\r\nstderr")); } } diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java index ecb7ab66c..baaeb8ca3 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -141,7 +141,7 @@ public EventCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } - public void onResult(Event event) { + public void onNext(Event event) { LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); countDownLatch.countDown(); events.add(event); diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java index 7b43e1312..18c001c5f 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -92,8 +92,8 @@ public void onError(Throwable throwable) { super.onError(throwable); } - public void onFinish() { - super.onFinish(); + public void onComplete() { + super.onComplete(); fail("expected NotFoundException"); }; }; diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index 845f8f9c1..5ccb01038 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -94,7 +94,7 @@ public StatsCallbackTest(CountDownLatch countDownLatch) { } @Override - public void onResult(Statistics stats) { + public void onNext(Statistics stats) { LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats); if (stats != null) { gotStats = true; diff --git a/src/test/resources/attachContainerTestDockerfile/Dockerfile b/src/test/resources/attachContainerTestDockerfile/Dockerfile new file mode 100644 index 000000000..90cca5e64 --- /dev/null +++ b/src/test/resources/attachContainerTestDockerfile/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:latest + +ADD ./echo.sh /tmp/ + +RUN cp /tmp/echo.sh /usr/local/bin/ && chmod +x /usr/local/bin/echo.sh + +CMD ["echo.sh"] + diff --git a/src/test/resources/attachContainerTestDockerfile/echo.sh b/src/test/resources/attachContainerTestDockerfile/echo.sh new file mode 100644 index 000000000..88b444bf0 --- /dev/null +++ b/src/test/resources/attachContainerTestDockerfile/echo.sh @@ -0,0 +1,2 @@ +#!/bin/sh +while sleep 2; do echo stdout && echo stderr >&2; done \ No newline at end of file From e60e7de743492c1b1181f99ec702f0e8616b01a7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 26 Jun 2015 20:44:26 +0200 Subject: [PATCH 0250/1399] Formatting sources --- .../dockerjava/api/BadRequestException.java | 13 +- .../dockerjava/api/ConflictException.java | 13 +- .../github/dockerjava/api/DockerClient.java | 130 ++- .../dockerjava/api/DockerClientException.java | 4 +- .../dockerjava/api/DockerException.java | 15 +- .../api/InternalServerErrorException.java | 12 +- .../api/NotAcceptableException.java | 12 +- .../dockerjava/api/NotFoundException.java | 12 +- .../dockerjava/api/NotModifiedException.java | 12 +- .../dockerjava/api/UnauthorizedException.java | 12 +- .../api/command/AttachContainerCmd.java | 74 +- .../dockerjava/api/command/AuthCmd.java | 21 +- .../dockerjava/api/command/BuildImageCmd.java | 82 +- .../dockerjava/api/command/CommitCmd.java | 121 +-- .../api/command/ContainerDiffCmd.java | 37 +- .../api/command/CopyFileFromContainerCmd.java | 34 +- .../api/command/CreateImageCmd.java | 54 +- .../dockerjava/api/command/DockerCmd.java | 2 +- .../dockerjava/api/command/DockerCmdExec.java | 4 +- .../api/command/DockerCmdExecFactory.java | 73 +- .../dockerjava/api/command/EventCallback.java | 3 + .../dockerjava/api/command/EventsCmd.java | 9 +- .../dockerjava/api/command/ExecCreateCmd.java | 18 +- .../dockerjava/api/command/ExecStartCmd.java | 42 +- .../dockerjava/api/command/InfoCmd.java | 4 +- .../api/command/InspectContainerCmd.java | 21 +- .../api/command/InspectContainerResponse.java | 189 ++-- .../api/command/InspectExecCmd.java | 7 +- .../api/command/InspectImageCmd.java | 23 +- .../api/command/InspectImageResponse.java | 18 +- .../api/command/KillContainerCmd.java | 25 +- .../api/command/ListContainersCmd.java | 43 +- .../dockerjava/api/command/ListImagesCmd.java | 18 +- .../api/command/LogContainerCmd.java | 82 +- .../api/command/PauseContainerCmd.java | 26 +- .../dockerjava/api/command/PingCmd.java | 7 +- .../dockerjava/api/command/PullImageCmd.java | 27 +- .../dockerjava/api/command/PushImageCmd.java | 58 +- .../api/command/RemoveContainerCmd.java | 37 +- .../api/command/RemoveImageCmd.java | 87 +- .../api/command/RestartContainerCmd.java | 28 +- .../dockerjava/api/command/SaveImageCmd.java | 17 +- .../api/command/SearchImagesCmd.java | 13 +- .../dockerjava/api/command/StatsCallback.java | 3 + .../dockerjava/api/command/StatsCmd.java | 7 +- .../api/command/StopContainerCmd.java | 34 +- .../dockerjava/api/command/TagImageCmd.java | 34 +- .../api/command/TopContainerCmd.java | 25 +- .../api/command/TopContainerResponse.java | 42 +- .../api/command/UnpauseContainerCmd.java | 24 +- .../dockerjava/api/command/VersionCmd.java | 6 +- .../api/command/WaitContainerCmd.java | 23 +- .../dockerjava/api/model/AccessMode.java | 40 +- .../dockerjava/api/model/AuthConfig.java | 222 +++-- .../api/model/AuthConfigurations.java | 22 +- .../com/github/dockerjava/api/model/Bind.java | 176 ++-- .../github/dockerjava/api/model/Binds.java | 55 +- .../dockerjava/api/model/Capability.java | 612 ++++++------- .../dockerjava/api/model/Container.java | 29 +- .../dockerjava/api/model/ContainerConfig.java | 260 +++--- .../github/dockerjava/api/model/Device.java | 100 +- .../dockerjava/api/model/ErrorResponse.java | 1 + .../github/dockerjava/api/model/Event.java | 31 +- .../dockerjava/api/model/EventStreamItem.java | 21 +- .../dockerjava/api/model/ExposedPort.java | 316 +++---- .../dockerjava/api/model/ExposedPorts.java | 63 +- .../github/dockerjava/api/model/Frame.java | 7 +- .../dockerjava/api/model/HostConfig.java | 420 +++++---- .../dockerjava/api/model/Identifier.java | 34 +- .../github/dockerjava/api/model/Image.java | 12 +- .../com/github/dockerjava/api/model/Info.java | 334 +++---- .../api/model/InternetProtocol.java | 70 +- .../com/github/dockerjava/api/model/Link.java | 168 ++-- .../github/dockerjava/api/model/Links.java | 82 +- .../github/dockerjava/api/model/LxcConf.java | 48 +- .../dockerjava/api/model/PortBinding.java | 115 ++- .../github/dockerjava/api/model/Ports.java | 160 ++-- .../api/model/PullEventStreamItem.java | 17 +- .../api/model/PushEventStreamItem.java | 17 +- .../dockerjava/api/model/Repository.java | 17 +- .../dockerjava/api/model/RestartPolicy.java | 228 ++--- .../dockerjava/api/model/Statistics.java | 32 +- .../dockerjava/api/model/StreamType.java | 4 +- .../github/dockerjava/api/model/Ulimit.java | 6 +- .../github/dockerjava/api/model/Version.java | 32 +- .../github/dockerjava/api/model/Volume.java | 56 +- .../dockerjava/api/model/VolumeBind.java | 3 +- .../dockerjava/api/model/VolumeBinds.java | 17 +- .../github/dockerjava/api/model/VolumeRW.java | 160 ++-- .../github/dockerjava/api/model/Volumes.java | 69 +- .../dockerjava/api/model/VolumesFrom.java | 203 ++--- .../dockerjava/api/model/VolumesRW.java | 22 +- .../dockerjava/core/AuthConfigFile.java | 8 +- .../dockerjava/core/CertificateUtils.java | 103 +-- .../dockerjava/core/CompressArchiveUtil.java | 3 +- .../dockerjava/core/DockerClientBuilder.java | 119 ++- .../dockerjava/core/DockerClientConfig.java | 259 +++--- .../dockerjava/core/DockerClientImpl.java | 542 ++++++----- .../github/dockerjava/core/FilePathUtil.java | 9 +- .../dockerjava/core/GoLangFileMatch.java | 9 +- .../core/GoLangMatchFileFilter.java | 8 +- .../dockerjava/core/KeystoreSSLConfig.java | 195 ++-- .../core/LocalDirectorySSLConfig.java | 111 ++- .../github/dockerjava/core/NameParser.java | 20 +- .../com/github/dockerjava/core/SSLConfig.java | 14 +- .../core/command/AbstrAuthCfgDockerCmd.java | 71 +- .../core/command/AbstrDockerCmd.java | 25 +- .../core/command/AttachContainerCmdImpl.java | 215 ++--- .../dockerjava/core/command/AuthCmdImpl.java | 24 +- .../core/command/BuildImageCmdImpl.java | 272 +++--- .../core/command/CommitCmdImpl.java | 285 +++--- .../core/command/ContainerDiffCmdImpl.java | 42 +- .../command/CopyFileFromContainerCmdImpl.java | 91 +- .../core/command/CreateImageCmdImpl.java | 99 +- .../core/command/EventStreamReader.java | 2 + .../core/command/EventsCmdImpl.java | 10 +- .../core/command/ExecCreateCmdImpl.java | 50 +- .../core/command/ExecStartCmdImpl.java | 59 +- .../dockerjava/core/command/FrameReader.java | 25 +- .../dockerjava/core/command/InfoCmdImpl.java | 12 +- .../core/command/InspectContainerCmdImpl.java | 34 +- .../core/command/InspectExecCmdImpl.java | 3 +- .../core/command/InspectImageCmdImpl.java | 35 +- .../core/command/KillContainerCmdImpl.java | 48 +- .../core/command/ListContainersCmdImpl.java | 122 +-- .../core/command/ListImagesCmdImpl.java | 50 +- .../core/command/LogContainerCmdImpl.java | 170 ++-- .../core/command/PauseContainerCmdImpl.java | 48 +- .../dockerjava/core/command/PingCmdImpl.java | 6 +- .../core/command/PullImageCmdImpl.java | 53 +- .../core/command/PushImageCmdImpl.java | 44 +- .../core/command/RemoveContainerCmdImpl.java | 111 +-- .../core/command/RemoveImageCmdImpl.java | 88 +- .../core/command/RestartContainerCmdImpl.java | 55 +- .../core/command/SaveImageCmdImpl.java | 14 +- .../core/command/SearchImagesCmdImpl.java | 31 +- .../dockerjava/core/command/StatsCmdImpl.java | 10 +- .../core/command/StopContainerCmdImpl.java | 67 +- .../core/command/TagImageCmdImpl.java | 105 ++- .../core/command/TopContainerCmdImpl.java | 54 +- .../core/command/UnpauseContainerCmdImpl.java | 48 +- .../core/command/VersionCmdImpl.java | 12 +- .../core/command/WaitContainerCmdImpl.java | 22 +- .../core/dockerfile/Dockerfile.java | 320 ++++--- .../core/dockerfile/DockerfileStatement.java | 267 +++--- .../core/util/FollowRedirectsFilter.java | 17 +- .../core/util/JsonClientFilter.java | 5 +- .../dockerjava/core/util/LoggingFilter.java | 91 +- .../util/ResponseStatusExceptionFilter.java | 114 ++- .../core/util/SelectiveLoggingFilter.java | 17 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 100 +- .../dockerjava/jaxrs/ApacheUnixSocket.java | 567 ++++++------ .../jaxrs/AttachContainerCmdExec.java | 57 +- .../github/dockerjava/jaxrs/AuthCmdExec.java | 40 +- .../dockerjava/jaxrs/BuildImageCmdExec.java | 181 ++-- .../dockerjava/jaxrs/CommitCmdExec.java | 39 +- .../jaxrs/ContainerDiffCmdExec.java | 34 +- .../jaxrs/CopyFileFromContainerCmdExec.java | 42 +- .../jaxrs/CreateContainerCmdExec.java | 31 +- .../dockerjava/jaxrs/CreateImageCmdExec.java | 39 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 573 ++++++------ .../dockerjava/jaxrs/EventsCmdExec.java | 157 ++-- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 15 +- .../dockerjava/jaxrs/ExecStartCmdExec.java | 11 +- .../github/dockerjava/jaxrs/InfoCmdExec.java | 29 +- .../jaxrs/InspectContainerCmdExec.java | 34 +- .../dockerjava/jaxrs/InspectExecCmdExec.java | 3 +- .../dockerjava/jaxrs/InspectImageCmdExec.java | 32 +- .../jaxrs/KillContainerCmdExec.java | 35 +- .../jaxrs/ListContainersCmdExec.java | 39 +- .../dockerjava/jaxrs/ListImagesCmdExec.java | 41 +- .../dockerjava/jaxrs/LogContainerCmdExec.java | 45 +- .../jaxrs/PauseContainerCmdExec.java | 31 +- .../github/dockerjava/jaxrs/PingCmdExec.java | 20 +- .../dockerjava/jaxrs/PullImageCmdExec.java | 61 +- .../dockerjava/jaxrs/PushImageCmdExec.java | 104 +-- .../jaxrs/RemoveContainerCmdExec.java | 31 +- .../dockerjava/jaxrs/RemoveImageCmdExec.java | 34 +- .../jaxrs/RestartContainerCmdExec.java | 32 +- .../dockerjava/jaxrs/SaveImageCmdExec.java | 12 +- .../dockerjava/jaxrs/SearchImagesCmdExec.java | 31 +- .../jaxrs/StartContainerCmdExec.java | 29 +- .../github/dockerjava/jaxrs/StatsCmdExec.java | 19 +- .../jaxrs/StopContainerCmdExec.java | 30 +- .../dockerjava/jaxrs/TagImageCmdExec.java | 34 +- .../dockerjava/jaxrs/TopContainerCmdExec.java | 31 +- .../jaxrs/UnixConnectionSocketFactory.java | 63 +- .../jaxrs/UnpauseContainerCmdExec.java | 30 +- .../dockerjava/jaxrs/VersionCmdExec.java | 22 +- .../jaxrs/WaitContainerCmdExec.java | 29 +- .../jaxrs/connector/ApacheConnector.java | 176 ++-- .../ApacheConnectorClientResponse.java | 56 +- .../connector/ApacheConnectorProvider.java | 59 +- .../util/WrappedResponseInputStream.java | 115 +-- .../api/command/CommandJSONSamples.java | 12 +- .../command/InspectContainerResponseTest.java | 12 +- .../dockerjava/api/model/AccessModeTest.java | 39 +- .../github/dockerjava/api/model/BindTest.java | 97 +- .../dockerjava/api/model/BindingTest.java | 90 +- .../dockerjava/api/model/CapabilityTest.java | 30 +- .../dockerjava/api/model/ExposedPortTest.java | 54 +- .../dockerjava/api/model/IdentifierTest.java | 48 +- .../api/model/InternetProtocolTest.java | 60 +- .../github/dockerjava/api/model/LinkTest.java | 58 +- .../dockerjava/api/model/PortBindingTest.java | 93 +- .../api/model/Ports_SerializingTest.java | 93 +- .../api/model/Ports_addBindingsTest.java | 97 +- .../dockerjava/api/model/RepositoryTest.java | 18 +- .../api/model/RestartPolicy_ParsingTest.java | 60 +- .../model/RestartPolicy_SerializingTest.java | 61 +- .../api/model/RestartPolicy_toStringTest.java | 21 +- .../dockerjava/api/model/VolumeBindsTest.java | 5 +- .../api/model/VolumeFrom_SerializingTest.java | 29 +- .../dockerjava/api/model/VolumeTest.java | 8 +- .../client/AbstractDockerClientTest.java | 262 +++--- .../dockerjava/client/DockerClientTest.java | 68 +- .../core/CompressArchiveUtilTest.java | 75 +- .../core/DockerClientConfigTest.java | 12 +- .../dockerjava/core/DockerClientImplTest.java | 3 +- .../dockerjava/core/GoLangFileMatchTest.java | 10 +- .../core/TestDockerCmdExecFactory.java | 484 +++++----- .../core/command/AuthCmdImplTest.java | 58 +- .../core/command/BuildImageCmdImplTest.java | 326 ++++--- .../core/command/CommitCmdImplTest.java | 109 ++- .../command/ContainerDiffCmdImplTest.java | 97 +- .../CopyFileFromContainerCmdImplTest.java | 6 +- .../command/CreateContainerCmdImplTest.java | 853 ++++++++---------- .../core/command/DockerfileFixture.java | 41 +- .../core/command/EventStreamReaderITest.java | 38 +- .../core/command/EventsCmdImplTest.java | 283 +++--- .../core/command/ExecCreateCmdImplTest.java | 6 +- .../core/command/ExecStartCmdImplTest.java | 7 +- .../core/command/FrameReaderITest.java | 145 ++- .../core/command/FrameReaderTest.java | 3 + .../core/command/InfoCmdImplTest.java | 74 +- .../core/command/InspectExecCmdImplTest.java | 23 +- .../command/KillContainerCmdImplTest.java | 105 +-- .../command/ListContainersCmdImplTest.java | 98 +- .../core/command/ListImagesCmdImplTest.java | 145 ++- .../core/command/LogContainerCmdImplTest.java | 137 ++- .../core/command/PullImageCmdImplTest.java | 136 ++- .../core/command/PushImageCmdImplTest.java | 74 +- .../command/RemoveContainerCmdImplTest.java | 98 +- .../core/command/RemoveImageCmdImplTest.java | 88 +- .../command/RestartContainerCmdImplTest.java | 116 ++- .../core/command/SaveImageCmdImplTest.java | 7 +- .../core/command/SearchImagesCmdImplTest.java | 63 +- .../core/command/StatsCmdImplTest.java | 158 ++-- .../command/StopContainerCmdImplTest.java | 101 +-- .../core/command/TagImageCmdImplTest.java | 71 +- .../core/command/VersionCmdImplTest.java | 61 +- .../command/WaitContainerCmdImplTest.java | 102 +-- .../core/dockerfile/DockerfileTest.java | 49 +- .../test/serdes/AbstractJSONResourceRef.java | 4 +- .../test/serdes/JSONResourceRef.java | 7 +- .../test/serdes/JSONTestHelper.java | 94 +- 256 files changed, 9586 insertions(+), 10050 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/src/main/java/com/github/dockerjava/api/BadRequestException.java index 1e04bcb3b..2696c5bc1 100644 --- a/src/main/java/com/github/dockerjava/api/BadRequestException.java +++ b/src/main/java/com/github/dockerjava/api/BadRequestException.java @@ -1,22 +1,21 @@ package com.github.dockerjava.api; - /** * */ public class BadRequestException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public BadRequestException(String message, Throwable cause) { + public BadRequestException(String message, Throwable cause) { super(message, 400, cause); } - - public BadRequestException(String message) { + + public BadRequestException(String message) { this(message, null); } - - public BadRequestException(Throwable cause) { + + public BadRequestException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/src/main/java/com/github/dockerjava/api/ConflictException.java index bed2a375e..6a84fdee3 100644 --- a/src/main/java/com/github/dockerjava/api/ConflictException.java +++ b/src/main/java/com/github/dockerjava/api/ConflictException.java @@ -1,22 +1,21 @@ package com.github.dockerjava.api; - /** * */ public class ConflictException extends DockerException { - private static final long serialVersionUID = -290093024775500239L; + private static final long serialVersionUID = -290093024775500239L; - public ConflictException(String message, Throwable cause) { + public ConflictException(String message, Throwable cause) { super(message, 409, cause); } - - public ConflictException(String message) { + + public ConflictException(String message) { this(message, null); } - - public ConflictException(Throwable cause) { + + public ConflictException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 723c1bad3..2e0543ae9 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -9,114 +9,108 @@ // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { - public AuthConfig authConfig() throws DockerException; + public AuthConfig authConfig() throws DockerException; - /** - * Authenticate with the server, useful for checking authentication. - */ - public AuthCmd authCmd(); + /** + * Authenticate with the server, useful for checking authentication. + */ + public AuthCmd authCmd(); - public InfoCmd infoCmd(); + public InfoCmd infoCmd(); - public PingCmd pingCmd(); + public PingCmd pingCmd(); - public VersionCmd versionCmd(); + public VersionCmd versionCmd(); - /** - * * IMAGE API * - */ + /** + * * IMAGE API * + */ - public PullImageCmd pullImageCmd(String repository); + public PullImageCmd pullImageCmd(String repository); - public PushImageCmd pushImageCmd(String name); + public PushImageCmd pushImageCmd(String name); - public PushImageCmd pushImageCmd(Identifier identifier); + public PushImageCmd pushImageCmd(Identifier identifier); - public CreateImageCmd createImageCmd(String repository, - InputStream imageStream); + public CreateImageCmd createImageCmd(String repository, InputStream imageStream); - public SearchImagesCmd searchImagesCmd(String term); + public SearchImagesCmd searchImagesCmd(String term); - public RemoveImageCmd removeImageCmd(String imageId); + public RemoveImageCmd removeImageCmd(String imageId); - public ListImagesCmd listImagesCmd(); + public ListImagesCmd listImagesCmd(); + + public InspectImageCmd inspectImageCmd(String imageId); - public InspectImageCmd inspectImageCmd(String imageId); - public SaveImageCmd saveImageCmd(String name); - /** - * * CONTAINER API * - */ - - public ListContainersCmd listContainersCmd(); - - public CreateContainerCmd createContainerCmd(String image); - - /** - * Creates a new {@link StartContainerCmd} for the container with the - * given ID. - * The command can then be further customized by using builder - * methods on it like {@link StartContainerCmd#withDns(String...)}. - *

- * If you customize the command, any existing configuration of the - * target container will get reset to its default before applying the - * new configuration. To preserve the existing configuration, use an - * unconfigured {@link StartContainerCmd}. - *

- * This command corresponds to the /containers/{id}/start - * endpoint of the Docker Remote API. - */ - public StartContainerCmd startContainerCmd(String containerId); + /** + * * CONTAINER API * + */ + + public ListContainersCmd listContainersCmd(); + + public CreateContainerCmd createContainerCmd(String image); + + /** + * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further + * customized by using builder methods on it like {@link StartContainerCmd#withDns(String...)}. + *

+ * If you customize the command, any existing configuration of the target container will get reset to its default + * before applying the new configuration. To preserve the existing configuration, use an unconfigured + * {@link StartContainerCmd}. + *

+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API. + */ + public StartContainerCmd startContainerCmd(String containerId); public ExecCreateCmd execCreateCmd(String containerId); - public InspectContainerCmd inspectContainerCmd(String containerId); + public InspectContainerCmd inspectContainerCmd(String containerId); - public RemoveContainerCmd removeContainerCmd(String containerId); + public RemoveContainerCmd removeContainerCmd(String containerId); - public WaitContainerCmd waitContainerCmd(String containerId); + public WaitContainerCmd waitContainerCmd(String containerId); - public AttachContainerCmd attachContainerCmd(String containerId); + public AttachContainerCmd attachContainerCmd(String containerId); public ExecStartCmd execStartCmd(String containerId); public InspectExecCmd inspectExecCmd(String execId); - public LogContainerCmd logContainerCmd(String containerId); + public LogContainerCmd logContainerCmd(String containerId); - public CopyFileFromContainerCmd copyFileFromContainerCmd( - String containerId, String resource); + public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); - public ContainerDiffCmd containerDiffCmd(String containerId); + public ContainerDiffCmd containerDiffCmd(String containerId); - public StopContainerCmd stopContainerCmd(String containerId); + public StopContainerCmd stopContainerCmd(String containerId); - public KillContainerCmd killContainerCmd(String containerId); + public KillContainerCmd killContainerCmd(String containerId); - public RestartContainerCmd restartContainerCmd(String containerId); + public RestartContainerCmd restartContainerCmd(String containerId); - public CommitCmd commitCmd(String containerId); + public CommitCmd commitCmd(String containerId); public BuildImageCmd buildImageCmd(); - public BuildImageCmd buildImageCmd(File dockerFileOrFolder); + public BuildImageCmd buildImageCmd(File dockerFileOrFolder); + + public BuildImageCmd buildImageCmd(InputStream tarInputStream); + + public TopContainerCmd topContainerCmd(String containerId); - public BuildImageCmd buildImageCmd(InputStream tarInputStream); + public TagImageCmd tagImageCmd(String imageId, String repository, String tag); - public TopContainerCmd topContainerCmd(String containerId); + public PauseContainerCmd pauseContainerCmd(String containerId); - public TagImageCmd tagImageCmd(String imageId, String repository, String tag); - - public PauseContainerCmd pauseContainerCmd(String containerId); - - public UnpauseContainerCmd unpauseContainerCmd(String containerId); + public UnpauseContainerCmd unpauseContainerCmd(String containerId); - public EventsCmd eventsCmd(EventCallback eventCallback); + public EventsCmd eventsCmd(EventCallback eventCallback); - public StatsCmd statsCmd(StatsCallback statsCallback); + public StatsCmd statsCmd(StatsCallback statsCallback); - @Override - public void close() throws IOException; + @Override + public void close() throws IOException; } diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/src/main/java/com/github/dockerjava/api/DockerClientException.java index 85efc3498..538698bb6 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClientException.java +++ b/src/main/java/com/github/dockerjava/api/DockerClientException.java @@ -6,8 +6,8 @@ */ public class DockerClientException extends RuntimeException { -private static final long serialVersionUID = 7667768099261650608L; - + private static final long serialVersionUID = 7667768099261650608L; + public DockerClientException(String message) { super(message); } diff --git a/src/main/java/com/github/dockerjava/api/DockerException.java b/src/main/java/com/github/dockerjava/api/DockerException.java index 673bf2ccc..48bb2dd90 100644 --- a/src/main/java/com/github/dockerjava/api/DockerException.java +++ b/src/main/java/com/github/dockerjava/api/DockerException.java @@ -1,8 +1,5 @@ package com.github.dockerjava.api; - - - /** * * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -11,9 +8,9 @@ public class DockerException extends RuntimeException { -private static final long serialVersionUID = 7667768099261650608L; - - private int httpStatus = 0; + private static final long serialVersionUID = 7667768099261650608L; + + private int httpStatus = 0; public DockerException(String message, int httpStatus) { super(message); @@ -23,8 +20,8 @@ public DockerException(String message, int httpStatus) { public DockerException(String message, int httpStatus, Throwable cause) { super(message, cause); } - + public int getHttpStatus() { - return httpStatus; - } + return httpStatus; + } } diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java index 366484e53..cda5602ed 100644 --- a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java +++ b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java @@ -5,17 +5,17 @@ */ public class InternalServerErrorException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public InternalServerErrorException(String message, Throwable cause) { + public InternalServerErrorException(String message, Throwable cause) { super(message, 500, cause); } - - public InternalServerErrorException(String message) { + + public InternalServerErrorException(String message) { this(message, null); } - - public InternalServerErrorException(Throwable cause) { + + public InternalServerErrorException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java index affa4ce9b..78345a68b 100644 --- a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java +++ b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java @@ -5,17 +5,17 @@ */ public class NotAcceptableException extends DockerException { - private static final long serialVersionUID = -1771212181727204375L; + private static final long serialVersionUID = -1771212181727204375L; - public NotAcceptableException(String message, Throwable cause) { + public NotAcceptableException(String message, Throwable cause) { super(message, 406, cause); } - - public NotAcceptableException(String message) { + + public NotAcceptableException(String message) { this(message, null); } - - public NotAcceptableException(Throwable cause) { + + public NotAcceptableException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/src/main/java/com/github/dockerjava/api/NotFoundException.java index 10f328cdc..67e6f18bf 100644 --- a/src/main/java/com/github/dockerjava/api/NotFoundException.java +++ b/src/main/java/com/github/dockerjava/api/NotFoundException.java @@ -7,17 +7,17 @@ */ public class NotFoundException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public NotFoundException(String message, Throwable cause) { + public NotFoundException(String message, Throwable cause) { super(message, 404, cause); } - - public NotFoundException(String message) { + + public NotFoundException(String message) { this(message, null); } - - public NotFoundException(Throwable cause) { + + public NotFoundException(Throwable cause) { this(cause.getMessage(), cause); } } diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/src/main/java/com/github/dockerjava/api/NotModifiedException.java index d521bae2d..fa0aa459f 100644 --- a/src/main/java/com/github/dockerjava/api/NotModifiedException.java +++ b/src/main/java/com/github/dockerjava/api/NotModifiedException.java @@ -5,17 +5,17 @@ */ public class NotModifiedException extends DockerException { - private static final long serialVersionUID = -290093024775500239L; + private static final long serialVersionUID = -290093024775500239L; - public NotModifiedException(String message, Throwable cause) { + public NotModifiedException(String message, Throwable cause) { super(message, 304, cause); } - - public NotModifiedException(String message) { + + public NotModifiedException(String message) { this(message, null); } - - public NotModifiedException(Throwable cause) { + + public NotModifiedException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java index 5d48d2163..b097d6523 100644 --- a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java +++ b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java @@ -5,17 +5,17 @@ */ public class UnauthorizedException extends DockerException { - private static final long serialVersionUID = 8257731964780578278L; + private static final long serialVersionUID = 8257731964780578278L; - public UnauthorizedException(String message, Throwable cause) { + public UnauthorizedException(String message, Throwable cause) { super(message, 401, cause); } - - public UnauthorizedException(String message) { + + public UnauthorizedException(String message) { this(message, null); } - - public UnauthorizedException(Throwable cause) { + + public UnauthorizedException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 0fb72d452..c45a73247 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -18,64 +18,60 @@ * @param stderr * - true or false, includes stderr log. Defaults to false. * @param timestamps - * - true or false, if true, print timestamps for every log line. - * Defaults to false. + * - true or false, if true, print timestamps for every log line. Defaults to false. */ public interface AttachContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public boolean hasLogsEnabled(); + public boolean hasLogsEnabled(); - public boolean hasFollowStreamEnabled(); + public boolean hasFollowStreamEnabled(); - public boolean hasTimestampsEnabled(); + public boolean hasTimestampsEnabled(); - public boolean hasStdoutEnabled(); + public boolean hasStdoutEnabled(); - public boolean hasStderrEnabled(); + public boolean hasStderrEnabled(); - public AttachContainerCmd withContainerId(String containerId); + public AttachContainerCmd withContainerId(String containerId); - /** - * See {@link #withFollowStream(boolean)} - */ - public AttachContainerCmd withFollowStream(); + /** + * See {@link #withFollowStream(boolean)} + */ + public AttachContainerCmd withFollowStream(); - /** - * Following the stream means the resulting {@link InputStream} returned by - * {@link #exec()} reads infinitely. So a {@link InputStream#read()} MAY - * BLOCK FOREVER as long as no data is streamed from the docker host to - * {@link DockerClient}! - */ - public AttachContainerCmd withFollowStream(boolean followStream); + /** + * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a + * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to + * {@link DockerClient}! + */ + public AttachContainerCmd withFollowStream(boolean followStream); - public AttachContainerCmd withTimestamps(boolean timestamps); + public AttachContainerCmd withTimestamps(boolean timestamps); - public AttachContainerCmd withStdOut(); + public AttachContainerCmd withStdOut(); - public AttachContainerCmd withStdOut(boolean stdout); + public AttachContainerCmd withStdOut(boolean stdout); - public AttachContainerCmd withStdErr(); + public AttachContainerCmd withStdErr(); - public AttachContainerCmd withStdErr(boolean stderr); + public AttachContainerCmd withStdErr(boolean stderr); - public AttachContainerCmd withLogs(boolean logs); + public AttachContainerCmd withLogs(boolean logs); - public AttachContainerCmd withLogs(); + public AttachContainerCmd withLogs(); - /** - * Its the responsibility of the caller to consume and/or close the - * {@link InputStream} to prevent connection leaks. - * - * @throws NotFoundException - * No such container - */ - @Override - public InputStream exec() throws NotFoundException; + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException; - public static interface Exec extends - DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index 3c5922583..c84fcb3b9 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -10,20 +10,21 @@ * */ public interface AuthCmd extends DockerCmd { - - public AuthConfig getAuthConfig(); - public AuthCmd withAuthConfig(AuthConfig authConfig); + public AuthConfig getAuthConfig(); + + public AuthCmd withAuthConfig(AuthConfig authConfig); /** * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: - * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." - * @throws UnauthorizedException If you're not authorised (e.g. bad password). + * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." + * @throws UnauthorizedException + * If you're not authorised (e.g. bad password). */ - @Override - public AuthResponse exec() throws UnauthorizedException; - - public static interface Exec extends DockerCmdExec { - } + @Override + public AuthResponse exec() throws UnauthorizedException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index 925946db4..5dd1cc177 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -14,58 +14,58 @@ * TODO: http://docs.docker.com/reference/builder/#dockerignore * */ -public interface BuildImageCmd extends DockerCmd{ +public interface BuildImageCmd extends DockerCmd { - public BuildImageCmd withTag(String tag); + public BuildImageCmd withTag(String tag); - public InputStream getTarInputStream(); + public InputStream getTarInputStream(); - public String getTag(); + public String getTag(); - public boolean hasNoCacheEnabled(); + public boolean hasNoCacheEnabled(); - public boolean hasRemoveEnabled(); - - public boolean isQuiet(); - - public boolean hasPullEnabled(); + public boolean hasRemoveEnabled(); + + public boolean isQuiet(); + + public boolean hasPullEnabled(); public String getPathToDockerfile(); - public AuthConfigurations getBuildAuthConfigs(); + public AuthConfigurations getBuildAuthConfigs(); public BuildImageCmd withBaseDirectory(File baseDirectory); public BuildImageCmd withDockerfile(File dockerfile); - - public BuildImageCmd withTarInputStream(InputStream tarInputStream); - - public BuildImageCmd withNoCache(); - - public BuildImageCmd withNoCache(boolean noCache); - - public BuildImageCmd withRemove(); - - public BuildImageCmd withRemove(boolean rm); - - public BuildImageCmd withQuiet(); - - public BuildImageCmd withQuiet(boolean quiet); - - public BuildImageCmd withPull(); - - public BuildImageCmd withPull(boolean pull); - - public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); - - public static interface Exec extends DockerCmdExec { - } - - /** - * @see {@link com.github.dockerjava.core.command.EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; - } + + public BuildImageCmd withTarInputStream(InputStream tarInputStream); + + public BuildImageCmd withNoCache(); + + public BuildImageCmd withNoCache(boolean noCache); + + public BuildImageCmd withRemove(); + + public BuildImageCmd withRemove(boolean rm); + + public BuildImageCmd withQuiet(); + + public BuildImageCmd withQuiet(boolean quiet); + + public BuildImageCmd withPull(); + + public BuildImageCmd withPull(boolean pull); + + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); + + public static interface Exec extends DockerCmdExec { + } + + /** + * @see {@link com.github.dockerjava.core.command.EventStreamReader} + */ + public static abstract class Response extends InputStream { + public abstract Iterable getItems() throws IOException; + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index ac0a7bb5e..2c24a0f42 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -5,111 +5,112 @@ import com.github.dockerjava.api.model.Volumes; /** -* -* Create a new image from a container's changes. Returns the new image ID. -* -*/ -public interface CommitCmd extends DockerCmd{ + * + * Create a new image from a container's changes. Returns the new image ID. + * + */ +public interface CommitCmd extends DockerCmd { - public String getContainerId(); - - public CommitCmd withContainerId(String containerId); + public String getContainerId(); - public String getRepository(); + public CommitCmd withContainerId(String containerId); - public String getTag(); + public String getRepository(); - public String getMessage(); + public String getTag(); - public String getAuthor(); + public String getMessage(); - public boolean hasPauseEnabled(); + public String getAuthor(); - public CommitCmd withAttachStderr(boolean attachStderr); + public boolean hasPauseEnabled(); - public CommitCmd withAttachStderr(); + public CommitCmd withAttachStderr(boolean attachStderr); - public CommitCmd withAttachStdin(boolean attachStdin); + public CommitCmd withAttachStderr(); - public CommitCmd withAttachStdin(); + public CommitCmd withAttachStdin(boolean attachStdin); - public CommitCmd withAttachStdout(boolean attachStdout); + public CommitCmd withAttachStdin(); - public CommitCmd withAttachStdout(); + public CommitCmd withAttachStdout(boolean attachStdout); - public CommitCmd withCmd(String... cmd); + public CommitCmd withAttachStdout(); - public CommitCmd withDisableNetwork(boolean disableNetwork); + public CommitCmd withCmd(String... cmd); - public CommitCmd withAuthor(String author); + public CommitCmd withDisableNetwork(boolean disableNetwork); - public CommitCmd withMessage(String message); + public CommitCmd withAuthor(String author); - public CommitCmd withTag(String tag); + public CommitCmd withMessage(String message); - public CommitCmd withRepository(String repository); + public CommitCmd withTag(String tag); - public CommitCmd withPause(boolean pause); + public CommitCmd withRepository(String repository); - public String[] getEnv(); + public CommitCmd withPause(boolean pause); - public CommitCmd withEnv(String... env); + public String[] getEnv(); - public ExposedPorts getExposedPorts(); + public CommitCmd withEnv(String... env); - public CommitCmd withExposedPorts(ExposedPorts exposedPorts); + public ExposedPorts getExposedPorts(); - public String getHostname(); + public CommitCmd withExposedPorts(ExposedPorts exposedPorts); - public CommitCmd withHostname(String hostname); + public String getHostname(); - public Integer getMemory(); + public CommitCmd withHostname(String hostname); - public CommitCmd withMemory(Integer memory); + public Integer getMemory(); - public Integer getMemorySwap(); + public CommitCmd withMemory(Integer memory); - public CommitCmd withMemorySwap(Integer memorySwap); + public Integer getMemorySwap(); - public boolean isOpenStdin(); + public CommitCmd withMemorySwap(Integer memorySwap); - public CommitCmd withOpenStdin(boolean openStdin); + public boolean isOpenStdin(); - public String[] getPortSpecs(); + public CommitCmd withOpenStdin(boolean openStdin); - public CommitCmd withPortSpecs(String... portSpecs); + public String[] getPortSpecs(); - public boolean isStdinOnce(); + public CommitCmd withPortSpecs(String... portSpecs); - public CommitCmd withStdinOnce(boolean stdinOnce); + public boolean isStdinOnce(); - public CommitCmd withStdinOnce(); + public CommitCmd withStdinOnce(boolean stdinOnce); - public boolean isTty(); + public CommitCmd withStdinOnce(); - public CommitCmd withTty(boolean tty); + public boolean isTty(); - public CommitCmd withTty(); + public CommitCmd withTty(boolean tty); - public String getUser(); + public CommitCmd withTty(); - public CommitCmd withUser(String user); + public String getUser(); - public Volumes getVolumes(); + public CommitCmd withUser(String user); - public CommitCmd withVolumes(Volumes volumes); + public Volumes getVolumes(); - public String getWorkingDir(); + public CommitCmd withVolumes(Volumes volumes); - public CommitCmd withWorkingDir(String workingDir); + public String getWorkingDir(); - /** - * @throws NotFoundException No such container - */ - @Override - public String exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + public CommitCmd withWorkingDir(String workingDir); + + /** + * @throws NotFoundException + * No such container + */ + @Override + public String exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 21d99045d..ed7028460 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -9,22 +9,25 @@ public interface ContainerDiffCmd extends DockerCmd> { - public String getContainerId(); - - public ContainerDiffCmd withContainerId(String containerId); - - @Override - public String toString(); - - /** - * @throws NotFoundException No such container - * @throws InternalServerErrorException server error - * @throws DockerException unexpected http status code - */ - @Override - public List exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec> { - } + public String getContainerId(); + + public ContainerDiffCmd withContainerId(String containerId); + + @Override + public String toString(); + + /** + * @throws NotFoundException + * No such container + * @throws InternalServerErrorException + * server error + * @throws DockerException + * unexpected http status code + */ + @Override + public List exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec> { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index 5e85d9984..eb67dfbd9 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -6,28 +6,28 @@ public interface CopyFileFromContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getResource(); + public String getResource(); - public CopyFileFromContainerCmd withContainerId(String containerId); + public CopyFileFromContainerCmd withContainerId(String containerId); - public CopyFileFromContainerCmd withResource(String resource); + public CopyFileFromContainerCmd withResource(String resource); - public String getHostPath(); + public String getHostPath(); - public CopyFileFromContainerCmd withHostPath(String hostPath); + public CopyFileFromContainerCmd withHostPath(String hostPath); - /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws NotFoundException No such container - */ - @Override - public InputStream exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java index d26824715..a25535d5b 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -4,31 +4,33 @@ public interface CreateImageCmd extends DockerCmd { - public String getRepository(); - - // TODO remove method - public String getTag(); - - public InputStream getImageStream(); - - /** - * @param repository the repository to import to - */ - public CreateImageCmd withRepository(String repository); - - /** - * @param imageStream the InputStream of the tar file - */ - public CreateImageCmd withImageStream(InputStream imageStream); - - /** - * @param tag any tag for this image - * @deprecated use repo:tag format for repository - */ - public CreateImageCmd withTag(String tag); - - public static interface Exec extends DockerCmdExec { - } - + public String getRepository(); + + // TODO remove method + public String getTag(); + + public InputStream getImageStream(); + + /** + * @param repository + * the repository to import to + */ + public CreateImageCmd withRepository(String repository); + + /** + * @param imageStream + * the InputStream of the tar file + */ + public CreateImageCmd withImageStream(InputStream imageStream); + + /** + * @param tag + * any tag for this image + * @deprecated use repo:tag format for repository + */ + public CreateImageCmd withTag(String tag); + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java index 89c31666f..79236b890 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -4,6 +4,6 @@ public interface DockerCmd extends Closeable { - public RES_T exec(); + public RES_T exec(); } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java index 8cf13e7bb..635395ed0 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java @@ -1,7 +1,7 @@ package com.github.dockerjava.api.command; public interface DockerCmdExec, RES_T> { - - public RES_T exec(CMD_T command); + + public RES_T exec(CMD_T command); } diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 294d50994..fc750a743 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -7,82 +7,81 @@ public interface DockerCmdExecFactory extends Closeable { - public void init(DockerClientConfig dockerClientConfig); + public void init(DockerClientConfig dockerClientConfig); - public AuthCmd.Exec createAuthCmdExec(); + public AuthCmd.Exec createAuthCmdExec(); - public InfoCmd.Exec createInfoCmdExec(); + public InfoCmd.Exec createInfoCmdExec(); - public PingCmd.Exec createPingCmdExec(); + public PingCmd.Exec createPingCmdExec(); public ExecCreateCmd.Exec createExecCmdExec(); - public VersionCmd.Exec createVersionCmdExec(); + public VersionCmd.Exec createVersionCmdExec(); - public PullImageCmd.Exec createPullImageCmdExec(); + public PullImageCmd.Exec createPullImageCmdExec(); + + public PushImageCmd.Exec createPushImageCmdExec(); - public PushImageCmd.Exec createPushImageCmdExec(); - public SaveImageCmd.Exec createSaveImageCmdExec(); - public CreateImageCmd.Exec createCreateImageCmdExec(); + public CreateImageCmd.Exec createCreateImageCmdExec(); - public SearchImagesCmd.Exec createSearchImagesCmdExec(); + public SearchImagesCmd.Exec createSearchImagesCmdExec(); - public RemoveImageCmd.Exec createRemoveImageCmdExec(); + public RemoveImageCmd.Exec createRemoveImageCmdExec(); - public ListImagesCmd.Exec createListImagesCmdExec(); + public ListImagesCmd.Exec createListImagesCmdExec(); - public InspectImageCmd.Exec createInspectImageCmdExec(); + public InspectImageCmd.Exec createInspectImageCmdExec(); - public ListContainersCmd.Exec createListContainersCmdExec(); + public ListContainersCmd.Exec createListContainersCmdExec(); - public CreateContainerCmd.Exec createCreateContainerCmdExec(); + public CreateContainerCmd.Exec createCreateContainerCmdExec(); - public StartContainerCmd.Exec createStartContainerCmdExec(); + public StartContainerCmd.Exec createStartContainerCmdExec(); - public InspectContainerCmd.Exec createInspectContainerCmdExec(); + public InspectContainerCmd.Exec createInspectContainerCmdExec(); - public RemoveContainerCmd.Exec createRemoveContainerCmdExec(); + public RemoveContainerCmd.Exec createRemoveContainerCmdExec(); - public WaitContainerCmd.Exec createWaitContainerCmdExec(); + public WaitContainerCmd.Exec createWaitContainerCmdExec(); - public AttachContainerCmd.Exec createAttachContainerCmdExec(); + public AttachContainerCmd.Exec createAttachContainerCmdExec(); public ExecStartCmd.Exec createExecStartCmdExec(); public InspectExecCmd.Exec createInspectExecCmdExec(); - public LogContainerCmd.Exec createLogContainerCmdExec(); + public LogContainerCmd.Exec createLogContainerCmdExec(); - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); - public StopContainerCmd.Exec createStopContainerCmdExec(); + public StopContainerCmd.Exec createStopContainerCmdExec(); - public ContainerDiffCmd.Exec createContainerDiffCmdExec(); + public ContainerDiffCmd.Exec createContainerDiffCmdExec(); - public KillContainerCmd.Exec createKillContainerCmdExec(); + public KillContainerCmd.Exec createKillContainerCmdExec(); - public RestartContainerCmd.Exec createRestartContainerCmdExec(); + public RestartContainerCmd.Exec createRestartContainerCmdExec(); - public CommitCmd.Exec createCommitCmdExec(); + public CommitCmd.Exec createCommitCmdExec(); - public BuildImageCmd.Exec createBuildImageCmdExec(); + public BuildImageCmd.Exec createBuildImageCmdExec(); - public TopContainerCmd.Exec createTopContainerCmdExec(); + public TopContainerCmd.Exec createTopContainerCmdExec(); - public TagImageCmd.Exec createTagImageCmdExec(); + public TagImageCmd.Exec createTagImageCmdExec(); - public PauseContainerCmd.Exec createPauseContainerCmdExec(); + public PauseContainerCmd.Exec createPauseContainerCmdExec(); - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); - public EventsCmd.Exec createEventsCmdExec(); - - public StatsCmd.Exec createStatsCmdExec(); + public EventsCmd.Exec createEventsCmdExec(); + public StatsCmd.Exec createStatsCmdExec(); - @Override - public void close() throws IOException; + @Override + public void close() throws IOException; } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/EventCallback.java b/src/main/java/com/github/dockerjava/api/command/EventCallback.java index 18b8669ea..867f186cd 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventCallback.java +++ b/src/main/java/com/github/dockerjava/api/command/EventCallback.java @@ -7,7 +7,10 @@ */ public interface EventCallback { public void onEvent(Event event); + public void onException(Throwable throwable); + public void onCompletion(int numEvents); + public boolean isReceiving(); } diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index cfdb23a64..5a7c2e275 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -2,12 +2,13 @@ import java.util.concurrent.ExecutorService; - /** * Get events * - * @param since - Show all events created since timestamp - * @param until - Stream events until this timestamp + * @param since + * - Show all events created since timestamp + * @param until + * - Stream events until this timestamp */ public interface EventsCmd extends DockerCmd { public EventsCmd withSince(String since); @@ -19,7 +20,7 @@ public interface EventsCmd extends DockerCmd { public String getUntil(); public EventCallback getEventCallback(); - + public EventsCmd withEventCallback(EventCallback eventCallback); public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java index c1f32e293..ffeef0153 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -3,33 +3,33 @@ public interface ExecCreateCmd extends DockerCmd { public String getContainerId(); - + public ExecCreateCmd withContainerId(String containerId); public ExecCreateCmd withCmd(String... cmd); public ExecCreateCmd withAttachStdin(boolean attachStdin); - + public ExecCreateCmd withAttachStdin(); - + public boolean hasAttachStdinEnabled(); public ExecCreateCmd withAttachStdout(boolean attachStdout); - + public ExecCreateCmd withAttachStdout(); - + public boolean hasAttachStdoutEnabled(); public ExecCreateCmd withAttachStderr(boolean attachStderr); - + public ExecCreateCmd withAttachStderr(); - + public boolean hasAttachStderrEnabled(); public ExecCreateCmd withTty(boolean tty); - + public ExecCreateCmd withTty(); - + public boolean hasTtyEnabled(); public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index 7ccb90cff..339e2c9a0 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -6,33 +6,31 @@ public interface ExecStartCmd extends DockerCmd { - public String getExecId(); + public String getExecId(); - public ExecStartCmd withExecId(String execId); + public ExecStartCmd withExecId(String execId); - public boolean hasDetachEnabled(); + public boolean hasDetachEnabled(); - public ExecStartCmd withDetach(boolean detach); - - public ExecStartCmd withDetach(); + public ExecStartCmd withDetach(boolean detach); - public boolean hasTtyEnabled(); + public ExecStartCmd withDetach(); - public ExecStartCmd withTty(boolean tty); - - public ExecStartCmd withTty(); + public boolean hasTtyEnabled(); - /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws com.github.dockerjava.api.NotFoundException - * No such exec instance - */ - @Override - public InputStream exec() throws NotFoundException; + public ExecStartCmd withTty(boolean tty); - public static interface Exec extends - DockerCmdExec { - } + public ExecStartCmd withTty(); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws com.github.dockerjava.api.NotFoundException + * No such exec instance + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java index d340fe268..10e3597e6 100644 --- a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java @@ -4,7 +4,7 @@ public interface InfoCmd extends DockerCmd { - public static interface Exec extends DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index f67fe4aea..e0d087847 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -4,17 +4,18 @@ public interface InspectContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public InspectContainerCmd withContainerId(String containerId); + public InspectContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public InspectContainerResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public InspectContainerResponse exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index f95656899..dc0507e50 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.command; - import java.util.List; import java.util.Map; @@ -19,58 +18,58 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class InspectContainerResponse { - @JsonProperty("Args") - private String[] args; + @JsonProperty("Args") + private String[] args; - @JsonProperty("Config") - private ContainerConfig config; + @JsonProperty("Config") + private ContainerConfig config; - @JsonProperty("Created") - private String created; + @JsonProperty("Created") + private String created; - @JsonProperty("Driver") - private String driver; + @JsonProperty("Driver") + private String driver; - @JsonProperty("ExecDriver") - private String execDriver; + @JsonProperty("ExecDriver") + private String execDriver; - @JsonProperty("HostConfig") - private HostConfig hostConfig; + @JsonProperty("HostConfig") + private HostConfig hostConfig; - @JsonProperty("HostnamePath") - private String hostnamePath; + @JsonProperty("HostnamePath") + private String hostnamePath; - @JsonProperty("HostsPath") - private String hostsPath; + @JsonProperty("HostsPath") + private String hostsPath; - @JsonProperty("Id") + @JsonProperty("Id") private String id; - @JsonProperty("Image") - private String imageId; + @JsonProperty("Image") + private String imageId; - @JsonProperty("MountLabel") - private String mountLabel; + @JsonProperty("MountLabel") + private String mountLabel; - @JsonProperty("Name") - private String name; + @JsonProperty("Name") + private String name; - @JsonProperty("NetworkSettings") - private NetworkSettings networkSettings; + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; - @JsonProperty("Path") + @JsonProperty("Path") private String path; - @JsonProperty("ProcessLabel") + @JsonProperty("ProcessLabel") private String processLabel; - @JsonProperty("ResolvConfPath") - private String resolvConfPath; + @JsonProperty("ResolvConfPath") + private String resolvConfPath; @JsonProperty("ExecIDs") private List execIds; - @JsonProperty("State") + @JsonProperty("State") private ContainerState state; @JsonProperty("Volumes") @@ -92,8 +91,8 @@ public String getPath() { } public String getProcessLabel() { - return processLabel; - } + return processLabel; + } public String[] getArgs() { return args; @@ -150,12 +149,12 @@ public HostConfig getHostConfig() { } public String getExecDriver() { - return execDriver; - } + return execDriver; + } public String getMountLabel() { - return mountLabel; - } + return mountLabel; + } public List getExecIds() { return execIds; @@ -169,37 +168,47 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class NetworkSettings { - @JsonProperty("IPAddress") private String ipAddress; - @JsonProperty("IPPrefixLen") private int ipPrefixLen; - @JsonProperty("Gateway") private String gateway; - @JsonProperty("Bridge") private String bridge; - @JsonProperty("PortMapping") private Map> portMapping; - @JsonProperty("Ports") private Ports ports; + @JsonProperty("IPAddress") + private String ipAddress; - public String getIpAddress() { - return ipAddress; - } + @JsonProperty("IPPrefixLen") + private int ipPrefixLen; + + @JsonProperty("Gateway") + private String gateway; + + @JsonProperty("Bridge") + private String bridge; - public int getIpPrefixLen() { - return ipPrefixLen; - } + @JsonProperty("PortMapping") + private Map> portMapping; - public String getGateway() { - return gateway; - } + @JsonProperty("Ports") + private Ports ports; - public String getBridge() { - return bridge; - } + public String getIpAddress() { + return ipAddress; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } - public Map> getPortMapping() { - return portMapping; - } + public String getGateway() { + return gateway; + } + + public String getBridge() { + return bridge; + } - public Ports getPorts() { - return ports; - } + public Map> getPortMapping() { + return portMapping; + } + public Ports getPorts() { + return ports; + } @Override public String toString() { @@ -210,36 +219,47 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { - @JsonProperty("Running") private boolean running; - @JsonProperty("Paused") private boolean paused; - @JsonProperty("Pid") private int pid; - @JsonProperty("ExitCode") private int exitCode; - @JsonProperty("StartedAt") private String startedAt; - @JsonProperty("FinishedAt") private String finishedAt; + @JsonProperty("Running") + private boolean running; + + @JsonProperty("Paused") + private boolean paused; + + @JsonProperty("Pid") + private int pid; + + @JsonProperty("ExitCode") + private int exitCode; + + @JsonProperty("StartedAt") + private String startedAt; + + @JsonProperty("FinishedAt") + private String finishedAt; public boolean isRunning() { - return running; - } + return running; + } - public boolean isPaused() { - return paused; - } + public boolean isPaused() { + return paused; + } - public int getPid() { - return pid; - } + public int getPid() { + return pid; + } - public int getExitCode() { - return exitCode; - } + public int getExitCode() { + return exitCode; + } - public String getStartedAt() { - return startedAt; - } + public String getStartedAt() { + return startedAt; + } - public String getFinishedAt() { - return finishedAt; - } + public String getFinishedAt() { + return finishedAt; + } @Override public String toString() { @@ -248,4 +268,3 @@ public String toString() { } } - diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java index 13882b8f7..82243614c 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -4,13 +4,16 @@ public interface InspectExecCmd extends DockerCmd { public String getExecId(); + public InspectExecCmd withExecId(String execId); /** - * @throws NotFoundException if no such exec has been found + * @throws NotFoundException + * if no such exec has been found */ @Override public InspectExecResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec {} + public static interface Exec extends DockerCmdExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index d064badba..ebf6550d2 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -5,19 +5,20 @@ /** * Inspect the details of an image. */ -public interface InspectImageCmd extends DockerCmd{ +public interface InspectImageCmd extends DockerCmd { - public String getImageId(); + public String getImageId(); - public InspectImageCmd withImageId(String imageId); + public InspectImageCmd withImageId(String imageId); - /** - * @throws NotFoundException No such image - */ - @Override - public InspectImageResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such image + */ + @Override + public InspectImageResponse 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/InspectImageResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java index b5b6432d7..63f5e49c6 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java @@ -14,28 +14,28 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class InspectImageResponse { - @JsonProperty("Architecture") + @JsonProperty("Architecture") private String arch; - @JsonProperty("Author") + @JsonProperty("Author") private String author; - @JsonProperty("Comment") + @JsonProperty("Comment") private String comment; - @JsonProperty("Config") + @JsonProperty("Config") private ContainerConfig config; - @JsonProperty("Container") + @JsonProperty("Container") private String container; - @JsonProperty("ContainerConfig") + @JsonProperty("ContainerConfig") private ContainerConfig containerConfig; - @JsonProperty("Created") - private String created; + @JsonProperty("Created") + private String created; - @JsonProperty("DockerVersion") + @JsonProperty("DockerVersion") private String dockerVersion; @JsonProperty("Id") diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index b9522cb8c..33fceba3b 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -7,21 +7,22 @@ */ public interface KillContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getSignal(); + public String getSignal(); - public KillContainerCmd withContainerId(String containerId); + public KillContainerCmd withContainerId(String containerId); - public KillContainerCmd withSignal(String signal); + public KillContainerCmd withSignal(String signal); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index ed457dab7..6d641f2e3 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -7,36 +7,41 @@ /** * List containers * - * @param showAll - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - true or false, Show the containers sizes. This is false by default. - * @param limit - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - Show only containers created since Id, include non-running ones. - * @param beforeId - Show only containers created before Id, include non-running ones. + * @param showAll + * - true or false, Show all containers. Only running containers are shown by default. + * @param showSize + * - true or false, Show the containers sizes. This is false by default. + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + * @param sinceId + * - Show only containers created since Id, include non-running ones. + * @param beforeId + * - Show only containers created before Id, include non-running ones. * */ -public interface ListContainersCmd extends DockerCmd>{ +public interface ListContainersCmd extends DockerCmd> { - public int getLimit(); + public int getLimit(); - public boolean hasShowSizeEnabled(); + public boolean hasShowSizeEnabled(); - public boolean hasShowAllEnabled(); + public boolean hasShowAllEnabled(); - public String getSinceId(); + public String getSinceId(); - public String getBeforeId(); + public String getBeforeId(); - public ListContainersCmd withShowAll(boolean showAll); + public ListContainersCmd withShowAll(boolean showAll); - public ListContainersCmd withShowSize(boolean showSize); + public ListContainersCmd withShowSize(boolean showSize); - public ListContainersCmd withLimit(int limit); + public ListContainersCmd withLimit(int limit); - public ListContainersCmd withSince(String since); + public ListContainersCmd withSince(String since); - public ListContainersCmd withBefore(String before); - - public static interface Exec extends DockerCmdExec> { - } + public ListContainersCmd withBefore(String before); + + public static interface Exec extends DockerCmdExec> { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index fad6d1da7..4c6a899cf 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -7,20 +7,22 @@ /** * List images * - * @param showAll - Show all images (by default filter out the intermediate images used to build) - * @param filters - a json encoded value of the filters (a map[string][]string) to process on the images list. + * @param showAll + * - Show all images (by default filter out the intermediate images used to build) + * @param filters + * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public interface ListImagesCmd extends DockerCmd> { - public String getFilters(); + public String getFilters(); - public boolean hasShowAllEnabled(); + public boolean hasShowAllEnabled(); - public ListImagesCmd withShowAll(boolean showAll); + public ListImagesCmd withShowAll(boolean showAll); - public ListImagesCmd withFilters(String filters); + public ListImagesCmd withFilters(String filters); - 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 c966ef953..ae93b7b21 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -15,74 +15,68 @@ * @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. * @param tail - * - `all` or ``, Output specified number of lines at the end - * of logs + * - `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. + * 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 String getContainerId(); + public String getContainerId(); - public int getTail(); + public int getTail(); - 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 LogContainerCmd withContainerId(String containerId); + public LogContainerCmd withContainerId(String containerId); - /** - * See {@link #withFollowStream(boolean)} - */ - public LogContainerCmd withFollowStream(); + /** + * 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); + /** + * 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(); - public LogContainerCmd withTimestamps(boolean timestamps); + public LogContainerCmd withTimestamps(boolean timestamps); - public LogContainerCmd withStdOut(); + public LogContainerCmd withStdOut(); - public LogContainerCmd withStdOut(boolean stdout); + public LogContainerCmd withStdOut(boolean stdout); - public LogContainerCmd withStdErr(); + public LogContainerCmd withStdErr(); - public LogContainerCmd withStdErr(boolean stderr); + public LogContainerCmd withStdErr(boolean stderr); - public LogContainerCmd withTailAll(); + public LogContainerCmd withTailAll(); - public LogContainerCmd withTail(int tail); + 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 - */ - @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/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index 652d433e4..a052c8bcf 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -5,22 +5,24 @@ /** * Pause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ -public interface PauseContainerCmd extends DockerCmd{ +public interface PauseContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public PauseContainerCmd withContainerId(String containerId); + public PauseContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/PingCmd.java b/src/main/java/com/github/dockerjava/api/command/PingCmd.java index 7d5af1e35..a5d88056a 100644 --- a/src/main/java/com/github/dockerjava/api/command/PingCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PingCmd.java @@ -1,13 +1,12 @@ package com.github.dockerjava.api.command; - /** * Ping the Docker server * */ public interface PingCmd 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/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index 4b5fc4c32..b3e6db6aa 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -6,34 +6,33 @@ import java.io.InputStream; /** -* -* Pull image from repository. -* -*/ -public interface PullImageCmd extends DockerCmd{ + * + * Pull image from repository. + * + */ +public interface PullImageCmd extends DockerCmd { - public String getRepository(); + public String getRepository(); - public String getTag(); + public String getTag(); - public String getRegistry(); + public String getRegistry(); public AuthConfig getAuthConfig(); public PullImageCmd withRepository(String repository); - public PullImageCmd withTag(String tag); + public PullImageCmd withTag(String tag); - public PullImageCmd withRegistry(String registry); + public PullImageCmd withRegistry(String registry); public PullImageCmd withAuthConfig(AuthConfig authConfig); public static interface Exec extends DockerCmdExec { - } - + } + /** - * 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. * * @see {@link EventStreamReader} */ 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 9ed38beb7..6b9a67ebe 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -11,41 +11,45 @@ /** * Push the latest image to the repository. * - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public interface PushImageCmd extends DockerCmd{ +public interface PushImageCmd extends DockerCmd { - public String getName(); + public String getName(); - public String getTag(); + public String getTag(); - /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. - */ - public PushImageCmd withName(String name); - /** - * @param tag The image's tag. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + public PushImageCmd withName(String name); + + /** + * @param tag + * The image's tag. Not null. */ public PushImageCmd withTag(String tag); public AuthConfig getAuthConfig(); - - public PushImageCmd withAuthConfig(AuthConfig authConfig); - - /** - * @throws NotFoundException No such image - */ - public Response exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } - - /** - * @see {@link EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; - } + + public PushImageCmd withAuthConfig(AuthConfig authConfig); + + /** + * @throws NotFoundException + * No such image + */ + public Response exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } + + /** + * @see {@link 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/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index b9c1f9437..9f917a327 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -5,32 +5,35 @@ /** * Remove a container. * - * @param removeVolumes - true or false, Remove the volumes associated to the container. Defaults to false - * @param force - true or false, Removes the container even if it was running. Defaults to false + * @param removeVolumes + * - true or false, Remove the volumes associated to the container. Defaults to false + * @param force + * - true or false, Removes the container even if it was running. Defaults to false */ public interface RemoveContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public boolean hasRemoveVolumesEnabled(); + public boolean hasRemoveVolumesEnabled(); - public boolean hasForceEnabled(); + public boolean hasForceEnabled(); - public RemoveContainerCmd withContainerId(String containerId); + public RemoveContainerCmd withContainerId(String containerId); - public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes); + public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes); - public RemoveContainerCmd withForce(); + public RemoveContainerCmd withForce(); - public RemoveContainerCmd withForce(boolean force); + public RemoveContainerCmd withForce(boolean force); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index be65ca41e..1ce1cd210 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -3,48 +3,49 @@ import com.github.dockerjava.api.NotFoundException; /** -* -* Remove an image, deleting any tags it might have. -* -*/ -public interface RemoveImageCmd extends DockerCmd{ - - public String getImageId(); - - public boolean hasForceEnabled(); - - public boolean hasNoPruneEnabled(); - - public RemoveImageCmd withImageId(String imageId); - - /** - * force delete of an image, even if it's tagged in multiple repositories - */ - public RemoveImageCmd withForce(); - - /** - * force parameter to force delete of an image, even if it's tagged in multiple repositories - */ - public RemoveImageCmd withForce(boolean force); - - /** - * prevent the deletion of parent images - */ - public RemoveImageCmd withNoPrune(); - - /** - * noprune parameter to prevent the deletion of parent images - * - */ - public RemoveImageCmd withNoPrune(boolean noPrune); - - /** - * @throws NotFoundException No such image - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + * + * Remove an image, deleting any tags it might have. + * + */ +public interface RemoveImageCmd extends DockerCmd { + + public String getImageId(); + + public boolean hasForceEnabled(); + + public boolean hasNoPruneEnabled(); + + public RemoveImageCmd withImageId(String imageId); + + /** + * force delete of an image, even if it's tagged in multiple repositories + */ + public RemoveImageCmd withForce(); + + /** + * force parameter to force delete of an image, even if it's tagged in multiple repositories + */ + public RemoveImageCmd withForce(boolean force); + + /** + * prevent the deletion of parent images + */ + public RemoveImageCmd withNoPrune(); + + /** + * noprune parameter to prevent the deletion of parent images + * + */ + public RemoveImageCmd withNoPrune(boolean noPrune); + + /** + * @throws NotFoundException + * No such image + */ + @Override + public Void 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/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 8da41d38a..aa07fffd1 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -5,26 +5,28 @@ /** * Restart a running container. * - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public interface RestartContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public int getTimeout(); + public int getTimeout(); - public RestartContainerCmd withContainerId(String containerId); + public RestartContainerCmd withContainerId(String containerId); - public RestartContainerCmd withtTimeout(int timeout); + public RestartContainerCmd withtTimeout(int timeout); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 48c5f3191..67425ab66 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -4,32 +4,33 @@ import java.io.InputStream; -public interface SaveImageCmd extends DockerCmd{ +public interface SaveImageCmd extends DockerCmd { public String getName(); public String getTag(); /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ public SaveImageCmd withName(String name); /** - * @param tag The image's tag. Not null. + * @param tag + * The image's tag. Not null. */ public SaveImageCmd withTag(String tag); /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws com.github.dockerjava.api.NotFoundException No such image + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws com.github.dockerjava.api.NotFoundException + * No such image */ public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { } - } diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java index c609e6e8e..9279272d3 100644 --- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -7,16 +7,17 @@ /** * Search images * - * @param term - search term + * @param term + * - search term * */ public interface SearchImagesCmd extends DockerCmd> { - public String getTerm(); + public String getTerm(); - public SearchImagesCmd withTerm(String term); - - public static interface Exec extends DockerCmdExec> { - } + public SearchImagesCmd withTerm(String term); + + public static interface Exec extends DockerCmdExec> { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCallback.java b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java index 610c0f831..af263f8ef 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCallback.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCallback.java @@ -7,7 +7,10 @@ */ 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 index a605d4267..02d8bcf90 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -2,18 +2,17 @@ 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/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index 19c248552..d5bf2e610 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -6,28 +6,32 @@ /** * Stop a running container. * - * @param containerId - Id of the container - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param containerId + * - Id of the container + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public interface StopContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public int getTimeout(); + public int getTimeout(); - public StopContainerCmd withContainerId(String containerId); + public StopContainerCmd withContainerId(String containerId); - public StopContainerCmd withTimeout(int timeout); + public StopContainerCmd withTimeout(int timeout); - /** - * @throws NotFoundException No such container - * @throws NotModifiedException Container already stopped - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already stopped + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index ace84996e..44fd588f1 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -1,35 +1,37 @@ package com.github.dockerjava.api.command; - /** * Tag an image into a repository * - * @param image The local image to tag (either a name or an id) - * @param repository The repository to tag in - * @param force (not documented) + * @param image + * The local image to tag (either a name or an id) + * @param repository + * The repository to tag in + * @param force + * (not documented) * */ public interface TagImageCmd extends DockerCmd { - public String getImageId(); + public String getImageId(); + + public String getRepository(); - public String getRepository(); + public String getTag(); - public String getTag(); + public boolean hasForceEnabled(); - public boolean hasForceEnabled(); + public TagImageCmd withImageId(String imageId); - public TagImageCmd withImageId(String imageId); + public TagImageCmd withRepository(String repository); - public TagImageCmd withRepository(String repository); + public TagImageCmd withTag(String tag); - public TagImageCmd withTag(String tag); + public TagImageCmd withForce(); - public TagImageCmd withForce(); + public TagImageCmd withForce(boolean force); - public TagImageCmd withForce(boolean force); - - 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/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index 63865c2a6..cc7e33aa3 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -7,21 +7,22 @@ */ public interface TopContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getPsArgs(); + public String getPsArgs(); - public TopContainerCmd withContainerId(String containerId); + public TopContainerCmd withContainerId(String containerId); - public TopContainerCmd withPsArgs(String psArgs); + public TopContainerCmd withPsArgs(String psArgs); - /** - * @throws NotFoundException No such container - */ - @Override - public TopContainerResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public TopContainerResponse 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/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index c92ffa4ce..8864167f3 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -12,32 +12,30 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class TopContainerResponse { - @JsonProperty("Titles") - private String[] titles; + @JsonProperty("Titles") + private String[] titles; - @JsonProperty("Processes") - private String[][] processes; + @JsonProperty("Processes") + private String[][] processes; - public String[] getTitles() { - return titles; - } + public String[] getTitles() { + return titles; + } - public String[][] getProcesses() { - return processes; - } + public String[][] getProcesses() { + return processes; + } - @Override + @Override public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("["); - for(String[] fields: processes) { - buffer.append("[" + Joiner.on("; ").skipNulls().join(fields) + "]"); - } - buffer.append("]"); - - return "TopContainerResponse{" + - "titles=" + Joiner.on("; ").skipNulls().join(titles) + - ", processes=" + buffer.toString() + - '}'; + StringBuffer buffer = new StringBuffer(); + buffer.append("["); + for (String[] fields : processes) { + buffer.append("[" + Joiner.on("; ").skipNulls().join(fields) + "]"); + } + buffer.append("]"); + + return "TopContainerResponse{" + "titles=" + Joiner.on("; ").skipNulls().join(titles) + ", processes=" + + buffer.toString() + '}'; } } diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 166bfa6a8..442191416 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -5,22 +5,24 @@ /** * Unpause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public interface UnpauseContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public UnpauseContainerCmd withContainerId(String containerId); + public UnpauseContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/VersionCmd.java b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java index 740a335e9..703524623 100644 --- a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java @@ -6,8 +6,8 @@ * Returns the Docker version info. */ public interface VersionCmd 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/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index e71831559..8841b08a3 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -9,17 +9,18 @@ */ public interface WaitContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public WaitContainerCmd withContainerId(String containerId); - - /** - * @throws NotFoundException container not found - */ - @Override - public Integer exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + public WaitContainerCmd withContainerId(String containerId); + + /** + * @throws NotFoundException + * container not found + */ + @Override + public Integer 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/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java index a893e7f38..e87494215 100644 --- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java +++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java @@ -1,28 +1,26 @@ package com.github.dockerjava.api.model; /** - * The access mode of a file system or file: read-write - * or read-only. + * The access mode of a file system or file: read-write or read-only. */ public enum AccessMode { - /** read-write */ - rw, - - /** read-only */ - ro; - - /** - * 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; - } + /** read-write */ + rw, + + /** read-only */ + ro; + + /** + * 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/AuthConfig.java b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java index 42c49bce0..c7ee0af7f 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -13,117 +13,113 @@ public class AuthConfig { public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/"; @JsonProperty - private String username; - - @JsonProperty - private String password; - - @JsonProperty - private String email; - - @JsonProperty("serveraddress") - private String serverAddress = DEFAULT_SERVER_ADDRESS; - - private String auth; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getServerAddress() { - return serverAddress; - } - - public void setServerAddress(String serverAddress) { - this.serverAddress = serverAddress; - } - - @JsonIgnore - public String getAuth() { - return auth; - } - - @JsonProperty("auth") - public void setAuth(String auth) { - this.auth = auth; - } - - @Override - public String toString() { - return "AuthConfig{" + - "username='" + username + '\'' + - ", password='" + password + '\'' + - ", email='" + email + '\'' + - ", serverAddress='" + serverAddress + '\'' + - '}'; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((auth == null) ? 0 : auth.hashCode()); - result = prime * result + ((email == null) ? 0 : email.hashCode()); - result = prime * result + ((password == null) ? 0 : password.hashCode()); - result = prime * result + ((serverAddress == null) ? 0 : serverAddress.hashCode()); - result = prime * result + ((username == null) ? 0 : username.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AuthConfig other = (AuthConfig) obj; - if (auth == null) { - if (other.auth != null) - return false; - } else if (!auth.equals(other.auth)) - return false; - if (email == null) { - if (other.email != null) - return false; - } else if (!email.equals(other.email)) - return false; - if (password == null) { - if (other.password != null) - return false; - } else if (!password.equals(other.password)) - return false; - if (serverAddress == null) { - if (other.serverAddress != null) - return false; - } else if (!serverAddress.equals(other.serverAddress)) - return false; - if (username == null) { - if (other.username != null) - return false; - } else if (!username.equals(other.username)) - return false; - return true; - } + private String username; + + @JsonProperty + private String password; + + @JsonProperty + private String email; + + @JsonProperty("serveraddress") + private String serverAddress = DEFAULT_SERVER_ADDRESS; + + private String auth; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getServerAddress() { + return serverAddress; + } + + public void setServerAddress(String serverAddress) { + this.serverAddress = serverAddress; + } + + @JsonIgnore + public String getAuth() { + return auth; + } + + @JsonProperty("auth") + public void setAuth(String auth) { + this.auth = auth; + } + + @Override + public String toString() { + return "AuthConfig{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + + '\'' + ", serverAddress='" + serverAddress + '\'' + '}'; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((auth == null) ? 0 : auth.hashCode()); + result = prime * result + ((email == null) ? 0 : email.hashCode()); + result = prime * result + ((password == null) ? 0 : password.hashCode()); + result = prime * result + ((serverAddress == null) ? 0 : serverAddress.hashCode()); + result = prime * result + ((username == null) ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AuthConfig other = (AuthConfig) obj; + if (auth == null) { + if (other.auth != null) + return false; + } else if (!auth.equals(other.auth)) + return false; + if (email == null) { + if (other.email != null) + return false; + } else if (!email.equals(other.email)) + return false; + if (password == null) { + if (other.password != null) + return false; + } else if (!password.equals(other.password)) + return false; + if (serverAddress == null) { + if (other.serverAddress != null) + return false; + } else if (!serverAddress.equals(other.serverAddress)) + return false; + if (username == null) { + if (other.username != null) + return false; + } else if (!username.equals(other.username)) + return false; + return true; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java index 5a62c7587..21451e64b 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java @@ -7,15 +7,15 @@ public class AuthConfigurations { - @JsonProperty("configs") - private Map configs = new TreeMap<>(); - - public void addConfig(AuthConfig authConfig){ - configs.put(authConfig.getServerAddress(), authConfig); - } - - public Map getConfigs(){ - return this.configs; - } - + @JsonProperty("configs") + private Map configs = new TreeMap<>(); + + public void addConfig(AuthConfig authConfig) { + configs.put(authConfig.getServerAddress(), authConfig); + } + + public Map getConfigs() { + return this.configs; + } + } 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 0071bff97..60c64d096 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -1,102 +1,96 @@ package com.github.dockerjava.api.model; - - import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; /** - * Represents a host path being bind mounted as a {@link Volume} - * in a Docker container. - * The Bind can be in read only or read write access mode. + * Represents a host path being bind mounted as a {@link Volume} in a Docker container. The Bind can be in read only or + * read write access mode. */ public class Bind { - private String path; - - private Volume volume; - - private AccessMode accessMode; - - public Bind(String path, Volume volume) { - this(path, volume, AccessMode.DEFAULT); - } - - public Bind(String path, Volume volume, AccessMode accessMode) { - this.path = path; - this.volume = volume; - this.accessMode = accessMode; - } - - public String getPath() { - return path; - } - - public Volume getVolume() { - return volume; - } - - public AccessMode getAccessMode() { - return accessMode; - } - - - /** - * Parses a bind mount specification to a {@link Bind}. - * - * @param serialized the specification, e.g. /host:/container:ro - * @return a {@link Bind} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static Bind parse(String serialized) { - try { - String[] parts = serialized.split(":"); - switch (parts.length) { - case 2: { - return new Bind(parts[0], new Volume(parts[1])); - } - case 3: { - AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); - return new Bind(parts[0], new Volume(parts[1]), accessMode); - } - default: { - throw new IllegalArgumentException(); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Bind '" + serialized - + "'"); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Bind) { - Bind other = (Bind) obj; - return new EqualsBuilder().append(path, other.getPath()) - .append(volume, other.getVolume()) - .append(accessMode, other.getAccessMode()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(path).append(volume) - .append(accessMode).toHashCode(); - } - - /** - * Returns a string representation of this {@link Bind} suitable - * for inclusion in a JSON message. - * The format is <host path>:<container path>:<access mode>, - * like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link Bind} - */ - @Override - public String toString() { - return path + ":" + volume.getPath() + ":" + accessMode.toString(); - } + private String path; + + private Volume volume; + + private AccessMode accessMode; + + public Bind(String path, Volume volume) { + this(path, volume, AccessMode.DEFAULT); + } + + public Bind(String path, Volume volume, AccessMode accessMode) { + this.path = path; + this.volume = volume; + this.accessMode = accessMode; + } + + public String getPath() { + return path; + } + + public Volume getVolume() { + return volume; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + /** + * Parses a bind mount specification to a {@link Bind}. + * + * @param serialized + * the specification, e.g. /host:/container:ro + * @return a {@link Bind} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static Bind parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 2: { + return new Bind(parts[0], new Volume(parts[1])); + } + case 3: { + AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); + return new Bind(parts[0], new Volume(parts[1]), accessMode); + } + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Bind) { + Bind other = (Bind) obj; + return new EqualsBuilder().append(path, other.getPath()).append(volume, other.getVolume()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(path).append(volume).append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link Bind} suitable for inclusion in a JSON message. The format is + * <host path>:<container path>:<access mode>, like the argument in + * {@link #parse(String)}. + * + * @return a string representation of this {@link Bind} + */ + @Override + public String toString() { + return path + ":" + volume.getPath() + ":" + accessMode.toString(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Binds.java b/src/main/java/com/github/dockerjava/api/model/Binds.java index bfc8dbf2d..1824ca77b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Binds.java +++ b/src/main/java/com/github/dockerjava/api/model/Binds.java @@ -19,51 +19,50 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = Binds.Serializer.class) @JsonDeserialize(using = Binds.Deserializer.class) public class Binds { - private Bind[] binds; + private Bind[] binds; - public Binds(Bind... binds) { - this.binds = binds; - } + public Binds(Bind... binds) { + this.binds = binds; + } - public Bind[] getBinds() { - return binds; - } + public Bind[] getBinds() { + return binds; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(Binds binds, JsonGenerator jsonGen, SerializerProvider serProvider) throws IOException, + JsonProcessingException { - @Override - public void serialize(Binds binds, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - // - jsonGen.writeStartArray(); - for (Bind bind : binds.getBinds()) { - jsonGen.writeString(bind.toString()); - } - jsonGen.writeEndArray(); - // - } + // + jsonGen.writeStartArray(); + for (Bind bind : binds.getBinds()) { + jsonGen.writeString(bind.toString()); + } + jsonGen.writeEndArray(); + // + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List binds = new ArrayList(); + List binds = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - binds.add(Bind.parse(field.getKey())); + binds.add(Bind.parse(field.getKey())); } } return new Binds(binds.toArray(new Bind[0])); diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/src/main/java/com/github/dockerjava/api/model/Capability.java index c86c07961..b17827553 100644 --- a/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -1,329 +1,297 @@ package com.github.dockerjava.api.model; /** - * The Linux capabilities supported by Docker. - * The list of capabilities is defined in Docker's types.go, - * {@link #ALL} was added manually. + * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} + * was added manually. * - * @see http://man7.org/linux/man-pages/man7/capabilities.7.html + * @see http://man7.org/linux/man-pages/man7/capabilities.7.html */ public enum Capability { - /** - * This meta capability includes all Linux capabilities. - */ - ALL, - /** - *

    - *
  • Enable and disable kernel auditing. - *
  • Change auditing filter rules. - *
  • Retrieve auditing status and filtering rules. - *
- */ - AUDIT_CONTROL, - /** - * Write records to kernel auditing log. - */ - AUDIT_WRITE, - /** - * Employ features that can block system suspend. - */ - BLOCK_SUSPEND, - /** - * Make arbitrary changes to file UIDs and GIDs (see chown(2)). - */ - CHOWN, - /** - * Bypass file read, write, and execute permission checks. - * (DAC is an abbreviation of "discretionary access control".) - */ - DAC_OVERRIDE, - /** - * Bypass file read permission checks and directory read and - * execute permission checks. - */ - DAC_READ_SEARCH, - /** - *
    - *
  • Bypass permission checks on operations that normally require - * the file system UID of the process to match the UID of the file - * (e.g., chmod(2), utime(2)), excluding those operations covered - * by the {@link #DAC_OVERRIDE} and{@link #DAC_READ_SEARCH}. - *
  • Set extended file attributes (see chattr(1)) on arbitrary files. - *
  • Set Access Control Lists (ACLs) on arbitrary files. - *
  • Ignore directory sticky bit on file deletion. - *
  • Specify O_NOATIME for arbitrary files in open(2)and fcntl(2). - *
- */ - FOWNER, - /** - *
    - *
  • Don't clear set-user-ID and set-group-ID permission bits when - * a file is modified. - *
  • Set the set-group-ID bit for a file whose GID does not match - * the file system or any of the supplementary GIDs of the calling - * process. - *
- */ - FSETID, - /** - * Permit memory locking (mlock(2), mlockall(2), mmap(2), shmctl(2)). - */ - IPC_LOCK, - /** - * Bypass permission checks for operations on System V IPC objects. - */ - IPC_OWNER, - /** - * Bypass permission checks for sending signals (see kill(2)). - * This includes use of the ioctl(2) KDSIGACCEPT operation. - */ - KILL, - /** - * Establish leases on arbitrary files (see fcntl(2)). - */ - LEASE, - /** - * Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags (see chattr(1)). - */ - LINUX_IMMUTABLE, - /** - * Override Mandatory Access Control (MAC). - * Implemented for the Smack Linux Security Module (LSM). - */ - MAC_ADMIN, - /** - * Allow MAC configuration or state changes. Implemented for the Smack LSM. - */ - MAC_OVERRIDE, - /** - * Create special files using mknod(2). - */ - MKNOD, - /** - * Perform various network-related operations: - *
    - *
  • Interface configuration. - *
  • Administration of IP firewall, masquerading, and accounting. - *
  • Modify routing tables. - *
  • Bind to any address for transparent proxying. - *
  • Set type-of-service (TOS). - *
  • Clear driver statistics. - *
  • Set promiscuous mode. - *
  • Enabling multicasting. - *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, - * SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), - * SO_RCVBUFFORCE, and SO_SNDBUFFORCE. - *
- */ - NET_ADMIN, - /** - * Bind a socket to Internet domain privileged ports (port numbers less - * than 1024). - */ - NET_BIND_SERVICE, - /** - * (Unused) Make socket broadcasts, and listen to multicasts. - */ - NET_BROADCAST, - /** - *
    - *
  • Use RAW and PACKET sockets. - *
  • Bind to any address for transparent proxying. - *
- */ - NET_RAW, - /** - * Set file capabilities. - */ - SETFCAP, - /** - *
    - *
  • Make arbitrary manipulations of process GIDs and supplementary - * GID list. - *
  • Forge GID when passing socket credentials via UNIX domain - * sockets. - *
- */ - SETGID, - /** - * If file capabilities are not supported: - *
    - *
  • grant or remove any capability in the caller's permitted - * capability set to or from any other process. (This property of - * CAP_SETPCAP is not available when the kernel is configured to - * support file capabilities, since CAP_SETPCAP has entirely different - * semantics for such kernels.) - *
- *

- * If file capabilities are supported: - *

    - *
  • Add any capability from the calling thread's bounding set to its - * inheritable set. - *
  • Drop capabilities from the bounding set (via prctl(2) - * PR_CAPBSET_DROP). - *
  • Make changes to the securebits flags. - *
- */ - SETPCAP, - /** - *
    - *
  • Make arbitrary manipulations of process UIDs (setuid(2), - * setreuid(2), setresuid(2), setfsuid(2)). - *
  • Make forged UID when passing socket credentials via UNIX domain - * sockets. - *
- */ - SETUID, - /** - *
    - *
  • Perform a range of system administration operations including: - * quotactl(2), mount(2), umount(2), swapon(2), swapoff(2), sethostname(2), - * and setdomainname(2). - *
  • Perform privileged syslog(2) operations (since Linux 2.6.37, - * CAP_SYSLOG should be used to permit such operations). - *
  • Perform VM86_REQUEST_IRQ vm86(2) command. - *
  • Perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects. - *
  • Perform operations on trusted and security Extended Attributes - * (see attr(5)). - *
  • Use lookup_dcookie(2) - *
  • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) - * IOPRIO_CLASS_IDLE I/O scheduling classes. - *
  • Forge UID when passing socket credentials. - *
  • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of - * open files, in system calls that open files (e.g., accept(2), execve(2), - * open(2), pipe(2)). - *
  • Employ CLONE_* flags that create new namespaces with clone(2) and - * unshare(2). - *
  • Call perf_event_open(2). - *
  • Access privileged perf event information. - *
  • Call setns(2). - *
  • Call fanotify_init(2). - *
  • Perform KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations. - *
  • Perform madvise(2) MADV_HWPOISON operation. - *
  • Employ the TIOCSTI ioctl(2) to insert characters into the input queue - * of a terminal other than the caller's controlling terminal. - *
  • Employ the obsolete nfsservctl(2) system call. - *
  • Employ the obsolete bdflush(2) system call. - *
  • Perform various privileged block-device ioctl(2) operations. - *
  • Perform various privileged file-system ioctl(2) operations. - *
  • Perform administrative operations on many device drivers. - *
- */ - SYS_ADMIN, - /** - * Use reboot(2) and kexec_load(2). - */ - SYS_BOOT, - /** - * Use chroot(2). - */ - SYS_CHROOT, - /** - *
    - *
  • Perform privileged syslog(2) operations. See syslog(2) for information - * on which operations require privilege. - *
  • View kernel addresses exposed via /proc and other interfaces when - * /proc/sys/kernel/kptr_restrict has the value 1. (See the discussion of the - * kptr_restrict in proc(5).) - *
- */ - SYSLOG, - /** - *
    - *
  • Load and unload kernel modules (see init_module(2) and delete_module(2)) - *
  • In kernels before 2.6.25: drop capabilities from the system-wide - * capability bounding set. - *
- */ - SYS_MODULE, - /** - *
    - *
  • Raise process nice value (nice(2), setpriority(2)) and change the nice - * value for arbitrary processes. - *
  • Set real-time scheduling policies for calling process, and set scheduling - * policies and priorities for arbitrary processes (sched_setscheduler(2), - * sched_setparam(2)). - *
  • Set CPU affinity for arbitrary processes (sched_setaffinity(2)). - *
  • Set I/O scheduling class and priority for arbitrary processes - * (ioprio_set(2)). - *
  • Apply migrate_pages(2) to arbitrary processes and allow processes to be - * migrated to arbitrary nodes. - *
  • Apply move_pages(2) to arbitrary processes. - *
  • Use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2). - *
- */ - SYS_NICE, - /** - * Use acct(2). - */ - SYS_PACCT, - /** - *
    - *
  • Trace arbitrary processes using ptrace(2). - *
  • Apply get_robust_list(2) to arbitrary processes. - *
  • Inspect processes using kcmp(2). - *
- */ - SYS_PTRACE, - /** - *
    - *
  • Perform I/O port operations (iopl(2) and ioperm(2)). - *
  • Access /proc/kcore. - *
  • Employ the FIBMAP ioctl(2) operation. - *
  • Open devices for accessing x86 model-specific registers (MSRs, see - * msr(4)). - *
  • Update /proc/sys/vm/mmap_min_addr. - *
  • Create memory mappings at addresses below the value specified by - * /proc/sys/vm/mmap_min_addr. - *
  • Map files in /proc/pci/bus. - *
  • Open /dev/mem and /dev/kmem. - *
  • Perform various SCSI device commands. - *
  • Perform certain operations on hpsa(4) and cciss(4) devices. - *
  • Perform a range of device-specific operations on other devices. - *
- */ - SYS_RAWIO, - /** - *
    - *
  • Use reserved space on ext2 file systems. - *
  • Make ioctl(2) calls controlling ext3 journaling. - *
  • Override disk quota limits. - *
  • Increase resource limits (see setrlimit(2)). - *
  • Override RLIMIT_NPROC resource limit. - *
  • Override maximum number of consoles on console allocation. - *
  • Override maximum number of keymaps. - *
  • Allow more than 64hz interrupts from the real-time clock. - *
  • Raise msg_qbytes limit for a System V message queue above the limit - * in /proc/sys/kernel/msgmnb (see msgop(2) and msgctl(2)). - *
  • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity - * of a pipe using the F_SETPIPE_SZ fcntl(2) command. - *
  • Use F_SETPIPE_SZ to increase the capacity of a pipe above the limit - * specified by /proc/sys/fs/pipe-max-size. - *
  • Override /proc/sys/fs/mqueue/queues_max limit when creating POSIX - * message queues (see mq_overview(7)). - *
  • Employ prctl(2) PR_SET_MM operation. - *
  • Set /proc/PID/oom_score_adj to a value lower than the value last set - * by a process with CAP_SYS_RESOURCE. - *
- */ - SYS_RESOURCE, - /** - *
    - *
  • Set system clock (settimeofday(2), stime(2), adjtimex(2)). - *
  • Set real-time (hardware) clock. - *
- */ - SYS_TIME, - /** - *
    - *
  • Use vhangup(2). - *
  • Employ various privileged ioctl(2) operations on virtual terminals. - *
- */ - SYS_TTY_CONFIG, - /** - * Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and - * CLOCK_BOOTTIME_ALARM timers). - */ - WAKE_ALARM + /** + * This meta capability includes all Linux capabilities. + */ + ALL, + /** + *
    + *
  • Enable and disable kernel auditing. + *
  • Change auditing filter rules. + *
  • Retrieve auditing status and filtering rules. + *
+ */ + AUDIT_CONTROL, + /** + * Write records to kernel auditing log. + */ + AUDIT_WRITE, + /** + * Employ features that can block system suspend. + */ + BLOCK_SUSPEND, + /** + * Make arbitrary changes to file UIDs and GIDs (see chown(2)). + */ + CHOWN, + /** + * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of + * "discretionary access control".) + */ + DAC_OVERRIDE, + /** + * Bypass file read permission checks and directory read and execute permission checks. + */ + DAC_READ_SEARCH, + /** + *
    + *
  • Bypass permission checks on operations that normally require the file system UID of the process to match the + * UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and + * {@link #DAC_READ_SEARCH}. + *
  • Set extended file attributes (see chattr(1)) on arbitrary files. + *
  • Set Access Control Lists (ACLs) on arbitrary files. + *
  • Ignore directory sticky bit on file deletion. + *
  • Specify O_NOATIME for arbitrary files in open(2)and fcntl(2). + *
+ */ + FOWNER, + /** + *
    + *
  • Don't clear set-user-ID and set-group-ID permission bits when a file is modified. + *
  • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs + * of the calling process. + *
+ */ + FSETID, + /** + * Permit memory locking (mlock(2), mlockall(2), mmap(2), shmctl(2)). + */ + IPC_LOCK, + /** + * Bypass permission checks for operations on System V IPC objects. + */ + IPC_OWNER, + /** + * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT + * operation. + */ + KILL, + /** + * Establish leases on arbitrary files (see fcntl(2)). + */ + LEASE, + /** + * Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags (see chattr(1)). + */ + LINUX_IMMUTABLE, + /** + * Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). + */ + MAC_ADMIN, + /** + * Allow MAC configuration or state changes. Implemented for the Smack LSM. + */ + MAC_OVERRIDE, + /** + * Create special files using mknod(2). + */ + MKNOD, + /** + * Perform various network-related operations: + *
    + *
  • Interface configuration. + *
  • Administration of IP firewall, masquerading, and accounting. + *
  • Modify routing tables. + *
  • Bind to any address for transparent proxying. + *
  • Set type-of-service (TOS). + *
  • Clear driver statistics. + *
  • Set promiscuous mode. + *
  • Enabling multicasting. + *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside + * the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE. + *
+ */ + NET_ADMIN, + /** + * Bind a socket to Internet domain privileged ports (port numbers less than 1024). + */ + NET_BIND_SERVICE, + /** + * (Unused) Make socket broadcasts, and listen to multicasts. + */ + NET_BROADCAST, + /** + *
    + *
  • Use RAW and PACKET sockets. + *
  • Bind to any address for transparent proxying. + *
+ */ + NET_RAW, + /** + * Set file capabilities. + */ + SETFCAP, + /** + *
    + *
  • Make arbitrary manipulations of process GIDs and supplementary GID list. + *
  • Forge GID when passing socket credentials via UNIX domain sockets. + *
+ */ + SETGID, + /** + * If file capabilities are not supported: + *
    + *
  • grant or remove any capability in the caller's permitted capability set to or from any other process. (This + * property of CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since + * CAP_SETPCAP has entirely different semantics for such kernels.) + *
+ *

+ * If file capabilities are supported: + *

    + *
  • Add any capability from the calling thread's bounding set to its inheritable set. + *
  • Drop capabilities from the bounding set (via prctl(2) PR_CAPBSET_DROP). + *
  • Make changes to the securebits flags. + *
+ */ + SETPCAP, + /** + *
    + *
  • Make arbitrary manipulations of process UIDs (setuid(2), setreuid(2), setresuid(2), setfsuid(2)). + *
  • Make forged UID when passing socket credentials via UNIX domain sockets. + *
+ */ + SETUID, + /** + *
    + *
  • Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), swapon(2), + * swapoff(2), sethostname(2), and setdomainname(2). + *
  • Perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to permit such + * operations). + *
  • Perform VM86_REQUEST_IRQ vm86(2) command. + *
  • Perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects. + *
  • Perform operations on trusted and security Extended Attributes (see attr(5)). + *
  • Use lookup_dcookie(2) + *
  • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling + * classes. + *
  • Forge UID when passing socket credentials. + *
  • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system calls that open + * files (e.g., accept(2), execve(2), open(2), pipe(2)). + *
  • Employ CLONE_* flags that create new namespaces with clone(2) and unshare(2). + *
  • Call perf_event_open(2). + *
  • Access privileged perf event information. + *
  • Call setns(2). + *
  • Call fanotify_init(2). + *
  • Perform KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations. + *
  • Perform madvise(2) MADV_HWPOISON operation. + *
  • Employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other than the caller's + * controlling terminal. + *
  • Employ the obsolete nfsservctl(2) system call. + *
  • Employ the obsolete bdflush(2) system call. + *
  • Perform various privileged block-device ioctl(2) operations. + *
  • Perform various privileged file-system ioctl(2) operations. + *
  • Perform administrative operations on many device drivers. + *
+ */ + SYS_ADMIN, + /** + * Use reboot(2) and kexec_load(2). + */ + SYS_BOOT, + /** + * Use chroot(2). + */ + SYS_CHROOT, + /** + *
    + *
  • Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege. + *
  • View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the + * value 1. (See the discussion of the kptr_restrict in proc(5).) + *
+ */ + SYSLOG, + /** + *
    + *
  • Load and unload kernel modules (see init_module(2) and delete_module(2)) + *
  • In kernels before 2.6.25: drop capabilities from the system-wide capability bounding set. + *
+ */ + SYS_MODULE, + /** + *
    + *
  • Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. + *
  • Set real-time scheduling policies for calling process, and set scheduling policies and priorities for + * arbitrary processes (sched_setscheduler(2), sched_setparam(2)). + *
  • Set CPU affinity for arbitrary processes (sched_setaffinity(2)). + *
  • Set I/O scheduling class and priority for arbitrary processes (ioprio_set(2)). + *
  • Apply migrate_pages(2) to arbitrary processes and allow processes to be migrated to arbitrary nodes. + *
  • Apply move_pages(2) to arbitrary processes. + *
  • Use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2). + *
+ */ + SYS_NICE, + /** + * Use acct(2). + */ + SYS_PACCT, + /** + *
    + *
  • Trace arbitrary processes using ptrace(2). + *
  • Apply get_robust_list(2) to arbitrary processes. + *
  • Inspect processes using kcmp(2). + *
+ */ + SYS_PTRACE, + /** + *
    + *
  • Perform I/O port operations (iopl(2) and ioperm(2)). + *
  • Access /proc/kcore. + *
  • Employ the FIBMAP ioctl(2) operation. + *
  • Open devices for accessing x86 model-specific registers (MSRs, see msr(4)). + *
  • Update /proc/sys/vm/mmap_min_addr. + *
  • Create memory mappings at addresses below the value specified by /proc/sys/vm/mmap_min_addr. + *
  • Map files in /proc/pci/bus. + *
  • Open /dev/mem and /dev/kmem. + *
  • Perform various SCSI device commands. + *
  • Perform certain operations on hpsa(4) and cciss(4) devices. + *
  • Perform a range of device-specific operations on other devices. + *
+ */ + SYS_RAWIO, + /** + *
    + *
  • Use reserved space on ext2 file systems. + *
  • Make ioctl(2) calls controlling ext3 journaling. + *
  • Override disk quota limits. + *
  • Increase resource limits (see setrlimit(2)). + *
  • Override RLIMIT_NPROC resource limit. + *
  • Override maximum number of consoles on console allocation. + *
  • Override maximum number of keymaps. + *
  • Allow more than 64hz interrupts from the real-time clock. + *
  • Raise msg_qbytes limit for a System V message queue above the limit in /proc/sys/kernel/msgmnb (see msgop(2) + * and msgctl(2)). + *
  • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the F_SETPIPE_SZ + * fcntl(2) command. + *
  • Use F_SETPIPE_SZ to increase the capacity of a pipe above the limit specified by /proc/sys/fs/pipe-max-size. + *
  • Override /proc/sys/fs/mqueue/queues_max limit when creating POSIX message queues (see mq_overview(7)). + *
  • Employ prctl(2) PR_SET_MM operation. + *
  • Set /proc/PID/oom_score_adj to a value lower than the value last set by a process with CAP_SYS_RESOURCE. + *
+ */ + SYS_RESOURCE, + /** + *
    + *
  • Set system clock (settimeofday(2), stime(2), adjtimex(2)). + *
  • Set real-time (hardware) clock. + *
+ */ + SYS_TIME, + /** + *
    + *
  • Use vhangup(2). + *
  • Employ various privileged ioctl(2) operations on virtual terminals. + *
+ */ + SYS_TTY_CONFIG, + /** + * Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers). + */ + WAKE_ALARM } diff --git a/src/main/java/com/github/dockerjava/api/model/Container.java b/src/main/java/com/github/dockerjava/api/model/Container.java index 5b38ce48c..6a97e20b9 100644 --- a/src/main/java/com/github/dockerjava/api/model/Container.java +++ b/src/main/java/com/github/dockerjava/api/model/Container.java @@ -10,16 +10,16 @@ * @author Konstantin Pelykh (kpelykh@gmail.com) * */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class Container { - @JsonProperty("Command") - private String command; + @JsonProperty("Command") + private String command; - @JsonProperty("Created") - private long created; + @JsonProperty("Created") + private long created; - @JsonProperty("Id") + @JsonProperty("Id") private String id; @JsonProperty("Image") @@ -62,7 +62,6 @@ public String[] getNames() { return names; } - @Override public String toString() { return ToStringBuilder.reflectionToString(this); @@ -84,20 +83,20 @@ public static class Port { private String type; public String getIp() { - return ip; - } + return ip; + } public Integer getPrivatePort() { - return privatePort; - } + return privatePort; + } public Integer getPublicPort() { - return publicPort; - } + return publicPort; + } public String getType() { - return type; - } + return type; + } @Override public String toString() { 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 ce8c6b88f..8ea673a36 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -15,177 +15,177 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerConfig { - @JsonProperty("AttachStderr") - private boolean attachStderr = false; + @JsonProperty("AttachStderr") + private boolean attachStderr = false; - @JsonProperty("AttachStdin") - private boolean attachStdin = false; + @JsonProperty("AttachStdin") + private boolean attachStdin = false; - @JsonProperty("AttachStdout") - private boolean attachStdout = false; + @JsonProperty("AttachStdout") + private boolean attachStdout = false; - @JsonProperty("Cmd") - private String[] cmd; + @JsonProperty("Cmd") + private String[] cmd; - @JsonProperty("CpuShares") - private int cpuShares = 0; + @JsonProperty("CpuShares") + private int cpuShares = 0; - @JsonProperty("Cpuset") - private String cpuset = ""; + @JsonProperty("Cpuset") + private String cpuset = ""; - @JsonProperty("Domainname") - private String domainName = ""; + @JsonProperty("Domainname") + private String domainName = ""; - @JsonProperty("Entrypoint") - private String[] entrypoint = new String[] {}; + @JsonProperty("Entrypoint") + private String[] entrypoint = new String[] {}; - @JsonProperty("Env") - private String[] env; + @JsonProperty("Env") + private String[] env; - @JsonProperty("ExposedPorts") - private ExposedPorts exposedPorts; + @JsonProperty("ExposedPorts") + private ExposedPorts exposedPorts; - @JsonProperty("Hostname") - private String hostName = ""; + @JsonProperty("Hostname") + private String hostName = ""; - @JsonProperty("Image") - private String image; + @JsonProperty("Image") + private String image; - @JsonProperty("MacAddress") - private String macAddress; - - @JsonProperty("Memory") - private long memoryLimit = 0; + @JsonProperty("MacAddress") + private String macAddress; - @JsonProperty("MemorySwap") - private long memorySwap = 0; + @JsonProperty("Memory") + private long memoryLimit = 0; - @JsonProperty("NetworkDisabled") - private boolean networkDisabled = false; + @JsonProperty("MemorySwap") + private long memorySwap = 0; - @JsonProperty("OnBuild") - private String[] onBuild; + @JsonProperty("NetworkDisabled") + private boolean networkDisabled = false; - @JsonProperty("OpenStdin") - private boolean stdinOpen = false; + @JsonProperty("OnBuild") + private String[] onBuild; - @JsonProperty("PortSpecs") - private String[] portSpecs; + @JsonProperty("OpenStdin") + private boolean stdinOpen = false; - @JsonProperty("StdinOnce") - private boolean stdInOnce = false; + @JsonProperty("PortSpecs") + private String[] portSpecs; - @JsonProperty("Tty") - private boolean tty = false; + @JsonProperty("StdinOnce") + private boolean stdInOnce = false; - @JsonProperty("User") - private String user = ""; + @JsonProperty("Tty") + private boolean tty = false; - @JsonProperty("Volumes") - private Map volumes; + @JsonProperty("User") + private String user = ""; - @JsonProperty("WorkingDir") - private String workingDir = ""; + @JsonProperty("Volumes") + private Map volumes; - @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); - } + @JsonProperty("WorkingDir") + private String workingDir = ""; - public boolean isNetworkDisabled() { - return networkDisabled; - } + @JsonIgnore + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); + } - public String getDomainName() { - return domainName; - } + public boolean isNetworkDisabled() { + return networkDisabled; + } - public String getWorkingDir() { - return workingDir; - } + public String getDomainName() { + return domainName; + } - public String getHostName() { - return hostName; - } + public String getWorkingDir() { + return workingDir; + } - public String[] getPortSpecs() { - return portSpecs; - } + public String getHostName() { + return hostName; + } - public String getUser() { - return user; - } + public String[] getPortSpecs() { + return portSpecs; + } - public boolean isTty() { - return tty; - } + public String getUser() { + return user; + } - public boolean isStdinOpen() { - return stdinOpen; - } + public boolean isTty() { + return tty; + } - public boolean isStdInOnce() { - return stdInOnce; - } - - public String getMacAddress() { - return macAddress; - } + public boolean isStdinOpen() { + return stdinOpen; + } - public long getMemoryLimit() { - return memoryLimit; - } + public boolean isStdInOnce() { + return stdInOnce; + } - public long getMemorySwap() { - return memorySwap; - } + public String getMacAddress() { + return macAddress; + } - public int getCpuShares() { - return cpuShares; - } + public long getMemoryLimit() { + return memoryLimit; + } - public String getCpuset() { - return cpuset; - } + public long getMemorySwap() { + return memorySwap; + } - public boolean isAttachStdin() { - return attachStdin; - } + public int getCpuShares() { + return cpuShares; + } - public boolean isAttachStdout() { - return attachStdout; - } + public String getCpuset() { + return cpuset; + } - public boolean isAttachStderr() { - return attachStderr; - } + public boolean isAttachStdin() { + return attachStdin; + } - public String[] getEnv() { - return env; - } + public boolean isAttachStdout() { + return attachStdout; + } - public String[] getCmd() { - return cmd; - } + public boolean isAttachStderr() { + return attachStderr; + } - public String getImage() { - return image; - } + public String[] getEnv() { + return env; + } - public Map getVolumes() { - return volumes; - } - - public String[] getEntrypoint() { - return entrypoint; - } - - public String[] getOnBuild() { - return onBuild; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } + public String[] getCmd() { + return cmd; + } + + public String getImage() { + return image; + } + + public Map getVolumes() { + return volumes; + } + + public String[] getEntrypoint() { + return entrypoint; + } + + public String[] getOnBuild() { + return onBuild; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index 574d1ad56..713c0d61a 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -9,57 +9,53 @@ public class Device { - @JsonProperty("CgroupPermissions") - private String cGroupPermissions = ""; - - @JsonProperty("PathOnHost") - private String pathOnHost = null; - - @JsonProperty("PathInContainer") - private String pathInContainer = null; - - public Device() { - } - - public Device(String cGroupPermissions, String pathInContainer, - String pathOnHost) { - checkNotNull(cGroupPermissions, - "cGroupPermissions is null"); - checkNotNull(pathInContainer, "pathInContainer is null"); - checkNotNull(pathOnHost, "pathOnHost is null"); - this.cGroupPermissions = cGroupPermissions; - this.pathInContainer = pathInContainer; - this.pathOnHost = pathOnHost; - } - - public String getcGroupPermissions() { - return cGroupPermissions; - } - - public String getPathInContainer() { - return pathInContainer; - } - - public String getPathOnHost() { - return pathOnHost; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Device) { - Device other = (Device) obj; - return new EqualsBuilder() - .append(cGroupPermissions, other.getcGroupPermissions()) - .append(pathInContainer, other.getPathInContainer()) - .append(pathOnHost, other.getPathOnHost()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(cGroupPermissions) - .append(pathInContainer).append(pathOnHost).toHashCode(); - } + @JsonProperty("CgroupPermissions") + private String cGroupPermissions = ""; + + @JsonProperty("PathOnHost") + private String pathOnHost = null; + + @JsonProperty("PathInContainer") + private String pathInContainer = null; + + public Device() { + } + + public Device(String cGroupPermissions, String pathInContainer, String pathOnHost) { + checkNotNull(cGroupPermissions, "cGroupPermissions is null"); + checkNotNull(pathInContainer, "pathInContainer is null"); + checkNotNull(pathOnHost, "pathOnHost is null"); + this.cGroupPermissions = cGroupPermissions; + this.pathInContainer = pathInContainer; + this.pathOnHost = pathOnHost; + } + + public String getcGroupPermissions() { + return cGroupPermissions; + } + + public String getPathInContainer() { + return pathInContainer; + } + + public String getPathOnHost() { + return pathOnHost; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Device) { + Device other = (Device) obj; + return new EqualsBuilder().append(cGroupPermissions, other.getcGroupPermissions()) + .append(pathInContainer, other.getPathInContainer()).append(pathOnHost, other.getPathOnHost()) + .isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(cGroupPermissions).append(pathInContainer).append(pathOnHost).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java index 87d9b0d7f..d589a31d1 100644 --- a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java +++ b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java @@ -5,6 +5,7 @@ public class ErrorResponse { @JsonProperty private ErrorDetail errorDetail; + @JsonProperty private String error; diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java index cb961f97d..27eb22216 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -22,12 +22,17 @@ 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 + * + * @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) { @@ -36,10 +41,12 @@ public Event(String status, String id, String from, long time) { this.from = from; this.time = time; } - + /** - * Status of docker image or container. - * List of statuses is available in Docker API v.1.16 + * Status of docker image or container. List of statuses is available in Docker API + * v.1.16 + * * @return Status string */ public String getStatus() { @@ -48,6 +55,7 @@ public String getStatus() { /** * Get ID of docker container. + * * @return Container ID */ public String getId() { @@ -56,6 +64,7 @@ public String getId() { /** * Get source image of the container. + * * @return Name of the parent container */ public String getFrom() { @@ -63,8 +72,8 @@ public String getFrom() { } /** - * Get the event time. - * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT + * 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() { diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 010ed9af7..9c7489812 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -1,7 +1,5 @@ package com.github.dockerjava.api.model; - - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -12,12 +10,12 @@ /** * Represents an event stream */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class EventStreamItem implements Serializable { - private static final long serialVersionUID = 638778515773898651L; + private static final long serialVersionUID = 638778515773898651L; - @JsonProperty("stream") + @JsonProperty("stream") private String stream; // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} @@ -39,28 +37,23 @@ public ErrorDetail getErrorDetail() { return errorDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ErrorDetail implements Serializable { @JsonProperty("code") String code; + @JsonProperty("message") String message; @Override public String toString() { - return Objects.toStringHelper(this) - .add("code", code) - .add("message", message) - .toString(); + return Objects.toStringHelper(this).add("code", code).add("message", message).toString(); } } @Override public String toString() { - return Objects.toStringHelper(this) - .add("stream", stream) - .add("error", error) - .add("errorDetail", errorDetail) + return Objects.toStringHelper(this).add("stream", stream).add("error", error).add("errorDetail", errorDetail) .toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java index 30f7ce384..23510e50a 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -24,168 +24,168 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * Represents a container port that Docker exposes to external clients. - * The port is defined by its {@link #getPort() port number} and an - * {@link InternetProtocol}. - * It can be published by Docker by {@link Ports#bind(ExposedPort, Binding) binding} - * it to a host port, represented by a {@link Binding}. + * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPort() + * port number} and an {@link InternetProtocol}. It can be published by Docker by + * {@link Ports#bind(ExposedPort, Binding) binding} it to a host port, represented by a {@link Binding}. */ @JsonDeserialize(using = ExposedPort.Deserializer.class) @JsonSerialize(using = ExposedPort.Serializer.class) public class ExposedPort { - private final InternetProtocol protocol; - private final int port; - - /** - * Creates an {@link ExposedPort} for the given parameters. - * - * @param port the {@link #getPort() port number} - * @param protocol the {@link InternetProtocol} - */ - public ExposedPort(int port, InternetProtocol protocol) { - this.port = port; - this.protocol = protocol; - } - - /** - * Creates an {@link ExposedPort} for the given - * {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}. - * - * @param port the {@link #getPort() port number} - */ - public ExposedPort(int port) { - this(port, InternetProtocol.DEFAULT); - } - - /** - * Creates an {@link ExposedPort} for the given parameters. - * - * @param scheme the {@link #getScheme() scheme}, tcp or - * udp - * @param port the {@link #getPort() port number} - * @deprecated use {@link #ExposedPort(int, InternetProtocol)} - */ - @Deprecated - public ExposedPort(String scheme, int port) { - this(port, InternetProtocol.valueOf(scheme)); - } - - /** @return the {@link InternetProtocol} of the {@link #getPort() port} - * that the container exposes */ - public InternetProtocol getProtocol() { - return protocol; - } - - /** - * @return the scheme (internet protocol), tcp or udp - * @deprecated use {@link #getProtocol()} - */ - @Deprecated - public String getScheme() { - return protocol.toString(); - } - - /** @return the port number that the container exposes */ - public int getPort() { - return port; - } - - /** - * Creates an {@link ExposedPort} for {@link InternetProtocol#TCP}. - * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#TCP}) - */ - public static ExposedPort tcp(int port) { - return new ExposedPort(port, TCP); - } - - /** - * Creates an {@link ExposedPort} for {@link InternetProtocol#UDP}. - * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#UDP}) - */ - public static ExposedPort udp(int port) { - return new ExposedPort(port, UDP); - } - - /** - * Parses a textual port specification (as used by the Docker CLI) to an - * {@link ExposedPort}. - * - * @param serialized the specification, e.g. 80/tcp - * @return an {@link ExposedPort} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static ExposedPort parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = serialized.split("/"); - switch (parts.length) { - case 1: - return new ExposedPort(Integer.valueOf(parts[0])); - case 2: - return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); - default: - throw new IllegalArgumentException(); - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'"); - } - } - - /** - * Returns a string representation of this {@link ExposedPort} suitable - * for inclusion in a JSON message. - * The format is port/protocol, like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link ExposedPort} - */ - @Override - public String toString() { - return port + "/" + protocol.toString(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ExposedPort) { - ExposedPort other = (ExposedPort) obj; - return new EqualsBuilder().append(protocol, other.getProtocol()) - .append(port, other.getPort()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(protocol).append(port).toHashCode(); - } - - public static class Deserializer extends JsonDeserializer { - @Override - public ExposedPort 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 ExposedPort.parse(field.getKey()); - } else { - return null; - } - } - } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeEndObject(); - } - - } + private final InternetProtocol protocol; + + private final int port; + + /** + * Creates an {@link ExposedPort} for the given parameters. + * + * @param port + * the {@link #getPort() port number} + * @param protocol + * the {@link InternetProtocol} + */ + public ExposedPort(int port, InternetProtocol protocol) { + this.port = port; + this.protocol = protocol; + } + + /** + * Creates an {@link ExposedPort} for the given {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}. + * + * @param port + * the {@link #getPort() port number} + */ + public ExposedPort(int port) { + this(port, InternetProtocol.DEFAULT); + } + + /** + * Creates an {@link ExposedPort} for the given parameters. + * + * @param scheme + * the {@link #getScheme() scheme}, tcp or udp + * @param port + * the {@link #getPort() port number} + * @deprecated use {@link #ExposedPort(int, InternetProtocol)} + */ + @Deprecated + public ExposedPort(String scheme, int port) { + this(port, InternetProtocol.valueOf(scheme)); + } + + /** + * @return the {@link InternetProtocol} of the {@link #getPort() port} that the container exposes + */ + public InternetProtocol getProtocol() { + return protocol; + } + + /** + * @return the scheme (internet protocol), tcp or udp + * @deprecated use {@link #getProtocol()} + */ + @Deprecated + public String getScheme() { + return protocol.toString(); + } + + /** @return the port number that the container exposes */ + public int getPort() { + return port; + } + + /** + * Creates an {@link ExposedPort} for {@link InternetProtocol#TCP}. This is a shortcut for + * new ExposedPort(port, {@link InternetProtocol#TCP}) + */ + public static ExposedPort tcp(int port) { + return new ExposedPort(port, TCP); + } + + /** + * Creates an {@link ExposedPort} for {@link InternetProtocol#UDP}. This is a shortcut for + * new ExposedPort(port, {@link InternetProtocol#UDP}) + */ + public static ExposedPort udp(int port) { + return new ExposedPort(port, UDP); + } + + /** + * Parses a textual port specification (as used by the Docker CLI) to an {@link ExposedPort}. + * + * @param serialized + * the specification, e.g. 80/tcp + * @return an {@link ExposedPort} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static ExposedPort parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split("/"); + switch (parts.length) { + case 1: + return new ExposedPort(Integer.valueOf(parts[0])); + case 2: + return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); + default: + throw new IllegalArgumentException(); + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link ExposedPort} suitable for inclusion in a JSON message. The format + * is port/protocol, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link ExposedPort} + */ + @Override + public String toString() { + return port + "/" + protocol.toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExposedPort) { + ExposedPort other = (ExposedPort) obj; + return new EqualsBuilder().append(protocol, other.getProtocol()).append(port, other.getPort()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(protocol).append(port).toHashCode(); + } + + public static class Deserializer extends JsonDeserializer { + @Override + public ExposedPort 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 ExposedPort.parse(field.getKey()); + } else { + return null; + } + } + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + jsonGen.writeFieldName(exposedPort.toString()); + jsonGen.writeEndObject(); + } + + } } diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java index 983ad3c36..0ecb879b6 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java @@ -19,55 +19,54 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = ExposedPorts.Serializer.class) @JsonDeserialize(using = ExposedPorts.Deserializer.class) public class ExposedPorts { - private ExposedPort[] exposedPorts; + private ExposedPort[] exposedPorts; + + public ExposedPorts(ExposedPort... exposedPorts) { + this.exposedPorts = exposedPorts; + } - public ExposedPorts(ExposedPort... exposedPorts) { - this.exposedPorts = exposedPorts; - } - - public ExposedPorts(List exposedPorts) { - this.exposedPorts = exposedPorts.toArray(new ExposedPort[exposedPorts.size()]); - } + public ExposedPorts(List exposedPorts) { + this.exposedPorts = exposedPorts.toArray(new ExposedPort[exposedPorts.size()]); + } - public ExposedPort[] getExposedPorts() { - return exposedPorts; - } + public ExposedPort[] getExposedPorts() { + return exposedPorts; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) { - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - } - jsonGen.writeEndObject(); - } + @Override + public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) { + jsonGen.writeFieldName(exposedPort.toString()); + jsonGen.writeStartObject(); + jsonGen.writeEndObject(); + } + jsonGen.writeEndObject(); + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List exposedPorts = new ArrayList(); + List exposedPorts = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - exposedPorts.add(ExposedPort.parse(field.getKey())); + exposedPorts.add(ExposedPort.parse(field.getKey())); } } return new ExposedPorts(exposedPorts.toArray(new ExposedPort[0])); 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 175b56830..1be92f9b6 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -7,6 +7,7 @@ */ public class Frame { private final StreamType streamType; + private final byte[] payload; public Frame(StreamType streamType, byte[] payload) { @@ -29,8 +30,10 @@ public String toString() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; Frame frame = (Frame) o; 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 6b8cdcd45..19da56517 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -5,243 +5,241 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang.builder.ToStringBuilder; - @JsonIgnoreProperties(ignoreUnknown = true) public class HostConfig { - @JsonProperty("Binds") - private Binds binds; - - @JsonProperty("Links") - private Links links; - - @JsonProperty("LxcConf") - private LxcConf[] lxcConf; + @JsonProperty("Binds") + private Binds binds; - @JsonProperty("PortBindings") - private Ports portBindings; + @JsonProperty("Links") + private Links links; - @JsonProperty("PublishAllPorts") - private boolean publishAllPorts; + @JsonProperty("LxcConf") + private LxcConf[] lxcConf; - @JsonProperty("Privileged") - private boolean privileged; + @JsonProperty("PortBindings") + private Ports portBindings; - @JsonProperty("ReadonlyRootfs") - private boolean readonlyRootfs; + @JsonProperty("PublishAllPorts") + private boolean publishAllPorts; - @JsonProperty("Dns") - private String[] dns; + @JsonProperty("Privileged") + private boolean privileged; - @JsonProperty("DnsSearch") - private String[] dnsSearch; + @JsonProperty("ReadonlyRootfs") + private boolean readonlyRootfs; - @JsonProperty("VolumesFrom") - private VolumesFrom[] volumesFrom; + @JsonProperty("Dns") + private String[] dns; - @JsonProperty("ContainerIDFile") - private String containerIDFile; + @JsonProperty("DnsSearch") + private String[] dnsSearch; - @JsonProperty("CapAdd") - private Capability[] capAdd; + @JsonProperty("VolumesFrom") + private VolumesFrom[] volumesFrom; - @JsonProperty("CapDrop") - private Capability[] capDrop; + @JsonProperty("ContainerIDFile") + private String containerIDFile; - @JsonProperty("RestartPolicy") - private RestartPolicy restartPolicy; + @JsonProperty("CapAdd") + private Capability[] capAdd; - @JsonProperty("NetworkMode") - private String networkMode; + @JsonProperty("CapDrop") + private Capability[] capDrop; - @JsonProperty("Devices") - private Device[] devices; + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; - @JsonProperty("ExtraHosts") - private String[] extraHosts; + @JsonProperty("NetworkMode") + private String networkMode; - @JsonProperty("Ulimits") - private Ulimit[] ulimits; + @JsonProperty("Devices") + private Device[] devices; - public HostConfig() { - } + @JsonProperty("ExtraHosts") + private String[] extraHosts; - public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, - 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); - this.links = new Links(links); - this.lxcConf = lxcConf; - this.portBindings = portBindings; - this.publishAllPorts = publishAllPorts; - this.privileged = privileged; - this.readonlyRootfs = readonlyRootfs; - this.dns = dns; - this.dnsSearch = dnsSearch; - this.volumesFrom = volumesFrom; - this.containerIDFile = containerIDFile; - this.capAdd = capAdd; - this.capDrop = capDrop; - this.restartPolicy = restartPolicy; - this.networkMode = networkMode; - this.devices = devices; - this.extraHosts = extraHosts; - this.ulimits = ulimits; - } + @JsonProperty("Ulimits") + private Ulimit[] ulimits; + public HostConfig() { + } - @JsonIgnore - public Bind[] getBinds() { - return (binds == null) ? new Bind[0] : binds.getBinds(); - } + public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, + 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); + this.links = new Links(links); + this.lxcConf = lxcConf; + this.portBindings = portBindings; + this.publishAllPorts = publishAllPorts; + this.privileged = privileged; + this.readonlyRootfs = readonlyRootfs; + this.dns = dns; + this.dnsSearch = dnsSearch; + this.volumesFrom = volumesFrom; + this.containerIDFile = containerIDFile; + this.capAdd = capAdd; + this.capDrop = capDrop; + this.restartPolicy = restartPolicy; + this.networkMode = networkMode; + this.devices = devices; + this.extraHosts = extraHosts; + this.ulimits = ulimits; + } - public LxcConf[] getLxcConf() { - return lxcConf; - } + @JsonIgnore + public Bind[] getBinds() { + return (binds == null) ? new Bind[0] : binds.getBinds(); + } - public Ports getPortBindings() { - return portBindings; - } + public LxcConf[] getLxcConf() { + return lxcConf; + } - public boolean isPublishAllPorts() { - return publishAllPorts; - } + public Ports getPortBindings() { + return portBindings; + } - public boolean isPrivileged() { - return privileged; - } + public boolean isPublishAllPorts() { + return publishAllPorts; + } - public boolean isReadonlyRootfs() { - return readonlyRootfs; - } - - public String[] getDns() { - return dns; - } - - public VolumesFrom[] getVolumesFrom() { - return volumesFrom; - } - - public String getContainerIDFile() { - return containerIDFile; - } - - public String[] getDnsSearch() { - return dnsSearch; - } - - @JsonIgnore - public Link[] getLinks() { - return (links == null) ? new Link[0] : links.getLinks(); - } - - public String getNetworkMode() { - return networkMode; - } - - public Device[] getDevices() { - return devices; - } - - public String[] getExtraHosts() { - return extraHosts; - } - - public RestartPolicy getRestartPolicy() { - return restartPolicy; - } - - public Capability[] getCapAdd() { - return capAdd; - } - - public Capability[] getCapDrop() { - return capDrop; - } - - public Ulimit[] getUlimits() { - return ulimits; - } - - @JsonIgnore - public void setBinds(Bind... binds) { - this.binds = new Binds(binds); - } - - @JsonIgnore - public void setLinks(Link... links) { - this.links = new Links(links); - } - - public void setLxcConf(LxcConf[] lxcConf) { - this.lxcConf = lxcConf; - } - - public void setPortBindings(Ports portBindings) { - this.portBindings = portBindings; - } - - public void setPublishAllPorts(boolean publishAllPorts) { - this.publishAllPorts = publishAllPorts; - } - - public void setPrivileged(boolean privileged) { - this.privileged = privileged; - } - - public void setReadonlyRootfs(boolean readonlyRootfs) { - this.readonlyRootfs = readonlyRootfs; - } - - public void setDns(String[] dns) { - this.dns = dns; - } - - public void setDnsSearch(String[] dnsSearch) { - this.dnsSearch = dnsSearch; - } - - public void setVolumesFrom(VolumesFrom[] volumesFrom) { - this.volumesFrom = volumesFrom; - } - - public void setContainerIDFile(String containerIDFile) { - this.containerIDFile = containerIDFile; - } - - public void setCapAdd(Capability[] capAdd) { - this.capAdd = capAdd; - } - - public void setCapDrop(Capability[] capDrop) { - this.capDrop = capDrop; - } - - public void setRestartPolicy(RestartPolicy restartPolicy) { - this.restartPolicy = restartPolicy; - } - - public void setNetworkMode(String networkMode) { - this.networkMode = networkMode; - } - - public void setDevices(Device[] devices) { - this.devices = devices; - } - - public void setExtraHosts(String[] extraHosts) { - this.extraHosts = extraHosts; - } - - public void setUlimits(Ulimit[] ulimits) { - this.ulimits = ulimits; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } + public boolean isPrivileged() { + return privileged; + } + + public boolean isReadonlyRootfs() { + return readonlyRootfs; + } + + public String[] getDns() { + return dns; + } + + public VolumesFrom[] getVolumesFrom() { + return volumesFrom; + } + + public String getContainerIDFile() { + return containerIDFile; + } + + public String[] getDnsSearch() { + return dnsSearch; + } + + @JsonIgnore + public Link[] getLinks() { + return (links == null) ? new Link[0] : links.getLinks(); + } + + public String getNetworkMode() { + return networkMode; + } + + public Device[] getDevices() { + return devices; + } + + public String[] getExtraHosts() { + return extraHosts; + } + + public RestartPolicy getRestartPolicy() { + return restartPolicy; + } + + public Capability[] getCapAdd() { + return capAdd; + } + + public Capability[] getCapDrop() { + return capDrop; + } + + public Ulimit[] getUlimits() { + return ulimits; + } + + @JsonIgnore + public void setBinds(Bind... binds) { + this.binds = new Binds(binds); + } + + @JsonIgnore + public void setLinks(Link... links) { + this.links = new Links(links); + } + + public void setLxcConf(LxcConf[] lxcConf) { + this.lxcConf = lxcConf; + } + + public void setPortBindings(Ports portBindings) { + this.portBindings = portBindings; + } + + public void setPublishAllPorts(boolean publishAllPorts) { + this.publishAllPorts = publishAllPorts; + } + + public void setPrivileged(boolean privileged) { + this.privileged = privileged; + } + + public void setReadonlyRootfs(boolean readonlyRootfs) { + this.readonlyRootfs = readonlyRootfs; + } + + public void setDns(String[] dns) { + this.dns = dns; + } + + public void setDnsSearch(String[] dnsSearch) { + this.dnsSearch = dnsSearch; + } + + public void setVolumesFrom(VolumesFrom[] volumesFrom) { + this.volumesFrom = volumesFrom; + } + + public void setContainerIDFile(String containerIDFile) { + this.containerIDFile = containerIDFile; + } + + public void setCapAdd(Capability[] capAdd) { + this.capAdd = capAdd; + } + + public void setCapDrop(Capability[] capDrop) { + this.capDrop = capDrop; + } + + public void setRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; + } + + public void setNetworkMode(String networkMode) { + this.networkMode = networkMode; + } + + public void setDevices(Device[] devices) { + this.devices = devices; + } + + 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/Identifier.java b/src/main/java/com/github/dockerjava/api/model/Identifier.java index 498104e29..96daab11a 100644 --- a/src/main/java/com/github/dockerjava/api/model/Identifier.java +++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.model; - import com.google.common.base.Objects; import com.google.common.base.Optional; @@ -9,51 +8,46 @@ */ public class Identifier { public final Repository repository; + public final Optional tag; public Identifier(Repository repository, String tag) { this.repository = repository; - if( tag == null ) + if (tag == null) this.tag = Optional.absent(); else this.tag = Optional.of(tag); } - /** - * Return an identifier that correctly splits up the repository and tag. - * There can be > 1 ":" - * fred/jim --> fred/jim, [] - * fred/jim:123 --> fred/jim, 123 - * fred:123/jim:123 --> fred:123/jim, 123 + * Return an identifier that correctly splits up the repository and tag. There can be > 1 ":" fred/jim --> + * fred/jim, [] fred/jim:123 --> fred/jim, 123 fred:123/jim:123 --> fred:123/jim, 123 * * - * @param identifier as a string + * @param identifier + * as a string * @return parsed identifier. */ public static Identifier fromCompoundString(String identifier) { String[] parts = identifier.split("/"); - if( parts.length != 2 ) { + if (parts.length != 2) { String[] rhs = identifier.split(":"); - if( rhs.length != 2 ) - return new Identifier( new Repository(identifier), null); + if (rhs.length != 2) + return new Identifier(new Repository(identifier), null); else - return new Identifier( new Repository(rhs[0]), rhs[1]); + return new Identifier(new Repository(rhs[0]), rhs[1]); } String[] rhs = parts[1].split(":"); - if( rhs.length != 2 ) - return new Identifier( new Repository(identifier), null); + if (rhs.length != 2) + return new Identifier(new Repository(identifier), null); - return new Identifier( new Repository(parts[0] + "/" + rhs[0]), rhs[1]); + return new Identifier(new Repository(parts[0] + "/" + rhs[0]), rhs[1]); } @Override public String toString() { - return Objects.toStringHelper(this) - .add("repository", repository) - .add("tag", tag) - .toString(); + return Objects.toStringHelper(this).add("repository", repository).add("tag", tag).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/Image.java b/src/main/java/com/github/dockerjava/api/model/Image.java index 8c694daba..9df8aacef 100644 --- a/src/main/java/com/github/dockerjava/api/model/Image.java +++ b/src/main/java/com/github/dockerjava/api/model/Image.java @@ -13,16 +13,16 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Image { - @JsonProperty("Created") - private long created; + @JsonProperty("Created") + private long created; - @JsonProperty("Id") + @JsonProperty("Id") private String id; - @JsonProperty("ParentId") - private String parentId; + @JsonProperty("ParentId") + private String parentId; - @JsonProperty("RepoTags") + @JsonProperty("RepoTags") private String[] repoTags; @JsonProperty("Size") 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 bf96b9fc1..5ff53a597 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -20,173 +20,173 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Info { - @JsonProperty("Containers") - private int containers; - - @JsonProperty("Debug") - private boolean debug; - - @JsonProperty("DockerRootDir") - private String DockerRootDir; - - @JsonProperty("Driver") - private String driver; - - @JsonProperty("DriverStatus") - private List driverStatuses; - - @JsonProperty("ExecutionDriver") - private String executionDriver; - - @JsonProperty("ID") - private String ID; - - @JsonProperty("IPv4Forwarding") - private boolean IPv4Forwarding; - - @JsonProperty("Images") - private int images; - - @JsonProperty("IndexServerAddress") - private String IndexServerAddress; - - @JsonProperty("InitPath") - private String initPath; - - @JsonProperty("InitSha1") - private String initSha1; - - @JsonProperty("KernelVersion") - private String kernelVersion; - - @JsonProperty("Labels") - private String[] Labels; - - @JsonProperty("MemoryLimit") - private boolean memoryLimit; - - @JsonProperty("MemTotal") - private long memTotal; - - @JsonProperty("Name") - private String name; - - @JsonProperty("NCPU") - private int NCPU; - - @JsonProperty("NEventsListener") - private long nEventListener; - - @JsonProperty("NFd") - private int NFd; - - @JsonProperty("NGoroutines") - private int NGoroutines; - - @JsonProperty("OperatingSystem") - private String OperatingSystem; - - @JsonProperty("Sockets") - private String[] sockets; - - @JsonProperty("SwapLimit") - private boolean swapLimit; - - public boolean isDebug() { - return debug; - } - - public int getContainers() { - return containers; - } - - public String getDockerRootDir() { - return DockerRootDir; - } - - public String getDriver() { - return driver; - } - - public List getDriverStatuses() { - return driverStatuses; - } - - public int getImages() { - return images; - } - - public String getID() { - return ID; - } - - public boolean getIPv4Forwarding() { - return IPv4Forwarding; - } - - public String getIndexServerAddress() { - return IndexServerAddress; - } - - public String getInitPath() { - return initPath; - } - - public String getInitSha1() { - return initSha1; - } - - public String getKernelVersion() { - return kernelVersion; - } - - public String[] getLabels() { - return Labels; - } - - public String[] getSockets() { - return sockets; - } - - public boolean isMemoryLimit() { - return memoryLimit; - } - - public long getnEventListener() { - return nEventListener; - } - - public long getMemTotal() { - return memTotal; - } - - public String getName() { - return name; - } - - public int getNCPU() { - return NCPU; - } - - public int getNFd() { - return NFd; - } - - public int getNGoroutines() { - return NGoroutines; - } - - public String getOperatingSystem() { - return OperatingSystem; - } - - public boolean getSwapLimit() { - return swapLimit; - } - - public String getExecutionDriver() { - return executionDriver; - } + @JsonProperty("Containers") + private int containers; + + @JsonProperty("Debug") + private boolean debug; + + @JsonProperty("DockerRootDir") + private String DockerRootDir; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("DriverStatus") + private List driverStatuses; + + @JsonProperty("ExecutionDriver") + private String executionDriver; + + @JsonProperty("ID") + private String ID; + + @JsonProperty("IPv4Forwarding") + private boolean IPv4Forwarding; + + @JsonProperty("Images") + private int images; + + @JsonProperty("IndexServerAddress") + private String IndexServerAddress; + + @JsonProperty("InitPath") + private String initPath; + + @JsonProperty("InitSha1") + private String initSha1; + + @JsonProperty("KernelVersion") + private String kernelVersion; + + @JsonProperty("Labels") + private String[] Labels; + + @JsonProperty("MemoryLimit") + private boolean memoryLimit; + + @JsonProperty("MemTotal") + private long memTotal; + + @JsonProperty("Name") + private String name; + + @JsonProperty("NCPU") + private int NCPU; + + @JsonProperty("NEventsListener") + private long nEventListener; + + @JsonProperty("NFd") + private int NFd; + + @JsonProperty("NGoroutines") + private int NGoroutines; + + @JsonProperty("OperatingSystem") + private String OperatingSystem; + + @JsonProperty("Sockets") + private String[] sockets; + + @JsonProperty("SwapLimit") + private boolean swapLimit; + + public boolean isDebug() { + return debug; + } + + public int getContainers() { + return containers; + } + + public String getDockerRootDir() { + return DockerRootDir; + } + + public String getDriver() { + return driver; + } + + public List getDriverStatuses() { + return driverStatuses; + } + + public int getImages() { + return images; + } + + public String getID() { + return ID; + } + + public boolean getIPv4Forwarding() { + return IPv4Forwarding; + } + + public String getIndexServerAddress() { + return IndexServerAddress; + } + + public String getInitPath() { + return initPath; + } + + public String getInitSha1() { + return initSha1; + } + + public String getKernelVersion() { + return kernelVersion; + } + + public String[] getLabels() { + return Labels; + } + + public String[] getSockets() { + return sockets; + } + + public boolean isMemoryLimit() { + return memoryLimit; + } + + public long getnEventListener() { + return nEventListener; + } + + public long getMemTotal() { + return memTotal; + } + + public String getName() { + return name; + } + + public int getNCPU() { + return NCPU; + } + + public int getNFd() { + return NFd; + } + + public int getNGoroutines() { + return NGoroutines; + } + + public String getOperatingSystem() { + return OperatingSystem; + } + + public boolean getSwapLimit() { + return swapLimit; + } + + public String getExecutionDriver() { + return executionDriver; + } @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java index 96c215245..65df8cf6f 100644 --- a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java +++ b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.model; - /** * The IP protocols supported by Docker. * @@ -8,42 +7,43 @@ * @see #UDP */ public enum InternetProtocol { - /** The Transmission Control Protocol */ - TCP, + /** The Transmission Control Protocol */ + TCP, + + /** The User Datagram Protocol */ + UDP; - /** The User Datagram Protocol */ - UDP; - - /** - * The default {@link InternetProtocol}: {@link #TCP} - */ - public static final InternetProtocol DEFAULT = TCP; + /** + * The default {@link InternetProtocol}: {@link #TCP} + */ + public static final InternetProtocol DEFAULT = TCP; - /** - * Returns a string representation of this {@link InternetProtocol} suitable - * for inclusion in a JSON message. - * The output is the lowercased name of the Protocol, e.g. tcp. - * - * @return a string representation of this {@link InternetProtocol} - */ - @Override - public String toString() { - return super.toString().toLowerCase(); - } + /** + * Returns a string representation of this {@link InternetProtocol} suitable for inclusion in a JSON message. The + * output is the lowercased name of the Protocol, e.g. tcp. + * + * @return a string representation of this {@link InternetProtocol} + */ + @Override + public String toString() { + return super.toString().toLowerCase(); + } - /** - * Parses a string to an {@link InternetProtocol}. - * - * @param serialized the protocol, e.g. tcp or TCP - * @return an {@link InternetProtocol} described by the string - * @throws IllegalArgumentException if the argument cannot be parsed - */ - public static InternetProtocol parse(String serialized) throws IllegalArgumentException { - try { - return valueOf(serialized.toUpperCase()); - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Protocol '" + serialized + "'"); - } - } + /** + * Parses a string to an {@link InternetProtocol}. + * + * @param serialized + * the protocol, e.g. tcp or TCP + * @return an {@link InternetProtocol} described by the string + * @throws IllegalArgumentException + * if the argument cannot be parsed + */ + public static InternetProtocol parse(String serialized) throws IllegalArgumentException { + try { + return valueOf(serialized.toUpperCase()); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Protocol '" + serialized + "'"); + } + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Link.java b/src/main/java/com/github/dockerjava/api/model/Link.java index ab8485a36..0b2c828f3 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -4,104 +4,94 @@ import org.apache.commons.lang.builder.HashCodeBuilder; /** - * Represents a network link between two Docker containers. - * The container with the name {@link #getName()} is made available in the - * target container with the aliased name {@link #getAlias()}. - * This involves creating an entry in /etc/hosts and some environment - * variables in the target container as well as creating a network bridge between - * both containers. + * Represents a network link between two Docker containers. The container with the name {@link #getName()} is made + * available in the target container with the aliased name {@link #getAlias()}. This involves creating an entry in + * /etc/hosts and some environment variables in the target container as well as creating a network bridge + * between both containers. */ -public class Link -{ +public class Link { - private final String name; + private final String name; - private final String alias; + private final String alias; - /** - * Creates a {@link Link} for the container with the given name and an aliased - * name for use in the target container. - * - * @param name the name of the container that you want to link into the target - * container - * @param alias the aliased name under which the linked container will be available - * in the target container - */ - public Link(final String name, final String alias) - { - this.name = name; - this.alias = alias; - } + /** + * Creates a {@link Link} for the container with the given name and an aliased name for use in the target container. + * + * @param name + * the name of the container that you want to link into the target container + * @param alias + * the aliased name under which the linked container will be available in the target container + */ + public Link(final String name, final String alias) { + this.name = name; + this.alias = alias; + } - /** - * @return the name of the container that is linked into the target container - */ - public String getName() - { - return name; - } + /** + * @return the name of the container that is linked into the target container + */ + public String getName() { + return name; + } - /** - * @return the aliased name under which the linked container will be available - * in the target container - */ - public String getAlias() - { - return alias; - } + /** + * @return the aliased name under which the linked container will be available in the target container + */ + public String getAlias() { + return alias; + } - /** - * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. - * - * @param serialized the specification, e.g. name:alias or /name1:/name2/alias - * @return a {@link Link} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static Link parse(final String serialized) throws IllegalArgumentException - { - try { - final String[] parts = serialized.split(":"); - switch (parts.length) { - case 2: { - String[] nameSplit = parts[0].split("/"); - String[] aliasSplit = parts[1].split("/"); - return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); - } - default: { - throw new IllegalArgumentException(); - } - } - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing Link '" + serialized + "'"); - } - } + /** + * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. + * + * @param serialized + * the specification, e.g. name:alias or /name1:/name2/alias + * @return a {@link Link} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static Link parse(final String serialized) throws IllegalArgumentException { + try { + final String[] parts = serialized.split(":"); + switch (parts.length) { + case 2: { + String[] nameSplit = parts[0].split("/"); + String[] aliasSplit = parts[1].split("/"); + return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); + } + default: { + throw new IllegalArgumentException(); + } + } + } catch (final Exception e) { + throw new IllegalArgumentException("Error parsing Link '" + serialized + "'"); + } + } - @Override - public boolean equals(final Object obj) - { - if (obj instanceof Link) { - final Link other = (Link) obj; - return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); - } else - return super.equals(obj); - } + @Override + public boolean equals(final Object obj) { + if (obj instanceof Link) { + final Link other = (Link) obj; + return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); + } else + return super.equals(obj); + } - @Override - public int hashCode() - { - return new HashCodeBuilder().append(name).append(alias).toHashCode(); - } + @Override + public int hashCode() { + return new HashCodeBuilder().append(name).append(alias).toHashCode(); + } - /** - * Returns a string representation of this {@link Link} suitable - * for inclusion in a JSON message. - * The format is name:alias, like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link Link} - */ - @Override - public String toString() { - return name + ":" + alias; - } + /** + * Returns a string representation of this {@link Link} suitable for inclusion in a JSON message. The format is + * name:alias, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link Link} + */ + @Override + public String toString() { + return name + ":" + alias; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index 888c0aa2c..2d678b3a3 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -1,4 +1,3 @@ - package com.github.dockerjava.api.model; import java.io.IOException; @@ -21,58 +20,53 @@ @JsonSerialize(using = Links.Serializer.class) @JsonDeserialize(using = Links.Deserializer.class) -public class Links -{ +public class Links { - private final Link[] links; + private final Link[] links; - public Links(final Link... links) - { - this.links = links; - } + public Links(final Link... links) { + this.links = links; + } - public Links(final List links) { - this.links = links.toArray(new Link[links.size()]); - } + public Links(final List links) { + this.links = links.toArray(new Link[links.size()]); + } - public Link[] getLinks() - { - return links; - } + public Link[] getLinks() { + return links; + } - public static class Serializer extends JsonSerializer - { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) throws IOException, JsonProcessingException - { - jsonGen.writeStartArray(); - for (final Link link : links.getLinks()) { - jsonGen.writeString(link.toString()); - } - jsonGen.writeEndArray(); - } + @Override + public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) + throws IOException, JsonProcessingException { + jsonGen.writeStartArray(); + for (final Link link : links.getLinks()) { + jsonGen.writeString(link.toString()); + } + jsonGen.writeEndArray(); + } - } + } - public static class Deserializer extends JsonDeserializer - { + public static class Deserializer extends JsonDeserializer { - @Override - public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException - { - final List binds = new ArrayList(); - final ObjectCodec oc = jsonParser.getCodec(); - final JsonNode node = oc.readTree(jsonParser); - for (final Iterator it = node.elements(); it.hasNext();) { + @Override + public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + final List binds = new ArrayList(); + final ObjectCodec oc = jsonParser.getCodec(); + final JsonNode node = oc.readTree(jsonParser); + for (final Iterator it = node.elements(); it.hasNext();) { - final JsonNode element = it.next(); - if (!element.equals(NullNode.getInstance())) { - binds.add(Link.parse(element.asText())); - } - } - return new Links(binds.toArray(new Link[0])); - } - } + final JsonNode element = it.next(); + if (!element.equals(NullNode.getInstance())) { + binds.add(Link.parse(element.asText())); + } + } + return new Links(binds.toArray(new Link[0])); + } + } } diff --git a/src/main/java/com/github/dockerjava/api/model/LxcConf.java b/src/main/java/com/github/dockerjava/api/model/LxcConf.java index 67ce00cac..f97588308 100644 --- a/src/main/java/com/github/dockerjava/api/model/LxcConf.java +++ b/src/main/java/com/github/dockerjava/api/model/LxcConf.java @@ -3,36 +3,36 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class LxcConf { - @JsonProperty("Key") - public String key; + @JsonProperty("Key") + public String key; - @JsonProperty("Value") - public String value; + @JsonProperty("Value") + public String value; - public LxcConf(String key, String value) { - this.key = key; - this.value = value; - } + public LxcConf(String key, String value) { + this.key = key; + this.value = value; + } - public LxcConf() { - } + public LxcConf() { + } - public String getKey() { - return key; - } + public String getKey() { + return key; + } - public LxcConf setKey(String key) { - this.key = key; - return this; - } + public LxcConf setKey(String key) { + this.key = key; + return this; + } - public String getValue() { - return value; - } + public String getValue() { + return value; + } - public LxcConf setValue(String value) { - this.value = value; - return this; - } + public LxcConf setValue(String value) { + this.value = value; + return this; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java index 13c91bdb1..355e83aa3 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -8,75 +8,70 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * In a {@link PortBinding}, a network socket on the Docker host, expressed - * as a {@link Binding}, is bound to an {@link ExposedPort} of a container. - * A {@link PortBinding} corresponds to the --publish - * (-p) option of the docker run (and similar) - * CLI command for adding port bindings to a container. + * In a {@link PortBinding}, a network socket on the Docker host, expressed as a {@link Binding}, is bound to an + * {@link ExposedPort} of a container. A {@link PortBinding} corresponds to the --publish (-p) + * option of the docker run (and similar) CLI command for adding port bindings to a container. *

- * Note: This is an abstraction used for creating new port bindings. - * It is not to be confused with the abstraction used for querying existing - * port bindings from a container configuration in - * {@link NetworkSettings#getPorts()} and {@link HostConfig#getPortBindings()}. - * In that context, a Map<ExposedPort, Binding[]> is used. + * Note: This is an abstraction used for creating new port bindings. It is not to be confused with the abstraction + * used for querying existing port bindings from a container configuration in {@link NetworkSettings#getPorts()} and + * {@link HostConfig#getPortBindings()}. In that context, a Map<ExposedPort, Binding[]> is used. */ public class PortBinding { - private final Binding binding; - private final ExposedPort exposedPort; + private final Binding binding; - public PortBinding(Binding binding, ExposedPort exposedPort) { - this.binding = binding; - this.exposedPort = exposedPort; - } + private final ExposedPort exposedPort; - public Binding getBinding() { - return binding; - } + public PortBinding(Binding binding, ExposedPort exposedPort) { + this.binding = binding; + this.exposedPort = exposedPort; + } - public ExposedPort getExposedPort() { - return exposedPort; - } + public Binding getBinding() { + return binding; + } - public static PortBinding parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = StringUtils.splitByWholeSeparator(serialized, ":"); - switch (parts.length) { - case 3: - // 127.0.0.1:80:8080/tcp - return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); - case 2: - // 80:8080 // 127.0.0.1::8080 - return createFromSubstrings(parts[0], parts[1]); - case 1: - // 8080 - return createFromSubstrings("", parts[0]); - default: - throw new IllegalArgumentException(); - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing PortBinding '" - + serialized + "'", e); - } - } + public ExposedPort getExposedPort() { + return exposedPort; + } - private static PortBinding createFromSubstrings(String binding, String exposedPort) - throws IllegalArgumentException { - return new PortBinding(Binding.parse(binding), ExposedPort.parse(exposedPort)); - } + public static PortBinding parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = StringUtils.splitByWholeSeparator(serialized, ":"); + switch (parts.length) { + case 3: + // 127.0.0.1:80:8080/tcp + return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); + case 2: + // 80:8080 // 127.0.0.1::8080 + return createFromSubstrings(parts[0], parts[1]); + case 1: + // 8080 + return createFromSubstrings("", parts[0]); + default: + throw new IllegalArgumentException(); + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing PortBinding '" + serialized + "'", e); + } + } - @Override - public boolean equals(Object obj) { - if (obj instanceof PortBinding) { - PortBinding other = (PortBinding) obj; - return new EqualsBuilder().append(binding, other.getBinding()) - .append(exposedPort, other.getExposedPort()).isEquals(); - } else - return super.equals(obj); - } + private static PortBinding createFromSubstrings(String binding, String exposedPort) throws IllegalArgumentException { + return new PortBinding(Binding.parse(binding), ExposedPort.parse(exposedPort)); + } - @Override - public int hashCode() { - return new HashCodeBuilder().append(binding).append(exposedPort).toHashCode(); - } + @Override + public boolean equals(Object obj) { + if (obj instanceof PortBinding) { + PortBinding other = (PortBinding) obj; + return new EqualsBuilder().append(binding, other.getBinding()).append(exposedPort, other.getExposedPort()) + .isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(binding).append(exposedPort).toHashCode(); + } } 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 0c2df94ad..13c6ff649 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -28,13 +28,10 @@ import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; /** - * A container for port bindings, made available as a {@link Map} via its - * {@link #getBindings()} method. - *

- * Note: This is an abstraction used for querying existing port bindings from - * a container configuration. - * It is not to be confused with the {@link PortBinding} abstraction used for - * adding new port bindings to a container. + * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. + *

+ * Note: This is an abstraction used for querying existing port bindings from a container configuration. It is not to + * be confused with the {@link PortBinding} abstraction used for adding new port bindings to a container. * * @see HostConfig#getPortBindings() * @see NetworkSettings#getPorts() @@ -46,29 +43,27 @@ public class Ports { private final Map ports = new HashMap(); /** - * Creates a {@link Ports} object with no {@link PortBinding}s. - * Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} - * to add {@link PortBinding}s. + * Creates a {@link Ports} object with no {@link PortBinding}s. Use {@link #bind(ExposedPort, Binding)} or + * {@link #add(PortBinding...)} to add {@link PortBinding}s. */ - public Ports() { } + public Ports() { + } /** - * Creates a {@link Ports} object with an initial {@link PortBinding} for - * the specified {@link ExposedPort} and {@link Binding}. - * Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} - * to add more {@link PortBinding}s. + * Creates a {@link Ports} object with an initial {@link PortBinding} for the specified {@link ExposedPort} and + * {@link Binding}. Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} to add more + * {@link PortBinding}s. */ public Ports(ExposedPort exposedPort, Binding host) { - bind(exposedPort, host); + bind(exposedPort, host); } - + public Ports(PortBinding... portBindings) { - add(portBindings); + add(portBindings); } /** - * Adds a new {@link PortBinding} for the specified {@link ExposedPort} and - * {@link Binding} to the current bindings. + * Adds a new {@link PortBinding} for the specified {@link ExposedPort} and {@link Binding} to the current bindings. */ public void bind(ExposedPort exposedPort, Binding binding) { if (ports.containsKey(exposedPort)) { @@ -78,13 +73,13 @@ public void bind(ExposedPort exposedPort, Binding binding) { if (binding == null) { ports.put(exposedPort, null); } else { - ports.put(exposedPort, new Binding[]{binding}); + ports.put(exposedPort, new Binding[] { binding }); } } } /** - * Adds the specified {@link PortBinding}(s) to the list of {@link PortBinding}s. + * Adds the specified {@link PortBinding}(s) to the list of {@link PortBinding}s. */ public void add(PortBinding... portBindings) { for (PortBinding binding : portBindings) { @@ -93,54 +88,48 @@ public void add(PortBinding... portBindings) { } @Override - public String toString(){ + public String toString() { return ports.toString(); } /** - * Returns the port bindings in the format used by the Docker remote API, - * i.e. the {@link Binding}s grouped by {@link ExposedPort}. + * Returns the port bindings in the format used by the Docker remote API, i.e. the {@link Binding}s grouped by + * {@link ExposedPort}. * - * @return the port bindings as a {@link Map} that contains one or more - * {@link Binding}s per {@link ExposedPort}. + * @return the port bindings as a {@link Map} that contains one or more {@link Binding}s per {@link ExposedPort}. */ - public Map getBindings(){ + public Map getBindings() { return ports; } - -// public PortBinding[] getBindingsAsArray() { -// List bindings = new ArrayList<>(); -// for(Map.Entry entry: ports.entrySet()) { -// for(Ports.Binding binding : entry.getValue()) { -// bindings.add(new PortBinding(binding, entry.getKey())); -// } -// } -// return bindings.toArray(new PortBinding[bindings.size()]); -// } + + // public PortBinding[] getBindingsAsArray() { + // List bindings = new ArrayList<>(); + // for(Map.Entry entry: ports.entrySet()) { + // for(Ports.Binding binding : entry.getValue()) { + // bindings.add(new PortBinding(binding, entry.getKey())); + // } + // } + // return bindings.toArray(new PortBinding[bindings.size()]); + // } /** * Creates a {@link Binding} for the given IP address and port number. */ public static Binding Binding(String hostIp, Integer hostPort) { - return new Binding(hostIp, hostPort); + return new Binding(hostIp, hostPort); } /** - * Creates a {@link Binding} for the given port number, leaving the - * IP address undefined. + * Creates a {@link Binding} for the given port number, leaving the IP address undefined. */ public static Binding Binding(Integer hostPort) { - return new Binding(hostPort); + return new Binding(hostPort); } - /** - * A {@link Binding} represents a socket on the Docker host that is - * used in a {@link PortBinding}. - * It is characterized by an {@link #getHostIp() IP address} and a - * {@link #getHostPort() port number}. - * Both properties may be null in order to let Docker assign - * them dynamically/using defaults. + * A {@link Binding} represents a socket on the Docker host that is used in a {@link PortBinding}. It is + * characterized by an {@link #getHostIp() IP address} and a {@link #getHostPort() port number}. Both properties may + * be null in order to let Docker assign them dynamically/using defaults. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -152,8 +141,8 @@ public static class Binding { private final Integer hostPort; /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address} - * and {@link #getHostPort() port number}. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address} and {@link #getHostPort() port + * number}. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -164,8 +153,8 @@ public Binding(String hostIp, Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostPort() port number}, - * leaving the {@link #getHostIp() IP address} undefined. + * Creates a {@link Binding} for the given {@link #getHostPort() port number}, leaving the {@link #getHostIp() + * IP address} undefined. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -175,33 +164,31 @@ public Binding(Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, - * leaving the {@link #getHostPort() port number} undefined. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, leaving the {@link #getHostPort() + * port number} undefined. */ public Binding(String hostIp) { this(hostIp, null); } /** - * Creates a {@link Binding} with both {@link #getHostIp() IP address} and - * {@link #getHostPort() port number} undefined. + * Creates a {@link Binding} with both {@link #getHostIp() IP address} and {@link #getHostPort() port number} + * undefined. */ public Binding() { this(null, null); } /** - * @return the IP address on the Docker host. - * May be null, in which case Docker will bind the - * port to all interfaces (0.0.0.0). + * @return the IP address on the Docker host. May be null, in which case Docker will bind the port + * to all interfaces (0.0.0.0). */ public String getHostIp() { return hostIp; } /** - * @return the port number on the Docker host. - * May be null, in which case Docker will dynamically + * @return the port number on the Docker host. May be null, in which case Docker will dynamically * assign a port. */ public Integer getHostPort() { @@ -209,15 +196,15 @@ public Integer getHostPort() { } /** - * Parses a textual host and port specification (as used by the Docker CLI) - * to a {@link Binding}. + * Parses a textual host and port specification (as used by the Docker CLI) to a {@link Binding}. *

* Legal syntax: IP|IP:port|port * - * @param serialized serialized the specification, e.g. - * 127.0.0.1:80 + * @param serialized + * serialized the specification, e.g. 127.0.0.1:80 * @return a {@link Binding} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed + * @throws IllegalArgumentException + * if the specification cannot be parsed */ public static Binding parse(String serialized) throws IllegalArgumentException { try { @@ -231,23 +218,20 @@ public static Binding parse(String serialized) throws IllegalArgumentException { return new Binding(parts[0], Integer.valueOf(parts[1])); } case 1: { - return parts[0].contains(".") ? new Binding(parts[0]) - : new Binding(Integer.valueOf(parts[0])); + return parts[0].contains(".") ? new Binding(parts[0]) : new Binding(Integer.valueOf(parts[0])); } default: { throw new IllegalArgumentException(); } } } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Binding '" - + serialized + "'"); + throw new IllegalArgumentException("Error parsing Binding '" + serialized + "'"); } } /** - * Returns a string representation of this {@link Binding} suitable - * for inclusion in a JSON message. - * The format is [IP:]Port, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link Binding} suitable for inclusion in a JSON message. The format + * is [IP:]Port, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link Binding} */ @@ -256,7 +240,7 @@ public String toString() { if (isEmpty(hostIp)) { return Integer.toString(hostPort); } else if (hostPort == null) { - return hostIp; + return hostIp; } else { return hostIp + ":" + hostPort; } @@ -264,20 +248,19 @@ public String toString() { @Override public boolean equals(Object obj) { - if(obj instanceof Binding) { - Binding other = (Binding) obj; - return new EqualsBuilder() - .append(hostIp, other.getHostIp()) - .append(hostPort, other.getHostPort()).isEquals(); - } else - return super.equals(obj); + if (obj instanceof Binding) { + Binding other = (Binding) obj; + return new EqualsBuilder().append(hostIp, other.getHostIp()).append(hostPort, other.getHostPort()) + .isEquals(); + } else + return super.equals(obj); } } - public static class Deserializer extends JsonDeserializer { @Override - public Ports deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Ports deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { Ports out = new Ports(); ObjectCodec oc = jsonParser.getCodec(); @@ -306,18 +289,19 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali public static class Serializer extends JsonSerializer { @Override - public void serialize(Ports portBindings, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, JsonProcessingException { + public void serialize(Ports portBindings, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { jsonGen.writeStartObject(); - for(Entry entry : portBindings.getBindings().entrySet()){ + for (Entry entry : portBindings.getBindings().entrySet()) { jsonGen.writeFieldName(entry.getKey().toString()); 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.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort() + .toString()); jsonGen.writeEndObject(); } jsonGen.writeEndArray(); diff --git a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java index 4a3a0b507..cd49e846e 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java @@ -9,12 +9,12 @@ /** * Represents an item returned from pull */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class PullEventStreamItem implements Serializable { - private static final long serialVersionUID = -5187169652557467828L; + private static final long serialVersionUID = -5187169652557467828L; - @JsonProperty("status") + @JsonProperty("status") private String status; @JsonProperty("progress") @@ -23,7 +23,6 @@ public class PullEventStreamItem implements Serializable { @JsonProperty("progressDetail") private ProgressDetail progressDetail; - public String getStatus() { return status; } @@ -36,12 +35,11 @@ public ProgressDetail getProgressDetail() { return progressDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ProgressDetail implements Serializable { @JsonProperty("current") int current; - @Override public String toString() { return "current " + current; @@ -50,10 +48,7 @@ public String toString() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("status", status) - .add("progress", progress) - .add("progressDetail", progressDetail) - .toString(); + return Objects.toStringHelper(this).add("status", status).add("progress", progress) + .add("progressDetail", progressDetail).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index c8aac4c9c..e022f0c1a 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -10,12 +10,12 @@ /** * Represents an item returned from push */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class PushEventStreamItem implements Serializable { - private static final long serialVersionUID = -5187169652557467828L; + private static final long serialVersionUID = -5187169652557467828L; - @JsonProperty("status") + @JsonProperty("status") private String status; @JsonProperty("progress") @@ -24,7 +24,6 @@ public class PushEventStreamItem implements Serializable { @JsonProperty("progressDetail") private ProgressDetail progressDetail; - public String getStatus() { return status; } @@ -37,12 +36,11 @@ public ProgressDetail getProgressDetail() { return progressDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ProgressDetail implements Serializable { @JsonProperty("current") int current; - @Override public String toString() { return "current " + current; @@ -51,10 +49,7 @@ public String toString() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("status", status) - .add("progress", progress) - .add("progressDetail", progressDetail) - .toString(); + return Objects.toStringHelper(this).add("status", status).add("progress", progress) + .add("progressDetail", progressDetail).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/Repository.java b/src/main/java/com/github/dockerjava/api/model/Repository.java index 673eabee2..cdfead739 100644 --- a/src/main/java/com/github/dockerjava/api/model/Repository.java +++ b/src/main/java/com/github/dockerjava/api/model/Repository.java @@ -13,15 +13,17 @@ public class Repository { /** * Name may be eg. 'busybox' or '10.0.0.1:5000/fred' - * @param name Repository name + * + * @param name + * Repository name */ public Repository(String name) { this.name = name; } /** - * Return the URL portion (repository). - * Note that this might not actually BE a repository location. + * Return the URL portion (repository). Note that this might not actually BE a repository location. + * * @return * @throws java.net.MalformedURLException */ @@ -31,16 +33,13 @@ public URL getURL() throws MalformedURLException { @Override public String toString() { - return Objects.toStringHelper(this) - .add("name", name) - .toString(); + return Objects.toStringHelper(this).add("name", name).toString(); } - public String getPath() { - if( !name.contains("/") ) + if (!name.contains("/")) return name; - return name.substring(name.indexOf("/") + 1 ); + return name.substring(name.indexOf("/") + 1); } } diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index bb933f18a..e96821cf1 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -11,15 +11,17 @@ * Container restart policy * *

- *
no
- *
Do not restart the container if it dies. (default)
- * - *
on-failure
- *
Restart the container if it exits with a non-zero exit code. - * Can also accept an optional maximum restart count (e.g. on-failure:5).
- * - *
always
- *
Always restart the container no matter what exit code is returned.
+ *
no
+ *
Do not restart the container if it dies. (default)
+ * + *
on-failure
+ *
Restart the container if it exits with a non-zero exit code. Can also accept an optional maximum restart count + * (e.g. on-failure:5). + *
+ * + *
always
+ *
Always restart the container no matter what exit code is returned. + *
*
* * @author marcus @@ -27,110 +29,108 @@ */ public class RestartPolicy { - @JsonProperty("MaximumRetryCount") - private int maximumRetryCount = 0; - - @JsonProperty("Name") - private String name = ""; - - public RestartPolicy() { - } - - private RestartPolicy(int maximumRetryCount, String name) { - checkNotNull(name, "name is null"); - this.maximumRetryCount = maximumRetryCount; - this.name = name; - } - - /** - * Do not restart the container if it dies. (default) - */ - public static RestartPolicy noRestart() { - return new RestartPolicy(); - } - - /** - * Always restart the container no matter what exit code is returned. - */ - public static RestartPolicy alwaysRestart() { - return new RestartPolicy(0, "always"); - } - - /** - * Restart the container if it exits with a non-zero exit code. - * - * @param maximumRetryCount the maximum number of restarts. - * Set to 0 for unlimited retries. - */ - public static RestartPolicy onFailureRestart(int maximumRetryCount) { - return new RestartPolicy(maximumRetryCount, "on-failure"); - } - - public int getMaximumRetryCount() { - return maximumRetryCount; - } - - public String getName() { - return name; - } - - /** - * Parses a textual restart polixy specification (as used by the Docker CLI) - * to a {@link RestartPolicy}. - * - * @param serialized the specification, e.g. on-failure:2 - * @return a {@link RestartPolicy} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static RestartPolicy parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = serialized.split(":"); - String name = parts[0]; - if ("no".equals(name)) - return noRestart(); - if ("always".equals(name)) - return alwaysRestart(); - if ("on-failure".equals(name)) { - int count = 0; - if (parts.length == 2) { - count = Integer.parseInt(parts[1]); - } - return onFailureRestart(count); - } - throw new IllegalArgumentException(); - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); - } - } - - /** - * Returns a string representation of this {@link RestartPolicy}. - * The format is name[:count], like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link RestartPolicy} - */ - @Override - public String toString() { - String result = name.isEmpty() ? "no" : name; - return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof RestartPolicy) { - RestartPolicy other = (RestartPolicy) obj; - return new EqualsBuilder() - .append(maximumRetryCount, other.getMaximumRetryCount()) - .append(name, other.getName()) - .isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(maximumRetryCount) - .append(name).toHashCode(); - } + @JsonProperty("MaximumRetryCount") + private int maximumRetryCount = 0; + + @JsonProperty("Name") + private String name = ""; + + public RestartPolicy() { + } + + private RestartPolicy(int maximumRetryCount, String name) { + checkNotNull(name, "name is null"); + this.maximumRetryCount = maximumRetryCount; + this.name = name; + } + + /** + * Do not restart the container if it dies. (default) + */ + public static RestartPolicy noRestart() { + return new RestartPolicy(); + } + + /** + * Always restart the container no matter what exit code is returned. + */ + public static RestartPolicy alwaysRestart() { + return new RestartPolicy(0, "always"); + } + + /** + * Restart the container if it exits with a non-zero exit code. + * + * @param maximumRetryCount + * the maximum number of restarts. Set to 0 for unlimited retries. + */ + public static RestartPolicy onFailureRestart(int maximumRetryCount) { + return new RestartPolicy(maximumRetryCount, "on-failure"); + } + + public int getMaximumRetryCount() { + return maximumRetryCount; + } + + public String getName() { + return name; + } + + /** + * Parses a textual restart polixy specification (as used by the Docker CLI) to a {@link RestartPolicy}. + * + * @param serialized + * the specification, e.g. on-failure:2 + * @return a {@link RestartPolicy} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static RestartPolicy parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split(":"); + String name = parts[0]; + if ("no".equals(name)) + return noRestart(); + if ("always".equals(name)) + return alwaysRestart(); + if ("on-failure".equals(name)) { + int count = 0; + if (parts.length == 2) { + count = Integer.parseInt(parts[1]); + } + return onFailureRestart(count); + } + throw new IllegalArgumentException(); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link RestartPolicy}. The format is name[:count], like the + * argument in {@link #parse(String)}. + * + * @return a string representation of this {@link RestartPolicy} + */ + @Override + public String toString() { + String result = name.isEmpty() ? "no" : name; + return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RestartPolicy) { + RestartPolicy other = (RestartPolicy) obj; + return new EqualsBuilder().append(maximumRetryCount, other.getMaximumRetryCount()) + .append(name, other.getName()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(maximumRetryCount).append(name).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java index ff1d6dc95..f6acf16ee 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -12,38 +12,38 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public class Statistics { - + @JsonProperty("read") private String read; - + @JsonProperty("network") - private Map networkStats; + private Map networkStats; @JsonProperty("memory_stats") - private Map memoryStats; - + private Map memoryStats; + @JsonProperty("blkio_stats") - private Map blkioStats; - + private Map blkioStats; + @JsonProperty("cpu_stats") - private Map cpuStats; + private Map cpuStats; - public Map getNetworkStats() { + public Map getNetworkStats() { return networkStats; } - - public Map getCpuStats() { + + public Map getCpuStats() { return cpuStats; } - - public Map getMemoryStats() { + + public Map getMemoryStats() { return memoryStats; } - - public Map getBlkioStats() { + + public Map getBlkioStats() { return blkioStats; } - + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/model/StreamType.java b/src/main/java/com/github/dockerjava/api/model/StreamType.java index eb11c5536..3f8167b05 100644 --- a/src/main/java/com/github/dockerjava/api/model/StreamType.java +++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java @@ -1,7 +1,5 @@ package com.github.dockerjava.api.model; public enum StreamType { - STDIN, - STDOUT, - STDERR + STDIN, STDOUT, STDERR } diff --git a/src/main/java/com/github/dockerjava/api/model/Ulimit.java b/src/main/java/com/github/dockerjava/api/model/Ulimit.java index d5fac09c1..3d8fc432f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -12,7 +12,7 @@ public class Ulimit { @JsonProperty("Name") - private String name ; + private String name; @JsonProperty("Soft") private int soft; @@ -48,9 +48,7 @@ public int getHard() { public boolean equals(Object obj) { if (obj instanceof Ulimit) { Ulimit other = (Ulimit) obj; - return new EqualsBuilder() - .append(name, other.getName()) - .append(soft, other.getSoft()) + return new EqualsBuilder().append(name, other.getName()).append(soft, other.getSoft()) .append(hard, other.getHard()).isEquals(); } else return super.equals(obj); diff --git a/src/main/java/com/github/dockerjava/api/model/Version.java b/src/main/java/com/github/dockerjava/api/model/Version.java index 4e02e2c05..3318fc5b1 100644 --- a/src/main/java/com/github/dockerjava/api/model/Version.java +++ b/src/main/java/com/github/dockerjava/api/model/Version.java @@ -12,25 +12,25 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Version { - @JsonProperty("ApiVersion") - private String apiVersion; + @JsonProperty("ApiVersion") + private String apiVersion; - @JsonProperty("Arch") - private String arch; + @JsonProperty("Arch") + private String arch; - @JsonProperty("GitCommit") - private String gitCommit; + @JsonProperty("GitCommit") + private String gitCommit; - @JsonProperty("GoVersion") - private String goVersion; + @JsonProperty("GoVersion") + private String goVersion; - @JsonProperty("KernelVersion") - private String kernelVersion; + @JsonProperty("KernelVersion") + private String kernelVersion; - @JsonProperty("Os") - private String operatingSystem; + @JsonProperty("Os") + private String operatingSystem; - @JsonProperty("Version") + @JsonProperty("Version") private String version; public String getVersion() { @@ -53,13 +53,13 @@ public String getArch() { return arch; } - public String getOperatingSystem() { + public String getOperatingSystem() { return operatingSystem; } public String getApiVersion() { - return apiVersion; - } + return apiVersion; + } @Override public String 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 131a9a56f..8bc7f2fba 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -26,33 +26,33 @@ */ public class Volume { - private String path; - - public Volume(String path) { - this.path = path; - } - - public String getPath() { - return path; - } - - @Override - public String toString() { - return getPath(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Volume) { - Volume other = (Volume) obj; - return new EqualsBuilder().append(path, other.getPath()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(path).toHashCode(); - } + private String path; + + public Volume(String path) { + this.path = path; + } + + public String getPath() { + return path; + } + + @Override + public String toString() { + return getPath(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Volume) { + Volume other = (Volume) obj; + return new EqualsBuilder().append(path, other.getPath()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(path).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java index 41028b6dc..cf9c077ab 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java @@ -2,9 +2,10 @@ public class VolumeBind { private final String hostPath; + private final String containerPath; - public VolumeBind(String hostPath, String containerPath){ + public VolumeBind(String hostPath, String containerPath) { this.hostPath = hostPath; this.containerPath = containerPath; } 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 e23ddc9e8..3d2abee45 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java @@ -36,18 +36,20 @@ public VolumeBind[] getBinds() { public static final class Serializer extends JsonSerializer { @Override - public void serialize(VolumeBinds value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + 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 { + public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { List binds = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); @@ -56,10 +58,11 @@ public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext des Map.Entry field = it.next(); JsonNode value = field.getValue(); if (!value.equals(NullNode.getInstance())) { - if (!value.isTextual()){ - throw deserializationContext.mappingException("Expected path for '"+field.getKey()+"'in host but got '"+ value+"'."); + if (!value.isTextual()) { + throw deserializationContext.mappingException("Expected path for '" + field.getKey() + + "'in host but got '" + value + "'."); } - VolumeBind bind = new VolumeBind(value.asText(),field.getKey()); + VolumeBind bind = new VolumeBind(value.asText(), field.getKey()); binds.add(bind); } } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java index 717385d9e..09a2d8d6a 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -28,88 +28,82 @@ @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; - } - } - } - - + 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 b85536e10..434a0edad 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -19,58 +19,57 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = Volumes.Serializer.class) @JsonDeserialize(using = Volumes.Deserializer.class) public class Volumes { - private Volume[] volumes; + private Volume[] volumes; + + public Volumes(Volume... volumes) { + this.volumes = volumes; + } - public Volumes(Volume... volumes) { - this.volumes = volumes; - } - - public Volumes(List volumes) { - this.volumes = volumes.toArray(new Volume[volumes.size()]); - } + public Volumes(List volumes) { + this.volumes = volumes.toArray(new Volume[volumes.size()]); + } - public Volume[] getVolumes() { - return volumes; - } + public Volume[] getVolumes() { + return volumes; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(Volumes volumes, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - for (Volume volume : volumes.getVolumes()) { - jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - //jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); - } - jsonGen.writeEndObject(); - } + @Override + public void serialize(Volumes volumes, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + for (Volume volume : volumes.getVolumes()) { + jsonGen.writeFieldName(volume.getPath()); + jsonGen.writeStartObject(); + jsonGen.writeEndObject(); + // jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); + } + jsonGen.writeEndObject(); + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public Volumes deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Volumes deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List volumes = new ArrayList(); + List volumes = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - String path = field.getKey(); - Volume volume = new Volume(path); - volumes.add(volume); + String path = field.getKey(); + Volume volume = new Volume(path); + volumes.add(volume); } } return new Volumes(volumes.toArray(new Volume[0])); diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java index 9aae9f30b..c884a633e 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -21,109 +21,104 @@ @JsonDeserialize(using = VolumesFrom.Deserializer.class) public class VolumesFrom { - private String container; - - private AccessMode accessMode; - - public VolumesFrom(String container) { - this(container, AccessMode.DEFAULT); - } - - public VolumesFrom(String container, AccessMode accessMode) { - this.container = container; - this.accessMode = accessMode; - } - - public String getContainer() { - return container; - } - - public AccessMode getAccessMode() { - return accessMode; - } - - - /** - * Parses a volume from specification to a {@link VolumesFrom}. - * - * @param serialized the specification, e.g. container:ro - * @return a {@link VolumesFrom} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static VolumesFrom parse(String serialized) { - try { - String[] parts = serialized.split(":"); - switch (parts.length) { - case 1: { - return new VolumesFrom(parts[0]); - } - case 2: { - return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); - } - - default: { - throw new IllegalArgumentException(); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Bind '" + serialized - + "'"); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof VolumesFrom) { - VolumesFrom other = (VolumesFrom) obj; - return new EqualsBuilder().append(container, other.getContainer()) - .append(accessMode, other.getAccessMode()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(container) - .append(accessMode).toHashCode(); - } - - /** - * Returns a string representation of this {@link VolumesFrom} suitable - * for inclusion in a JSON message. - * The format is <container>:<access mode>, - * like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link VolumesFrom} - */ - @Override - public String toString() { - return container + ":" + accessMode.toString(); - } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeString(volumeFrom.toString()); - - } - - } - - public static class Deserializer extends JsonDeserializer { - @Override - public VolumesFrom deserialize(JsonParser jsonParser, - DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - return VolumesFrom.parse(node.asText()); - - } - } + private String container; + + private AccessMode accessMode; + + public VolumesFrom(String container) { + this(container, AccessMode.DEFAULT); + } + + public VolumesFrom(String container, AccessMode accessMode) { + this.container = container; + this.accessMode = accessMode; + } + + public String getContainer() { + return container; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + /** + * Parses a volume from specification to a {@link VolumesFrom}. + * + * @param serialized + * the specification, e.g. container:ro + * @return a {@link VolumesFrom} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static VolumesFrom parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 1: { + return new VolumesFrom(parts[0]); + } + case 2: { + return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); + } + + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VolumesFrom) { + VolumesFrom other = (VolumesFrom) obj; + return new EqualsBuilder().append(container, other.getContainer()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(container).append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link VolumesFrom} suitable for inclusion in a JSON message. The format + * is <container>:<access mode>, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link VolumesFrom} + */ + @Override + public String toString() { + return container + ":" + accessMode.toString(); + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeString(volumeFrom.toString()); + + } + + } + + public static class Deserializer extends JsonDeserializer { + @Override + public VolumesFrom deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + return VolumesFrom.parse(node.asText()); + + } + } } 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 a898ed57f..4a017d162 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java @@ -36,34 +36,36 @@ public VolumeRW[] getVolumesRW() { public static final class Serializer extends JsonSerializer { @Override - public void serialize(VolumesRW value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + 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 { + 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+"'."); + 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); } diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java index 862259a8e..6b5bdb055 100644 --- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java @@ -18,7 +18,10 @@ public class AuthConfigFile { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final TypeReference> CONFIG_MAP_TYPE = new TypeReference>() {}; + + private static final TypeReference> CONFIG_MAP_TYPE = new TypeReference>() { + }; + private final Map authConfigMap; public AuthConfigFile() { @@ -53,7 +56,7 @@ public AuthConfig resolveAuthConfig(String hostname) { public AuthConfigurations getAuthConfigurations() { final AuthConfigurations authConfigurations = new AuthConfigurations(); - for(Map.Entry authConfigEntry : authConfigMap.entrySet()) { + for (Map.Entry authConfigEntry : authConfigMap.entrySet()) { authConfigurations.addConfig(authConfigEntry.getValue()); } @@ -90,7 +93,6 @@ public String toString() { return "AuthConfigFile [authConfigMap=" + authConfigMap + "]"; } - public static AuthConfigFile loadConfig(File confFile) throws IOException { AuthConfigFile configFile = new AuthConfigFile(); if (!confFile.exists()) { diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 6b19a201f..5abb82bd7 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -25,117 +25,118 @@ import org.bouncycastle.openssl.PEMParser; public class CertificateUtils { - + public static boolean verifyCertificatesExist(String dockerCertPath) { - String[] files = {"ca.pem", "cert.pem", "key.pem"}; + String[] files = { "ca.pem", "cert.pem", "key.pem" }; for (String file : files) { File path = new File(dockerCertPath, file); boolean exists = path.exists(); - if(!exists) { + if (!exists) { return false; } } - + return true; } - - public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, CertificateException, KeyStoreException { + + public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException, + InvalidKeySpecException, IOException, CertificateException, KeyStoreException { KeyPair keyPair = loadPrivateKey(dockerCertPath); Certificate privateCertificate = loadCertificate(dockerCertPath); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(null); - keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), new Certificate[]{privateCertificate}); + keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), + new Certificate[] { privateCertificate }); return keyStore; } - - public static KeyStore createTrustStore(final String dockerCertPath) throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException { + + public static KeyStore createTrustStore(final String dockerCertPath) throws IOException, CertificateException, + KeyStoreException, NoSuchAlgorithmException { File caPath = new File(dockerCertPath, "ca.pem"); BufferedReader reader = new BufferedReader(new FileReader(caPath)); PEMParser pemParser = null; - + try { pemParser = new PEMParser(reader); X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); - Certificate caCertificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); - + Certificate caCertificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate( + certificateHolder); + KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(null); trustStore.setCertificateEntry("ca", caCertificate); return trustStore; - - } - finally { - if(pemParser != null) { + + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - if(reader != null) { + if (reader != null) { IOUtils.closeQuietly(reader); } } - + } - + private static Certificate loadCertificate(final String dockerCertPath) throws IOException, CertificateException { File certificate = new File(dockerCertPath, "cert.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; - + try { - pemParser = new PEMParser(reader); - X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); - return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); - } - finally { - if(pemParser != null) { + pemParser = new PEMParser(reader); + X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); + return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - - if(reader != null) { + + if (reader != null) { IOUtils.closeQuietly(reader); } } - + } - - private static KeyPair loadPrivateKey(final String dockerCertPath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { + + private static KeyPair loadPrivateKey(final String dockerCertPath) throws IOException, NoSuchAlgorithmException, + InvalidKeySpecException { File certificate = new File(dockerCertPath, "key.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; - + try { - pemParser = new PEMParser(reader); - - PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject(); - - byte[] pemPrivateKeyEncoded = pemKeyPair.getPrivateKeyInfo().getEncoded(); - byte[] pemPublicKeyEncoded = pemKeyPair.getPublicKeyInfo().getEncoded(); + pemParser = new PEMParser(reader); - KeyFactory factory = KeyFactory.getInstance("RSA"); + PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject(); - X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pemPublicKeyEncoded); - PublicKey publicKey = factory.generatePublic(publicKeySpec); + byte[] pemPrivateKeyEncoded = pemKeyPair.getPrivateKeyInfo().getEncoded(); + byte[] pemPublicKeyEncoded = pemKeyPair.getPublicKeyInfo().getEncoded(); - PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pemPrivateKeyEncoded); - PrivateKey privateKey = factory.generatePrivate(privateKeySpec); + KeyFactory factory = KeyFactory.getInstance("RSA"); - return new KeyPair(publicKey, privateKey); - - } - finally { - if(pemParser != null) { + X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pemPublicKeyEncoded); + PublicKey publicKey = factory.generatePublic(publicKeySpec); + + PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pemPrivateKeyEncoded); + PrivateKey privateKey = factory.generatePrivate(privateKeySpec); + + return new KeyPair(publicKey, privateKey); + + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - - if(reader != null) { + + if (reader != null) { IOUtils.closeQuietly(reader); } } - } } diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 0afd5171d..b40294487 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -10,7 +10,8 @@ public class CompressArchiveUtil { - public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { + 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)); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 4aa7d5ac7..f906f43d5 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -7,65 +7,62 @@ import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; public class DockerClientBuilder { - - private static ServiceLoader serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class); - - private DockerClientImpl dockerClient = null; - private DockerCmdExecFactory dockerCmdExecFactory = null; - - private DockerClientBuilder(DockerClientImpl dockerClient) { - this.dockerClient = dockerClient; - } - - public static DockerClientBuilder getInstance() { - return new DockerClientBuilder(DockerClientImpl.getInstance()); - } - - public static DockerClientBuilder getInstance(DockerClientConfigBuilder dockerClientConfigBuilder) { - return getInstance(dockerClientConfigBuilder.build()); - } - - public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { - return new DockerClientBuilder(DockerClientImpl - .getInstance(dockerClientConfig)); - } - - public static DockerClientBuilder getInstance(String serverUrl) { - return new DockerClientBuilder(DockerClientImpl - .getInstance(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."); - } - - return serviceLoader.iterator().next(); - } - - public DockerClientBuilder withDockerCmdExecFactory( - DockerCmdExecFactory dockerCmdExecFactory) { - this.dockerCmdExecFactory = dockerCmdExecFactory; - return this; - } - - public DockerClientBuilder withServiceLoaderClassLoader(ClassLoader classLoader) - { - serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class, classLoader); - return this; - } - - public DockerClient build() { - if(dockerCmdExecFactory != null) { - dockerClient.withDockerCmdExecFactory(dockerCmdExecFactory); - } - else { - dockerClient.withDockerCmdExecFactory(getDefaultDockerCmdExecFactory()); - } - - return dockerClient; - } + + private static ServiceLoader serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class); + + private DockerClientImpl dockerClient = null; + + private DockerCmdExecFactory dockerCmdExecFactory = null; + + private DockerClientBuilder(DockerClientImpl dockerClient) { + this.dockerClient = dockerClient; + } + + public static DockerClientBuilder getInstance() { + return new DockerClientBuilder(DockerClientImpl.getInstance()); + } + + public static DockerClientBuilder getInstance(DockerClientConfigBuilder dockerClientConfigBuilder) { + return getInstance(dockerClientConfigBuilder.build()); + } + + public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { + return new DockerClientBuilder(DockerClientImpl.getInstance(dockerClientConfig)); + } + + public static DockerClientBuilder getInstance(String serverUrl) { + return new DockerClientBuilder(DockerClientImpl.getInstance(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."); + } + + return serviceLoader.iterator().next(); + } + + public DockerClientBuilder withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) { + this.dockerCmdExecFactory = dockerCmdExecFactory; + return this; + } + + public DockerClientBuilder withServiceLoaderClassLoader(ClassLoader classLoader) { + serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class, classLoader); + return this; + } + + public DockerClient build() { + if (dockerCmdExecFactory != null) { + dockerClient.withDockerCmdExecFactory(dockerCmdExecFactory); + } else { + dockerClient.withDockerCmdExecFactory(getDefaultDockerCmdExecFactory()); + } + + return dockerClient; + } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 7e0b57b0e..a96f61556 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -20,26 +20,42 @@ public class DockerClientConfig implements Serializable { - private static final long serialVersionUID = -4307357472441531489L; - - private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + private static final long serialVersionUID = -4307357472441531489L; + + private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; + private static final String DOCKER_VERIFY_TLS_PROPERTY = "DOCKER_TLS_VERIFY"; + private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; + private static final String DOCKER_IO_VERSION_PROPERTY = "docker.io.version"; + private static final String DOCKER_IO_USERNAME_PROPERTY = "docker.io.username"; + private static final String DOCKER_IO_PASSWORD_PROPERTY = "docker.io.password"; + private static final String DOCKER_IO_EMAIL_PROPERTY = "docker.io.email"; + private static final String DOCKER_IO_SERVER_ADDRESS_PROPERTY = "docker.io.serverAddress"; + private static final String DOCKER_IO_READ_TIMEOUT_PROPERTY = "docker.io.readTimeout"; + // this is really confusing, as there are two ways to spell it private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; + private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilter"; + private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; + private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; + // connection pooling properties private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; + private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; + /** * A map from the environment name to the interval name. */ @@ -62,19 +78,26 @@ public class DockerClientConfig implements Serializable { } private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; + private URI uri; + private final String version, username, password, email, serverAddress, dockerCfgPath; + private final Integer readTimeout; + private final boolean loggingFilterEnabled; + private final boolean followRedirectsFilterEnabled; + private final SSLConfig sslConfig; - + private final Integer maxTotalConnections; + private final Integer maxPerRouteConnections; DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, boolean followRedirectsFilterEnabled, - SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { + String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, + boolean followRedirectsFilterEnabled, SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -121,14 +144,16 @@ private static String replaceProperties(String s, Properties replacements) { /** * Creates a new Properties object containing values overridden from ${user.home}/.docker.io.properties * - * @param p The original set of properties to override + * @param p + * The original set of properties to override * @return A copy of the original Properties with overridden values */ private static Properties overrideDockerPropertiesWithSettingsFromUserHome(Properties p, Properties systemProperties) { Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - final File usersDockerPropertiesFile = new File(systemProperties.getProperty("user.home"), "." + DOCKER_IO_PROPERTIES_PROPERTY); + final File usersDockerPropertiesFile = new File(systemProperties.getProperty("user.home"), "." + + DOCKER_IO_PROPERTIES_PROPERTY); if (usersDockerPropertiesFile.isFile()) { try { final FileInputStream in = new FileInputStream(usersDockerPropertiesFile); @@ -150,7 +175,8 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, // special case which is a sensible default if (env.containsKey(DOCKER_HOST_PROPERTY)) { - overriddenProperties.setProperty(DOCKER_IO_URL_PROPERTY, env.get(DOCKER_HOST_PROPERTY).replace("tcp", protocol(env))); + overriddenProperties.setProperty(DOCKER_IO_URL_PROPERTY, + env.get(DOCKER_HOST_PROPERTY).replace("tcp", protocol(env))); } for (Map.Entry envEntry : env.entrySet()) { @@ -165,32 +191,26 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, private static String protocol(Map env) { // if this is set, we assume we need SSL - return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" : "http"; + return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" + : "http"; } /** * Creates a new Properties object containing values overridden from the System properties * - * @param p The original set of properties to override + * @param p + * The original set of properties to override * @return A copy of the original Properties with overridden values */ private static Properties overrideDockerPropertiesWithSystemProperties(Properties p, Properties systemProperties) { Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - for (String key : new String[]{ - DOCKER_IO_URL_PROPERTY, - DOCKER_IO_VERSION_PROPERTY, - DOCKER_IO_USERNAME_PROPERTY, - DOCKER_IO_PASSWORD_PROPERTY, - DOCKER_IO_EMAIL_PROPERTY, - DOCKER_IO_SERVER_ADDRESS_PROPERTY, - DOCKER_IO_READ_TIMEOUT_PROPERTY, - DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, - DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, - DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, - DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, - }) { + for (String key : new String[] { DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, + DOCKER_IO_USERNAME_PROPERTY, DOCKER_IO_PASSWORD_PROPERTY, DOCKER_IO_EMAIL_PROPERTY, + DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_READ_TIMEOUT_PROPERTY, + DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, + DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); } @@ -218,8 +238,8 @@ public URI getUri() { } public void setUri(URI uri) { - this.uri = uri; - } + this.uri = uri; + } public String getVersion() { return version; @@ -254,73 +274,67 @@ public boolean followRedirectsFilterEnabled() { } public SSLConfig getSslConfig() { - return sslConfig; + return sslConfig; } public String getDockerCfgPath() { return dockerCfgPath; } - + public Integer getMaxTotalConnections() { - return maxTotalConnections; + return maxTotalConnections; } public Integer getMaxPerRoutConnections() { - return maxPerRouteConnections; + return maxPerRouteConnections; } - + private AuthConfig getAuthConfig() { - AuthConfig authConfig = null; - if (getUsername() != null && getPassword() != null && getEmail() != null - && getServerAddress() != null) { - authConfig = new AuthConfig(); - authConfig.setUsername(getUsername()); - authConfig.setPassword(getPassword()); - authConfig.setEmail(getEmail()); - authConfig.setServerAddress(getServerAddress()); - } - return authConfig; - } - + AuthConfig authConfig = null; + if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { + authConfig = new AuthConfig(); + authConfig.setUsername(getUsername()); + authConfig.setPassword(getPassword()); + authConfig.setEmail(getEmail()); + authConfig.setServerAddress(getServerAddress()); + } + return authConfig; + } + public AuthConfig effectiveAuthConfig(String imageName) { - AuthConfig authConfig = null; - - String dockerCfgFile = getDockerCfgPath(); - - if (dockerCfgFile != null && imageName != null) { - AuthConfigFile authConfigFile; - try { - authConfigFile = AuthConfigFile.loadConfig(new File( - dockerCfgFile)); - } catch (IOException e) { - throw new DockerClientException( - "Failed to parse dockerCfgFile", e); - } - ReposTag reposTag = NameParser.parseRepositoryTag(imageName); - HostnameReposName hostnameReposName = NameParser - .resolveRepositoryName(reposTag.repos); - - authConfig = authConfigFile - .resolveAuthConfig(hostnameReposName.hostname); - } - - AuthConfig _authConfig = getAuthConfig(); - - if(_authConfig != null) authConfig = _authConfig; - - return authConfig; - } + AuthConfig authConfig = null; + + String dockerCfgFile = getDockerCfgPath(); + + if (dockerCfgFile != null && imageName != null) { + AuthConfigFile authConfigFile; + try { + authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); + } catch (IOException e) { + throw new DockerClientException("Failed to parse dockerCfgFile", e); + } + ReposTag reposTag = NameParser.parseRepositoryTag(imageName); + HostnameReposName hostnameReposName = NameParser.resolveRepositoryName(reposTag.repos); + + authConfig = authConfigFile.resolveAuthConfig(hostnameReposName.hostname); + } + + AuthConfig _authConfig = getAuthConfig(); + + if (_authConfig != null) + authConfig = _authConfig; + + return authConfig; + } public AuthConfigurations getAuthConfigurations() { String dockerCfgFile = getDockerCfgPath(); if (dockerCfgFile != null) { AuthConfigFile authConfigFile; try { - authConfigFile = AuthConfigFile.loadConfig(new File( - dockerCfgFile)); + authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); } catch (IOException e) { - throw new DockerClientException( - "Failed to parse dockerCfgFile", e); + throw new DockerClientException("Failed to parse dockerCfgFile", e); } return authConfigFile.getAuthConfigurations(); @@ -329,26 +343,35 @@ public AuthConfigurations getAuthConfigurations() { return new AuthConfigurations(); } - @Override + @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; DockerClientConfig that = (DockerClientConfig) o; - if (loggingFilterEnabled != that.loggingFilterEnabled) return false; + if (loggingFilterEnabled != that.loggingFilterEnabled) + return false; if (sslConfig != null ? !sslConfig.equals(that.sslConfig) : that.sslConfig != null) return false; if (dockerCfgPath != null ? !dockerCfgPath.equals(that.dockerCfgPath) : that.dockerCfgPath != null) return false; - if (email != null ? !email.equals(that.email) : that.email != null) return false; - if (password != null ? !password.equals(that.password) : that.password != null) return false; - if (readTimeout != null ? !readTimeout.equals(that.readTimeout) : that.readTimeout != null) return false; + if (email != null ? !email.equals(that.email) : that.email != null) + return false; + if (password != null ? !password.equals(that.password) : that.password != null) + return false; + if (readTimeout != null ? !readTimeout.equals(that.readTimeout) : that.readTimeout != null) + return false; if (serverAddress != null ? !serverAddress.equals(that.serverAddress) : that.serverAddress != null) return false; - if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; - if (username != null ? !username.equals(that.username) : that.username != null) return false; - if (version != null ? !version.equals(that.version) : that.version != null) return false; + if (uri != null ? !uri.equals(that.uri) : that.uri != null) + return false; + if (username != null ? !username.equals(that.username) : that.username != null) + return false; + if (version != null ? !version.equals(that.version) : that.version != null) + return false; return true; } @@ -370,33 +393,29 @@ public int hashCode() { @Override public String toString() { - return "DockerClientConfig{" + - "uri=" + uri + - ", version='" + version + '\'' + - ", username='" + username + '\'' + - ", password='" + password + '\'' + - ", email='" + email + '\'' + - ", serverAddress='" + serverAddress + '\'' + - ", dockerCfgPath='" + dockerCfgPath + '\'' + - ", sslConfig='" + sslConfig + '\'' + - ", readTimeout=" + readTimeout + - ", loggingFilterEnabled=" + loggingFilterEnabled + - ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + - '}'; + return "DockerClientConfig{" + "uri=" + uri + ", version='" + version + '\'' + ", username='" + username + '\'' + + ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress + + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' + + ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + '}'; } public static class DockerClientConfigBuilder { private URI uri; + private String version, username, password, email, serverAddress, dockerCfgPath; + private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; + private boolean loggingFilterEnabled, followRedirectsFilterEnabled; + private SSLConfig sslConfig; /** * This will set all fields in the builder to those contained in the Properties object. The Properties object * should contain the following docker.io.* keys: url, version, username, password, email, dockerCertPath, and * dockerCfgPath. If docker.io.readTimeout or docker.io.enableLoggingFilter are not contained, they will be set - * to 1000 and true, respectively. + * to 1000 and true, respectively. */ public DockerClientConfigBuilder withProperties(Properties p) { return withUri(p.getProperty(DOCKER_IO_URL_PROPERTY)) @@ -407,18 +426,19 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) - .withFollowRedirectsFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) + .withFollowRedirectsFilter( + Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); } - + private Integer integerValue(String value) { - if(value != null) - return Integer.valueOf(value); - else - return null; + if (value != null) + return Integer.valueOf(value); + else + return null; } public final DockerClientConfigBuilder withUri(String uri) { @@ -456,12 +476,12 @@ public final DockerClientConfigBuilder withReadTimeout(Integer readTimeout) { this.readTimeout = readTimeout; return this; } - + public final DockerClientConfigBuilder withMaxTotalConnections(Integer maxTotalConnections) { this.maxTotalConnections = maxTotalConnections; return this; } - + public final DockerClientConfigBuilder withMaxPerRouteConnections(Integer maxPerRouteConnections) { this.maxPerRouteConnections = maxPerRouteConnections; return this; @@ -478,9 +498,9 @@ public final DockerClientConfigBuilder withFollowRedirectsFilter(boolean followR } public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { - if(dockerCertPath != null) { - this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); - } + if (dockerCertPath != null) { + this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); + } return this; } @@ -489,30 +509,17 @@ public final DockerClientConfigBuilder withDockerCfgPath(String dockerCfgPath) { return this; } - public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { this.sslConfig = config; return this; } public DockerClientConfig build() { - return new DockerClientConfig( - uri, - version, - username, - password, - email, - serverAddress, - dockerCfgPath, - readTimeout, - loggingFilterEnabled, - followRedirectsFilterEnabled, - sslConfig, - maxTotalConnections, - maxPerRouteConnections - ); + return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, + readTimeout, loggingFilterEnabled, followRedirectsFilterEnabled, sslConfig, maxTotalConnections, + maxPerRouteConnections); } } -// + // } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index cf27650a6..01d40760a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -21,221 +21,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) { + return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); + } @Override public ExecStartCmd execStartCmd(String containerId) { @@ -248,114 +224,100 @@ public InspectExecCmd inspectExecCmd(String execId) { } @Override - public LogContainerCmd logContainerCmd(String containerId) { - return new LogContainerCmdImpl(getDockerCmdExecFactory() - .createLogContainerCmdExec(), containerId); - } + public LogContainerCmd logContainerCmd(String containerId) { + return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); + } - @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(EventCallback eventCallback) { - return new EventsCmdImpl(getDockerCmdExecFactory() - .createEventsCmdExec(), eventCallback); - } - - @Override + 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(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 { - getDockerCmdExecFactory().close(); - } + return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), statsCallback); + } + + @Override + public void close() throws IOException { + getDockerCmdExecFactory().close(); + } } diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java index 3fc910217..317a55ed6 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -6,9 +6,12 @@ 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. 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) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index a84bce5bb..469beb40b 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -23,16 +23,16 @@ * character class (must be non-empty) * c matches character c (c != '*', '?', '\\', '[') * '\\' c matches character c - * + * * character-range: * c matches character c (c != '\\', '-', ']') * '\\' c matches character c * lo '-' hi matches character c for lo <= c <= hi - * + * * Match requires pattern to match all of name, not just a substring. * The only possible returned error is ErrBadPattern, when pattern * is malformed. - * + * * On Windows, escaping is disabled. Instead, '\\' is treated as * path separator. * @@ -234,7 +234,9 @@ static GetEscResult getEsc(String chunk, int chunkOffset, int chunkLength) { private static final class ScanResult { public boolean star; + public String chunk; + public String pattern; public ScanResult(boolean star, String chunk, String pattern) { @@ -246,6 +248,7 @@ public ScanResult(boolean star, String chunk, String pattern) { private static final class GetEscResult { public char lo; + public int chunkOffset; public GetEscResult(char lo, int chunkOffset) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index 33e0f2a47..c8d8e1044 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -10,10 +10,9 @@ public class GoLangMatchFileFilter extends AbstractFileFilter { - private final File base; - - private final List patterns; + private final File base; + private final List patterns; public GoLangMatchFileFilter(File base, List patterns) { super(); @@ -24,10 +23,9 @@ public GoLangMatchFileFilter(File base, List patterns) { @Override public boolean accept(File file) { String relativePath = FilePathUtil.relativize(base, file); - + boolean match = GoLangFileMatch.match(patterns, relativePath); return !match; } - } diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index ec5a2ba8a..d7a17cfab 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -25,110 +25,109 @@ */ public class KeystoreSSLConfig implements SSLConfig, Serializable { - private final KeyStore keystore; - private final String keystorePassword; - - /** - * @param keystore a KeyStore - * @param keystorePassword key password - */ - public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { - this.keystorePassword = keystorePassword; - checkNotNull(keystore); - this.keystore = keystore; - } - - /** - * - * @param pfxFile a PKCS12 file - * @param password Password for the keystore - * @throws KeyStoreException - * @throws IOException - * @throws CertificateException - * @throws NoSuchAlgorithmException - */ - public KeystoreSSLConfig(File pfxFile, String password) - throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - checkNotNull(pfxFile); - checkNotNull(password); - keystore = KeyStore.getInstance("pkcs12"); - keystore.load(new FileInputStream(pfxFile), password.toCharArray()); - keystorePassword = password; - } - - - /** - * Get the SSL Context out of the keystore. - * @return java SSLContext - * @throws KeyManagementException - * @throws UnrecoverableKeyException - * @throws NoSuchAlgorithmException - * @throws KeyStoreException - */ - @Override - public SSLContext getSSLContext() - throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, - KeyStoreException { - - final SSLContext context = SSLContext.getInstance("TLS"); - - String httpProtocols = System.getProperty("https.protocols"); - System.setProperty("https.protocols", "TLSv1"); - - if (httpProtocols != null) - System.setProperty("https.protocols", httpProtocols); - - final KeyManagerFactory - keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyManagerFactory.init(keystore, keystorePassword.toCharArray()); - context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{ - new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[]{}; - } - - @Override - public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { - - } - - @Override - public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { - - } - } - }, new SecureRandom()); - - return context; - } + private final KeyStore keystore; + + private final String keystorePassword; + + /** + * @param keystore + * a KeyStore + * @param keystorePassword + * key password + */ + public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { + this.keystorePassword = keystorePassword; + checkNotNull(keystore); + this.keystore = keystore; + } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + /** + * + * @param pfxFile + * a PKCS12 file + * @param password + * Password for the keystore + * @throws KeyStoreException + * @throws IOException + * @throws CertificateException + * @throws NoSuchAlgorithmException + */ + public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException, IOException, + CertificateException, NoSuchAlgorithmException { + checkNotNull(pfxFile); + checkNotNull(password); + keystore = KeyStore.getInstance("pkcs12"); + keystore.load(new FileInputStream(pfxFile), password.toCharArray()); + keystorePassword = password; } - if (o == null || getClass() != o.getClass()) { - return false; + + /** + * Get the SSL Context out of the keystore. + * + * @return java SSLContext + * @throws KeyManagementException + * @throws UnrecoverableKeyException + * @throws NoSuchAlgorithmException + * @throws KeyStoreException + */ + @Override + public SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, + NoSuchAlgorithmException, KeyStoreException { + + final SSLContext context = SSLContext.getInstance("TLS"); + + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + + if (httpProtocols != null) + System.setProperty("https.protocols", httpProtocols); + + final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory + .getDefaultAlgorithm()); + keyManagerFactory.init(keystore, keystorePassword.toCharArray()); + context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + + @Override + public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { + + } + + @Override + public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { + + } + } }, new SecureRandom()); + + return context; } - KeystoreSSLConfig that = (KeystoreSSLConfig) o; + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - return keystore.equals(that.keystore); + KeystoreSSLConfig that = (KeystoreSSLConfig) o; - } + return keystore.equals(that.keystore); - @Override - public int hashCode() { - return keystore.hashCode(); - } + } + + @Override + public int hashCode() { + return keystore.hashCode(); + } - @Override - public String toString() { - return new StringBuilder() - .append(this.getClass().getSimpleName()).append("{") - .append("keystore=").append(keystore) - .append("}") - .toString(); - } + @Override + public String toString() { + return new StringBuilder().append(this.getClass().getSimpleName()).append("{").append("keystore=") + .append(keystore).append("}").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index bafe62212..44310e9ce 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -12,88 +12,83 @@ import com.github.dockerjava.api.DockerClientException; - /** * SSL Config from local files. */ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { - private final String dockerCertPath; + private final String dockerCertPath; - public LocalDirectorySSLConfig(String dockerCertPath) { - checkNotNull(dockerCertPath); - this.dockerCertPath = dockerCertPath; - } + public LocalDirectorySSLConfig(String dockerCertPath) { + checkNotNull(dockerCertPath); + this.dockerCertPath = dockerCertPath; + } - public String getDockerCertPath() { - return dockerCertPath; - } + public String getDockerCertPath() { + return dockerCertPath; + } - @Override - public SSLContext getSSLContext() { + @Override + public SSLContext getSSLContext() { - boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); + boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); - if (certificatesExist) { + if (certificatesExist) { - try { + try { - Security.addProvider(new BouncyCastleProvider()); + Security.addProvider(new BouncyCastleProvider()); - // properties acrobatics not needed for java > 1.6 - String httpProtocols = System.getProperty("https.protocols"); - System.setProperty("https.protocols", "TLSv1"); - SslConfigurator sslConfig = SslConfigurator.newInstance(true); - if (httpProtocols != null) { - System.setProperty("https.protocols", httpProtocols); - } + // properties acrobatics not needed for java > 1.6 + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + SslConfigurator sslConfig = SslConfigurator.newInstance(true); + if (httpProtocols != null) { + System.setProperty("https.protocols", httpProtocols); + } - sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath)); - sslConfig.keyStorePassword("docker"); - sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath)); + sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath)); + sslConfig.keyStorePassword("docker"); + sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath)); - return sslConfig.createSSLContext(); + return sslConfig.createSSLContext(); + } catch (Exception e) { + throw new DockerClientException(e.getMessage(), e); + } - } catch (Exception e) { - throw new DockerClientException(e.getMessage(), e); - } + } + + return null; } - return null; + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - } + LocalDirectorySSLConfig that = (LocalDirectorySSLConfig) o; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (!dockerCertPath.equals(that.dockerCertPath)) { + return false; + } - LocalDirectorySSLConfig that = (LocalDirectorySSLConfig) o; + return true; + } - if (!dockerCertPath.equals(that.dockerCertPath)) { - return false; + @Override + public int hashCode() { + return dockerCertPath.hashCode(); } - return true; - } - - @Override - public int hashCode() { - return dockerCertPath.hashCode(); - } - - @Override - public String toString() { - return new StringBuilder() - .append(this.getClass().getSimpleName()).append("{") - .append("dockerCertPath=").append(dockerCertPath) - .append("}") - .toString(); - } + @Override + public String toString() { + return new StringBuilder().append(this.getClass().getSimpleName()).append("{").append("dockerCertPath=") + .append(dockerCertPath).append("}").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 6b1654081..2bd99bf31 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -10,7 +10,9 @@ public class NameParser { private static final Pattern VALID_HEX_PATTERN = Pattern.compile("^([a-f0-9]{64})$"); + private static final Pattern VALID_NAMESPACE_PATTERN = Pattern.compile("^([a-z0-9_]{4,30})$"); + private static final Pattern VALID_REPO_PATTERN = Pattern.compile("^([a-z0-9-_.]+)$"); public static ReposTag parseRepositoryTag(String name) { @@ -27,6 +29,7 @@ public static ReposTag parseRepositoryTag(String name) { public static class ReposTag { public final String repos; + public final String tag; public ReposTag(String repos, String tag) { @@ -44,18 +47,15 @@ public static void validateRepositoryName(String repositoryName) { name = nameParts[0]; if (VALID_HEX_PATTERN.matcher(name).matches()) { throw new InvalidRepositoryNameException(String.format( - "Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", - name)); + "Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", name)); } } else { namespace = nameParts[0]; name = nameParts[1]; } if (!VALID_NAMESPACE_PATTERN.matcher(namespace).matches()) { - throw new InvalidRepositoryNameException( - String.format( - "Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", - namespace)); + throw new InvalidRepositoryNameException(String.format( + "Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", namespace)); } if (!VALID_REPO_PATTERN.matcher(name).matches()) { throw new InvalidRepositoryNameException(String.format( @@ -71,16 +71,15 @@ public static HostnameReposName resolveRepositoryName(String reposName) { String[] nameParts = reposName.split("/", 2); if (nameParts.length == 1 - || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0] - .equals("localhost"))) { + || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) { return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName); } String hostname = nameParts[0]; reposName = nameParts[1]; if (hostname.contains("index.docker.io")) { - throw new InvalidRepositoryNameException(String.format( - "Invalid repository name, try \"%s\" instead", reposName)); + throw new InvalidRepositoryNameException(String.format("Invalid repository name, try \"%s\" instead", + reposName)); } validateRepositoryName(reposName); @@ -89,6 +88,7 @@ public static HostnameReposName resolveRepositoryName(String reposName) { public static class HostnameReposName { public final String hostname; + public final String reposName; public HostnameReposName(String hostname, String reposName) { diff --git a/src/main/java/com/github/dockerjava/core/SSLConfig.java b/src/main/java/com/github/dockerjava/core/SSLConfig.java index ab6394890..247e21b1f 100644 --- a/src/main/java/com/github/dockerjava/core/SSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/SSLConfig.java @@ -9,11 +9,11 @@ */ public interface SSLConfig { - /** - * Get the SSL Context, from wherever it comes (file, keystore). - * @return an SSL context. - */ - SSLContext getSSLContext() - throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, - KeyStoreException; + /** + * Get the SSL Context, from wherever it comes (file, keystore). + * + * @return an SSL context. + */ + SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, + KeyStoreException; } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 31259f1f0..7e9957cbf 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -11,41 +11,40 @@ import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -public abstract class AbstrAuthCfgDockerCmd, RES_T> extends - AbstrDockerCmd { - - public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { - super(execution); - withOptionalAuthConfig(authConfig); - } - - public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { - super(execution); - } - - private AuthConfig authConfig; - - public AuthConfig getAuthConfig() { - return authConfig; - } - - public T withAuthConfig(AuthConfig authConfig) { - checkNotNull(authConfig, "authConfig was not specified"); - return withOptionalAuthConfig(authConfig); - } - - @SuppressWarnings("unchecked") - private T withOptionalAuthConfig(AuthConfig authConfig) { - this.authConfig = authConfig; - return (T)this; - } - - protected String registryAuth() { - try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } +public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { + + public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { + super(execution); + withOptionalAuthConfig(authConfig); + } + + public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { + super(execution); + } + + private AuthConfig authConfig; + + public AuthConfig getAuthConfig() { + return authConfig; + } + + public T withAuthConfig(AuthConfig authConfig) { + checkNotNull(authConfig, "authConfig was not specified"); + return withOptionalAuthConfig(authConfig); + } + + @SuppressWarnings("unchecked") + private T withOptionalAuthConfig(AuthConfig authConfig) { + this.authConfig = authConfig; + return (T) this; + } + + protected String registryAuth() { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 751b02cb6..069fba09e 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -12,23 +12,24 @@ import com.github.dockerjava.api.command.DockerCmdExec; public abstract class AbstrDockerCmd, RES_T> implements DockerCmd { - + private final static Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); - protected DockerCmdExec execution; - - public AbstrDockerCmd(DockerCmdExec execution) { - checkNotNull(execution, "execution was not specified"); - this.execution = execution; - } + protected DockerCmdExec execution; + + public AbstrDockerCmd(DockerCmdExec execution) { + checkNotNull(execution, "execution was not specified"); + this.execution = execution; + } @Override @SuppressWarnings("unchecked") - public RES_T exec() throws DockerException { - LOGGER.debug("Cmd: {}", this); - return execution.exec((CMD_T)this); - } + public RES_T exec() throws DockerException { + LOGGER.debug("Cmd: {}", this); + return execution.exec((CMD_T) this); + } @Override - public void close() throws IOException {} + public void close() throws IOException { + } } diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index fc38ae7d9..e2e7a3516 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -20,112 +20,113 @@ * @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 class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { - - private String containerId; - - private boolean logs, followStream, timestamps, stdout, stderr; - - public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } - - @Override - public String getContainerId() { - return containerId; - } - - @Override - public boolean hasLogsEnabled() { - return logs; - } - - @Override - public boolean hasFollowStreamEnabled() { - return followStream; - } - - @Override - public boolean hasTimestampsEnabled() { - return timestamps; - } - - @Override - public boolean hasStdoutEnabled() { - return stdout; - } - - @Override - public boolean hasStderrEnabled() { - return stderr; - } - - @Override - public AttachContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public AttachContainerCmd withFollowStream() { - return withFollowStream(true); - } - - @Override - public AttachContainerCmd withFollowStream(boolean followStream) { - this.followStream = followStream; - return this; - } - - @Override - public AttachContainerCmd withTimestamps(boolean timestamps) { - this.timestamps = timestamps; - return this; - } - - @Override - public AttachContainerCmd withStdOut() { - return withStdOut(true); - } - - @Override - public AttachContainerCmd withStdOut(boolean stdout) { - this.stdout = stdout; - return this; - } - - @Override - public AttachContainerCmd withStdErr() { - return withStdErr(true); - } - - @Override - public AttachContainerCmd withStdErr(boolean stderr) { - this.stderr = stderr; - return this; - } - - @Override - public AttachContainerCmd withLogs(boolean logs) { - this.logs = logs; - return this; - } - - @Override - public AttachContainerCmd withLogs() { - return withLogs(true); - } - - /** - * @throws NotFoundException No such container - */ - @Override - public InputStream exec() throws NotFoundException { - return super.exec(); - } +public class AttachContainerCmdImpl extends AbstrDockerCmd implements + AttachContainerCmd { + + private String containerId; + + private boolean logs, followStream, timestamps, stdout, stderr; + + public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public boolean hasLogsEnabled() { + return logs; + } + + @Override + public boolean hasFollowStreamEnabled() { + return followStream; + } + + @Override + public boolean hasTimestampsEnabled() { + return timestamps; + } + + @Override + public boolean hasStdoutEnabled() { + return stdout; + } + + @Override + public boolean hasStderrEnabled() { + return stderr; + } + + @Override + public AttachContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public AttachContainerCmd withFollowStream() { + return withFollowStream(true); + } + + @Override + public AttachContainerCmd withFollowStream(boolean followStream) { + this.followStream = followStream; + return this; + } + + @Override + public AttachContainerCmd withTimestamps(boolean timestamps) { + this.timestamps = timestamps; + return this; + } + + @Override + public AttachContainerCmd withStdOut() { + return withStdOut(true); + } + + @Override + public AttachContainerCmd withStdOut(boolean stdout) { + this.stdout = stdout; + return this; + } + + @Override + public AttachContainerCmd withStdErr() { + return withStdErr(true); + } + + @Override + public AttachContainerCmd withStdErr(boolean stderr) { + this.stderr = stderr; + return this; + } + + @Override + public AttachContainerCmd withLogs(boolean logs) { + this.logs = logs; + return this; + } + + @Override + public AttachContainerCmd withLogs() { + return withLogs(true); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java index 0da0da3c3..73c716c14 100644 --- a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java @@ -12,18 +12,18 @@ */ public class AuthCmdImpl extends AbstrAuthCfgDockerCmd implements AuthCmd { - public AuthCmdImpl(AuthCmd.Exec exec, AuthConfig authConfig) { - super(exec); - withAuthConfig(authConfig); - } + public AuthCmdImpl(AuthCmd.Exec exec, AuthConfig authConfig) { + super(exec); + withAuthConfig(authConfig); + } - @Override - public AuthResponse exec() throws UnauthorizedException { - return super.exec(); - } + @Override + public AuthResponse exec() throws UnauthorizedException { + return super.exec(); + } - @Override - public String toString() { - return "authenticate using " + this.getAuthConfig(); - } + @Override + public String toString() { + return "authenticate using " + this.getAuthConfig(); + } } 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 ef0242857..f61d3b7ac 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -18,16 +18,22 @@ */ public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { + private InputStream tarInputStream = null; + + private String tag; + + private boolean noCache; + + private boolean remove = true; + + private boolean quiet; + + private boolean pull; + + private AuthConfigurations buildAuthConfigs; - private InputStream tarInputStream = null; - private String tag; - private boolean noCache; - private boolean remove = true; - private boolean quiet; - private boolean pull; - - private AuthConfigurations buildAuthConfigs; private File dockerFile; + private File baseDirectory; public BuildImageCmdImpl(BuildImageCmd.Exec exec) { @@ -35,48 +41,43 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec) { } public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFileOrFolder) { - super(exec); - checkNotNull(dockerFileOrFolder, "dockerFolder is null"); + super(exec); + checkNotNull(dockerFileOrFolder, "dockerFolder is null"); - if( dockerFileOrFolder.isDirectory() ) { + if (dockerFileOrFolder.isDirectory()) { withBaseDirectory(dockerFileOrFolder); withDockerfile(new File(dockerFileOrFolder, "Dockerfile")); - } - else { + } else { withDockerfile(dockerFileOrFolder); } - } + } - public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { - super(exec); - checkNotNull(tarInputStream, "tarInputStream is null"); - withTarInputStream(tarInputStream); - } + public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { + super(exec); + checkNotNull(tarInputStream, "tarInputStream is null"); + withTarInputStream(tarInputStream); + } - @Override - public InputStream getTarInputStream() { - return tarInputStream; - } + @Override + public InputStream getTarInputStream() { + return tarInputStream; + } @Override public BuildImageCmdImpl withDockerfile(File dockerfile) { checkNotNull(dockerfile); - if( !dockerfile.exists() ) + if (!dockerfile.exists()) throw new IllegalArgumentException("Dockerfile does not exist"); - if( !dockerfile.isFile() ) + if (!dockerfile.isFile()) throw new IllegalArgumentException("Not a directory"); - if( baseDirectory == null ) + if (baseDirectory == null) withBaseDirectory(dockerfile.getParentFile()); - this.dockerFile = dockerfile; try { - withTarInputStream( - new Dockerfile(dockerfile) - .parse() - .buildDockerFolderTar(baseDirectory) ); + withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); } catch (IOException e) { // we just created the file this should never happen. throw new RuntimeException(e); @@ -84,44 +85,44 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) { return this; } - @Override - public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - checkNotNull(tarInputStream, "tarInputStream is null"); - this.tarInputStream = tarInputStream; - return this; - } - - @Override - public BuildImageCmdImpl withTag(String tag) { - checkNotNull(tag, "Tag is null"); - this.tag = tag; - return this; - } - - @Override - public String getTag() { - return tag; - } - - @Override - public boolean hasNoCacheEnabled() { - return noCache; - } - - @Override - public boolean hasRemoveEnabled() { - return remove; - } - - @Override - public boolean isQuiet() { - return quiet; - } - - @Override - public boolean hasPullEnabled() { - return pull; - } + @Override + public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { + checkNotNull(tarInputStream, "tarInputStream is null"); + this.tarInputStream = tarInputStream; + return this; + } + + @Override + public BuildImageCmdImpl withTag(String tag) { + checkNotNull(tag, "Tag is null"); + this.tag = tag; + return this; + } + + @Override + public String getTag() { + return tag; + } + + @Override + public boolean hasNoCacheEnabled() { + return noCache; + } + + @Override + public boolean hasRemoveEnabled() { + return remove; + } + + @Override + public boolean isQuiet() { + return quiet; + } + + @Override + public boolean hasPullEnabled() { + return pull; + } @Override public String getPathToDockerfile() { @@ -133,9 +134,9 @@ public String getPathToDockerfile() { } @Override - public AuthConfigurations getBuildAuthConfigs() { - return buildAuthConfigs; - } + public AuthConfigurations getBuildAuthConfigs() { + return buildAuthConfigs; + } @Override public BuildImageCmd withBaseDirectory(File baseDirectory) { @@ -144,71 +145,68 @@ public BuildImageCmd withBaseDirectory(File baseDirectory) { } @Override - public BuildImageCmdImpl withNoCache() { - return withNoCache(true); - } - - @Override - public BuildImageCmdImpl withNoCache(boolean noCache) { - this.noCache = noCache; - return this; - } - - @Override - public BuildImageCmdImpl withRemove() { - return withRemove(true); - } - - @Override - public BuildImageCmdImpl withRemove(boolean rm) { - this.remove = rm; - return this; - } - - @Override - public BuildImageCmdImpl withQuiet() { - return withQuiet(true); - } - - @Override - public BuildImageCmdImpl withQuiet(boolean quiet) { - this.quiet = quiet; - return this; - } - - @Override - public BuildImageCmdImpl withPull() { - return withPull(true); - } - - @Override - public BuildImageCmdImpl withPull(boolean pull) { - this.pull = pull; - return this; - } - - @Override - public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { - checkNotNull(authConfigs, "authConfig is null"); - this.buildAuthConfigs = authConfigs; - return this; - } - - @Override - public void close() throws IOException { - super.close(); - - tarInputStream.close(); - } - - @Override - public String toString() { - return new StringBuilder("build ") - .append(tag != null ? "-t " + tag + " " : "") - .append(noCache ? "--nocache=true " : "") - .append(quiet ? "--quiet=true " : "") - .append(!remove ? "--rm=false " : "").toString(); - } + public BuildImageCmdImpl withNoCache() { + return withNoCache(true); + } + + @Override + public BuildImageCmdImpl withNoCache(boolean noCache) { + this.noCache = noCache; + return this; + } + + @Override + public BuildImageCmdImpl withRemove() { + return withRemove(true); + } + @Override + public BuildImageCmdImpl withRemove(boolean rm) { + this.remove = rm; + return this; + } + + @Override + public BuildImageCmdImpl withQuiet() { + return withQuiet(true); + } + + @Override + public BuildImageCmdImpl withQuiet(boolean quiet) { + this.quiet = quiet; + return this; + } + + @Override + public BuildImageCmdImpl withPull() { + return withPull(true); + } + + @Override + public BuildImageCmdImpl withPull(boolean pull) { + this.pull = pull; + return this; + } + + @Override + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { + checkNotNull(authConfigs, "authConfig is null"); + this.buildAuthConfigs = authConfigs; + return this; + } + + @Override + public void close() throws IOException { + super.close(); + + tarInputStream.close(); + } + + @Override + public String toString() { + return new StringBuilder("build ").append(tag != null ? "-t " + tag + " " : "") + .append(noCache ? "--nocache=true " : "").append(quiet ? "--quiet=true " : "") + .append(!remove ? "--rm=false " : "").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index 55fe5e2e2..497d08c3f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -10,7 +10,6 @@ import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; - /** * * Create a new image from a container's changes. Returns the new image ID. @@ -18,11 +17,11 @@ */ public class CommitCmdImpl extends AbstrDockerCmd implements CommitCmd { - private String containerId, repository, tag, message, author; + private String containerId, repository, tag, message, author; - private boolean pause = true; + private boolean pause = true; - @JsonProperty("AttachStdin") + @JsonProperty("AttachStdin") private boolean attachStdin; @JsonProperty("AttachStdout") @@ -73,299 +72,293 @@ public class CommitCmdImpl extends AbstrDockerCmd implements @JsonProperty("WorkingDir") private String workingDir; - - public CommitCmdImpl(CommitCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public CommitCmdImpl(CommitCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public CommitCmdImpl withContainerId(String containerId) { + public CommitCmdImpl withContainerId(String containerId) { checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - + this.containerId = containerId; + return this; + } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } @Override - public String getMessage() { + public String getMessage() { return message; } @Override - public String getAuthor() { + public String getAuthor() { return author; } @Override - public boolean hasPauseEnabled() { + public boolean hasPauseEnabled() { return pause; } - @Override - public CommitCmdImpl withAttachStderr(boolean attachStderr) { - this.attachStderr = attachStderr; - return this; - } - - @Override - public CommitCmdImpl withAttachStderr() { - return withAttachStderr(true); - } - - @Override - public CommitCmdImpl withAttachStdin(boolean attachStdin) { - this.attachStdin = attachStdin; - return this; - } - - @Override - public CommitCmdImpl withAttachStdin() { - return withAttachStdin(true); - } - - @Override - public CommitCmdImpl withAttachStdout(boolean attachStdout) { - this.attachStdout = attachStdout; - return this; - } - - @Override - public CommitCmdImpl withAttachStdout() { - return withAttachStdout(true); - } - - @Override - public CommitCmdImpl withCmd(String... cmd) { + @Override + public CommitCmdImpl withAttachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + @Override + public CommitCmdImpl withAttachStderr() { + return withAttachStderr(true); + } + + @Override + public CommitCmdImpl withAttachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + @Override + public CommitCmdImpl withAttachStdin() { + return withAttachStdin(true); + } + + @Override + public CommitCmdImpl withAttachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + @Override + public CommitCmdImpl withAttachStdout() { + return withAttachStdout(true); + } + + @Override + public CommitCmdImpl withCmd(String... cmd) { checkNotNull(cmd, "cmd was not specified"); - this.cmd = cmd; - return this; - } - - @Override - public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { - this.disableNetwork = disableNetwork; - return this; - } - - @Override - public CommitCmdImpl withAuthor(String author) { + this.cmd = cmd; + return this; + } + + @Override + public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { + this.disableNetwork = disableNetwork; + return this; + } + + @Override + public CommitCmdImpl withAuthor(String author) { checkNotNull(author, "author was not specified"); - this.author = author; - return this; - } + this.author = author; + return this; + } - @Override - public CommitCmdImpl withMessage(String message) { + @Override + public CommitCmdImpl withMessage(String message) { checkNotNull(message, "message was not specified"); - this.message = message; - return this; - } + this.message = message; + return this; + } - @Override - public CommitCmdImpl withTag(String tag) { + @Override + public CommitCmdImpl withTag(String tag) { checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } + this.tag = tag; + return this; + } - @Override - public CommitCmdImpl withRepository(String repository) { + @Override + public CommitCmdImpl withRepository(String repository) { checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } - - @Override - public CommitCmdImpl withPause(boolean pause) { - this.pause = pause; - return this; - } - - @Override - public String[] getEnv() { + this.repository = repository; + return this; + } + + @Override + public CommitCmdImpl withPause(boolean pause) { + this.pause = pause; + return this; + } + + @Override + public String[] getEnv() { return env; } @Override - public CommitCmdImpl withEnv(String... env) { + public CommitCmdImpl withEnv(String... env) { checkNotNull(env, "env was not specified"); this.env = env; return this; } @Override - public ExposedPorts getExposedPorts() { + public ExposedPorts getExposedPorts() { return exposedPorts; } @Override - public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { + public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { checkNotNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = exposedPorts; return this; } @Override - public String getHostname() { + public String getHostname() { return hostname; } @Override - public CommitCmdImpl withHostname(String hostname) { + public CommitCmdImpl withHostname(String hostname) { checkNotNull(hostname, "hostname was not specified"); this.hostname = hostname; return this; } @Override - public Integer getMemory() { + public Integer getMemory() { return memory; } @Override - public CommitCmdImpl withMemory(Integer memory) { + public CommitCmdImpl withMemory(Integer memory) { checkNotNull(memory, "memory was not specified"); this.memory = memory; return this; } @Override - public Integer getMemorySwap() { + public Integer getMemorySwap() { return memorySwap; } @Override - public CommitCmdImpl withMemorySwap(Integer memorySwap) { + public CommitCmdImpl withMemorySwap(Integer memorySwap) { checkNotNull(memorySwap, "memorySwap was not specified"); this.memorySwap = memorySwap; return this; } @Override - public boolean isOpenStdin() { + public boolean isOpenStdin() { return openStdin; } @Override - public CommitCmdImpl withOpenStdin(boolean openStdin) { - checkNotNull(openStdin, "openStdin was not specified"); + public CommitCmdImpl withOpenStdin(boolean openStdin) { + checkNotNull(openStdin, "openStdin was not specified"); this.openStdin = openStdin; return this; } - + @Override - public String[] getPortSpecs() { + public String[] getPortSpecs() { return portSpecs; } @Override - public CommitCmdImpl withPortSpecs(String... portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); + public CommitCmdImpl withPortSpecs(String... portSpecs) { + checkNotNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } @Override - public boolean isStdinOnce() { + public boolean isStdinOnce() { return stdinOnce; } @Override - public CommitCmdImpl withStdinOnce(boolean stdinOnce) { + public CommitCmdImpl withStdinOnce(boolean stdinOnce) { this.stdinOnce = stdinOnce; return this; } - + @Override - public CommitCmdImpl withStdinOnce() { - return withStdinOnce(true); + public CommitCmdImpl withStdinOnce() { + return withStdinOnce(true); } @Override - public boolean isTty() { + public boolean isTty() { return tty; } @Override - public CommitCmdImpl withTty(boolean tty) { + public CommitCmdImpl withTty(boolean tty) { this.tty = tty; return this; } - + @Override - public CommitCmdImpl withTty() { - return withTty(true); + public CommitCmdImpl withTty() { + return withTty(true); } @Override - public String getUser() { + public String getUser() { return user; } @Override - public CommitCmdImpl withUser(String user) { - checkNotNull(user, "user was not specified"); + public CommitCmdImpl withUser(String user) { + checkNotNull(user, "user was not specified"); this.user = user; return this; } @Override - public Volumes getVolumes() { + public Volumes getVolumes() { return volumes; } @Override - public CommitCmdImpl withVolumes(Volumes volumes) { - checkNotNull(volumes, "volumes was not specified"); + public CommitCmdImpl withVolumes(Volumes volumes) { + checkNotNull(volumes, "volumes was not specified"); this.volumes = volumes; return this; } @Override - public String getWorkingDir() { + public String getWorkingDir() { return workingDir; } @Override - public CommitCmdImpl withWorkingDir(String workingDir) { - checkNotNull(workingDir, "workingDir was not specified"); + public CommitCmdImpl withWorkingDir(String workingDir) { + checkNotNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; } + @Override + public String toString() { + return new ToStringBuilder(this).append("commit ").append(author != null ? "--author " + author + " " : "") + .append(message != null ? "--message " + message + " " : "").append(containerId) + .append(repository != null ? " " + repository + ":" : " ").append(tag != null ? tag : "").toString(); + } - @Override - public String toString() { - return new ToStringBuilder(this).append("commit ") - .append(author != null ? "--author " + author + " " : "") - .append(message != null ? "--message " + message + " " : "") - .append(containerId) - .append(repository != null ? " " + repository + ":" : " ") - .append(tag != null ? tag : "") - .toString(); - } - - /** - * @throws NotFoundException No such container + /** + * @throws NotFoundException + * No such container */ - @Override - public String exec() throws NotFoundException { - return super.exec(); - } + @Override + public String exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index 36286423c..a394c535c 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -13,42 +13,46 @@ /** * Inspect changes on a container's filesystem * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class ContainerDiffCmdImpl extends AbstrDockerCmd> implements ContainerDiffCmd { - private String containerId; + private String containerId; - public ContainerDiffCmdImpl(ContainerDiffCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public ContainerDiffCmdImpl(ContainerDiffCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public ContainerDiffCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public ContainerDiffCmdImpl withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { return new StringBuilder("diff ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container - * @throws InternalServerErrorException server error - * @throws DockerException unexpected http status code + * @throws NotFoundException + * No such container + * @throws InternalServerErrorException + * server error + * @throws DockerException + * unexpected http status code */ - @Override + @Override public List exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index f4f2ae548..ef5f86a7a 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -10,78 +10,75 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; - /** * * Copy files or folders from a container. * */ -public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements CopyFileFromContainerCmd { +public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements + CopyFileFromContainerCmd { + + private String containerId; - private String containerId; - - @JsonProperty("HostPath") + @JsonProperty("HostPath") private String hostPath = "."; @JsonProperty("Resource") private String resource; - public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { - super(exec); - withContainerId(containerId); - withResource(resource); - } + public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { + super(exec); + withContainerId(containerId); + withResource(resource); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getResource() { + public String getResource() { return resource; } @Override - public CopyFileFromContainerCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public CopyFileFromContainerCmdImpl withResource(String resource) { - checkNotNull(resource, "resource was not specified"); - this.resource = resource; - return this; - } - - @Override - public String getHostPath() { - return hostPath; - } - - @Override - public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { - checkNotNull(hostPath, "hostPath was not specified"); - this.hostPath = hostPath; - return this; - } - - @Override + public CopyFileFromContainerCmdImpl withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public CopyFileFromContainerCmdImpl withResource(String resource) { + checkNotNull(resource, "resource was not specified"); + this.resource = resource; + return this; + } + + @Override + public String getHostPath() { + return hostPath; + } + + @Override + public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { + checkNotNull(hostPath, "hostPath was not specified"); + this.hostPath = hostPath; + return this; + } + + @Override public String toString() { - return new ToStringBuilder(this).append("cp ") - .append(containerId) - .append(":") - .append(resource) - .toString(); + return new ToStringBuilder(this).append("cp ").append(containerId).append(":").append(resource).toString(); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public InputStream exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index daa883f94..3ed2f912e 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -12,72 +12,75 @@ /** * Create an image by importing the given stream of a tar file. */ -public class CreateImageCmdImpl extends AbstrDockerCmd implements CreateImageCmd { +public class CreateImageCmdImpl extends AbstrDockerCmd implements CreateImageCmd { - private String repository, tag; - - private InputStream imageStream; + private String repository, tag; - /** - * @param repository the repository to import to - * @param imageStream the InputStream of the tar file - */ - public CreateImageCmdImpl(CreateImageCmd.Exec exec, String repository, InputStream imageStream) { - super(exec); - withRepository(repository); - withImageStream(imageStream); - } + private InputStream imageStream; + + /** + * @param repository + * the repository to import to + * @param imageStream + * the InputStream of the tar file + */ + public CreateImageCmdImpl(CreateImageCmd.Exec exec, String repository, InputStream imageStream) { + super(exec); + withRepository(repository); + withImageStream(imageStream); + } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } - + @Override public InputStream getImageStream() { - return imageStream; + return imageStream; } /** - * @param repository the repository to import to - */ - @Override - public CreateImageCmdImpl withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } + * @param repository + * the repository to import to + */ + @Override + public CreateImageCmdImpl withRepository(String repository) { + checkNotNull(repository, "repository was not specified"); + this.repository = repository; + return this; + } - /** - * @param imageStream the InputStream of the tar file - */ - @Override - public CreateImageCmdImpl withImageStream(InputStream imageStream) { - checkNotNull(imageStream, "imageStream was not specified"); - this.imageStream = imageStream; - return this; - } + /** + * @param imageStream + * the InputStream of the tar file + */ + @Override + public CreateImageCmdImpl withImageStream(InputStream imageStream) { + checkNotNull(imageStream, "imageStream was not specified"); + this.imageStream = imageStream; + return this; + } - /** - * @param tag any tag for this image - */ - @Override - public CreateImageCmdImpl withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } + /** + * @param tag + * any tag for this image + */ + @Override + public CreateImageCmdImpl withTag(String tag) { + checkNotNull(tag, "tag was not specified"); + this.tag = tag; + return this; + } - @Override + @Override public String toString() { - return new ToStringBuilder(this).append("import - ") - .append(repository != null ? repository + ":" : "") - .append(tag != null ? tag : "") - .toString(); + return new ToStringBuilder(this).append("import - ").append(repository != null ? repository + ":" : "") + .append(tag != null ? tag : "").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 index b8975224f..ffa71d6c9 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java +++ b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java @@ -8,7 +8,9 @@ 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) { diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index ac55de714..3faa525d1 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -11,7 +11,9 @@ public class EventsCmdImpl extends AbstrDockerCmd implements EventsCmd { private String since; + private String until; + private EventCallback eventCallback; public EventsCmdImpl(EventsCmd.Exec exec, EventCallback eventCallback) { @@ -30,7 +32,7 @@ public EventsCmd withUntil(String until) { this.until = until; return this; } - + @Override public EventsCmd withEventCallback(EventCallback eventCallback) { this.eventCallback = eventCallback; @@ -59,9 +61,7 @@ public ExecutorService 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/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 65b86ed9a..3b00d22c5 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -30,10 +30,10 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); } - + @Override public ExecCreateCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -43,7 +43,7 @@ public ExecCreateCmd withAttachStdin(boolean attachStdin) { this.attachStdin = attachStdin; return this; } - + @Override public ExecCreateCmd withAttachStdin() { return withAttachStdin(true); @@ -54,7 +54,7 @@ public ExecCreateCmd withAttachStdout(boolean attachStdout) { this.attachStdout = attachStdout; return this; } - + @Override public ExecCreateCmd withAttachStdout() { return withAttachStdout(true); @@ -65,18 +65,18 @@ public ExecCreateCmd withAttachStderr(boolean attachStderr) { this.attachStderr = attachStderr; return this; } - + @Override public ExecCreateCmd withAttachStderr() { return withAttachStderr(true); } - + @Override public ExecCreateCmd withTty(boolean tty) { this.tty = tty; return this; } - + @Override public ExecCreateCmd withTty() { return withTty(true); @@ -92,34 +92,34 @@ public ExecCreateCmd withCmd(String... cmd) { public String getContainerId() { return containerId; } - + @Override - public boolean hasAttachStdinEnabled() { - return attachStdin; - } + public boolean hasAttachStdinEnabled() { + return attachStdin; + } - @Override - public boolean hasAttachStdoutEnabled() { - return attachStdout; - } + @Override + public boolean hasAttachStdoutEnabled() { + return attachStdout; + } - @Override - public boolean hasAttachStderrEnabled() { - return attachStderr; - } + @Override + public boolean hasAttachStderrEnabled() { + return attachStderr; + } - @Override - public boolean hasTtyEnabled() { - return tty; - } + @Override + public boolean hasTtyEnabled() { + return tty; + } /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ @Override public ExecCreateCmdResponse exec() throws NotFoundException { return super.exec(); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 193a2cb69..a479a91f2 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -22,13 +22,13 @@ public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { public String getExecId() { return execId; } - + @Override - public ExecStartCmd withExecId(String execId) { - checkNotNull(execId, "execId was not specified"); - this.execId = execId; - return this; - } + public ExecStartCmd withExecId(String execId) { + checkNotNull(execId, "execId was not specified"); + this.execId = execId; + return this; + } @Override public boolean hasDetachEnabled() { @@ -41,33 +41,34 @@ public boolean hasTtyEnabled() { } @Override - public ExecStartCmd withDetach(boolean detach) { - this.detach = detach; - return this; - } - - @Override - public ExecStartCmd withTty(boolean tty) { - this.tty = tty; - return this; - } - - @Override - public ExecStartCmd withDetach() { - return withDetach(true); - } - - @Override - public ExecStartCmd withTty() { - return withTty(true); - } - + public ExecStartCmd withDetach(boolean detach) { + this.detach = detach; + return this; + } + + @Override + public ExecStartCmd withTty(boolean tty) { + this.tty = tty; + return this; + } + + @Override + public ExecStartCmd withDetach() { + return withDetach(true); + } + + @Override + public ExecStartCmd withTty() { + return withTty(true); + } + /** - * @throws com.github.dockerjava.api.NotFoundException No such exec instance + * @throws com.github.dockerjava.api.NotFoundException + * No such exec instance */ @Override public InputStream exec() throws NotFoundException { return super.exec(); } - + } diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index bb36c1764..a5df3de8a 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -9,11 +9,12 @@ /** * 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 HEADER_SIZE = 8; + private final InputStream inputStream; public FrameReader(InputStream inputStream) { @@ -22,14 +23,14 @@ public FrameReader(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"); } } @@ -50,7 +51,8 @@ public Frame readFrame() throws IOException { actualHeaderSize += headerCount; } while (actualHeaderSize < HEADER_SIZE); - int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); + int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + + (header[7] & 0xff); byte[] payload = new byte[payloadSize]; int actualPayloadSize = 0; @@ -60,7 +62,8 @@ public Frame readFrame() throws IOException { if (count == -1) { if (actualPayloadSize != payloadSize) { - throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, actualPayloadSize)); + throw new IOException(String.format("payload must be %d bytes long, but was %d", payloadSize, + actualPayloadSize)); } break; } diff --git a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java index 767da2049..f2dd3ca82 100644 --- a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java @@ -6,13 +6,13 @@ /** * Return Docker server info */ -public class InfoCmdImpl extends AbstrDockerCmd implements InfoCmd { +public class InfoCmdImpl extends AbstrDockerCmd implements InfoCmd { - public InfoCmdImpl(InfoCmd.Exec exec) { - super(exec); - } - - @Override + public InfoCmdImpl(InfoCmd.Exec exec) { + super(exec); + } + + @Override public String toString() { return "info"; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index 9215f233a..c3fe5f6d5 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -9,37 +9,39 @@ /** * Inspect the details of a container. */ -public class InspectContainerCmdImpl extends AbstrDockerCmd implements InspectContainerCmd { +public class InspectContainerCmdImpl extends AbstrDockerCmd implements + InspectContainerCmd { - private String containerId; + private String containerId; - public InspectContainerCmdImpl(InspectContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public InspectContainerCmdImpl(InspectContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public InspectContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public InspectContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } @Override public String toString() { return "inspect " + containerId; } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public InspectContainerResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 1fd728622..55fad8c9c 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -32,7 +32,8 @@ public String toString() { } /** - * @throws NotFoundException No such exec + * @throws NotFoundException + * No such exec */ @Override public InspectExecResponse exec() throws NotFoundException { diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 0b477e80e..3e28bd488 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -6,41 +6,42 @@ import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; - /** * Inspect the details of an image. */ -public class InspectImageCmdImpl extends AbstrDockerCmd implements InspectImageCmd { +public class InspectImageCmdImpl extends AbstrDockerCmd implements + InspectImageCmd { - private String imageId; + private String imageId; - public InspectImageCmdImpl(InspectImageCmd.Exec exec, String imageId) { - super(exec); - withImageId(imageId); - } + public InspectImageCmdImpl(InspectImageCmd.Exec exec, String imageId) { + super(exec); + withImageId(imageId); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public InspectImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } + public InspectImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } @Override public String toString() { return "inspect " + imageId; } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ - @Override + @Override public InspectImageResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index c6175a8a6..05e709f37 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -5,53 +5,53 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; - /** * Kill a running container. */ public class KillContainerCmdImpl extends AbstrDockerCmd implements KillContainerCmd { - private String containerId, signal; + private String containerId, signal; - public KillContainerCmdImpl(KillContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public KillContainerCmdImpl(KillContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getSignal() { + public String getSignal() { return signal; } @Override - public KillContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public KillContainerCmd withSignal(String signal) { - checkNotNull(signal, "signal was not specified"); - this.signal = signal; - return this; - } + public KillContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public KillContainerCmd withSignal(String signal) { + checkNotNull(signal, "signal was not specified"); + this.signal = signal; + return this; + } @Override public String toString() { return "kill " + containerId; } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 7144e767f..13bb02cfb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -8,95 +8,97 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; - /** * List containers * - * @param showAll - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - true or false, Show the containers sizes. This is false by default. - * @param limit - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - Show only containers created since Id, include non-running ones. - * @param beforeId - Show only containers created before Id, include non-running ones. + * @param showAll + * - true or false, Show all containers. Only running containers are shown by default. + * @param showSize + * - true or false, Show the containers sizes. This is false by default. + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + * @param sinceId + * - Show only containers created since Id, include non-running ones. + * @param beforeId + * - Show only containers created before Id, include non-running ones. * */ -public class ListContainersCmdImpl extends AbstrDockerCmd> implements ListContainersCmd { - - private int limit = -1; - - private boolean showSize, showAll = false; - - private String sinceId, beforeId; - - public ListContainersCmdImpl(ListContainersCmd.Exec exec) { - super(exec); - } +public class ListContainersCmdImpl extends AbstrDockerCmd> implements + ListContainersCmd { + + private int limit = -1; + + private boolean showSize, showAll = false; + + private String sinceId, beforeId; + + public ListContainersCmdImpl(ListContainersCmd.Exec exec) { + super(exec); + } @Override - public int getLimit() { + public int getLimit() { return limit; } @Override - public boolean hasShowSizeEnabled() { + public boolean hasShowSizeEnabled() { return showSize; } @Override - public boolean hasShowAllEnabled() { + public boolean hasShowAllEnabled() { return showAll; } @Override - public String getSinceId() { + public String getSinceId() { return sinceId; } @Override - public String getBeforeId() { + public String getBeforeId() { return beforeId; } @Override - public ListContainersCmd withShowAll(boolean showAll) { - this.showAll = showAll; - return this; - } - - @Override - public ListContainersCmd withShowSize(boolean showSize) { - this.showSize = showSize; - return this; - } - - @Override - public ListContainersCmd withLimit(int limit) { - checkArgument(limit > 0, "limit must be greater 0"); - this.limit = limit; - return this; - } - - @Override - public ListContainersCmd withSince(String since) { - checkNotNull(since, "since was not specified"); - this.sinceId = since; - return this; - } - - @Override - public ListContainersCmd withBefore(String before) { - checkNotNull(before, "before was not specified"); - this.beforeId = before; - return this; - } + public ListContainersCmd withShowAll(boolean showAll) { + this.showAll = showAll; + return this; + } + + @Override + public ListContainersCmd withShowSize(boolean showSize) { + this.showSize = showSize; + return this; + } + + @Override + public ListContainersCmd withLimit(int limit) { + checkArgument(limit > 0, "limit must be greater 0"); + this.limit = limit; + return this; + } + + @Override + public ListContainersCmd withSince(String since) { + checkNotNull(since, "since was not specified"); + this.sinceId = since; + return this; + } + + @Override + public ListContainersCmd withBefore(String before) { + checkNotNull(before, "before was not specified"); + this.beforeId = before; + return this; + } @Override public String toString() { - return new StringBuilder("ps ") - .append(showAll ? "--all=true" : "") - .append(showSize ? "--size=true" : "") - .append(sinceId != null ? "--since " + sinceId : "") - .append(beforeId != null ? "--before " + beforeId : "") - .append(limit != -1 ? "-n " + limit : "") - .toString(); + return new StringBuilder("ps ").append(showAll ? "--all=true" : "").append(showSize ? "--size=true" : "") + .append(sinceId != null ? "--since " + sinceId : "") + .append(beforeId != null ? "--before " + beforeId : "").append(limit != -1 ? "-n " + limit : "") + .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 998dded5d..ddd4dc79f 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -10,47 +10,47 @@ /** * List images * - * @param showAll - Show all images (by default filter out the intermediate images used to build) - * @param filters - a json encoded value of the filters (a map[string][]string) to process on the images list. + * @param showAll + * - Show all images (by default filter out the intermediate images used to build) + * @param filters + * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ -public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { +public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { - private String filters; + private String filters; - private boolean showAll = false; + private boolean showAll = false; - public ListImagesCmdImpl(ListImagesCmd.Exec exec) { - super(exec); - } + public ListImagesCmdImpl(ListImagesCmd.Exec exec) { + super(exec); + } @Override - public String getFilters() { + public String getFilters() { return filters; } @Override - public boolean hasShowAllEnabled() { + public boolean hasShowAllEnabled() { return showAll; } @Override - public ListImagesCmd withShowAll(boolean showAll) { - this.showAll = showAll; - return this; - } - - @Override - public ListImagesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; - return this; - } + public ListImagesCmd withShowAll(boolean showAll) { + this.showAll = showAll; + return this; + } + + @Override + public ListImagesCmd withFilters(String filter) { + checkNotNull(filter, "filters have not been specified"); + this.filters = filter; + return this; + } @Override public String toString() { - return new StringBuilder("images ") - .append(showAll ? "--all=true" : "") - .append(filters != null ? "--filter " + filters : "") - .toString(); + return new StringBuilder("images ").append(showAll ? "--all=true" : "") + .append(filters != null ? "--filter " + filters : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index d405a8026..2a6232554 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -17,132 +17,128 @@ * @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. * @param tail - * - `all` or ``, Output specified number of lines at the end of logs + * - `all` or ``, Output specified number of lines at the end of logs */ public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd { - private String containerId; + private String containerId; - private int tail = -1; + private int tail = -1; - private boolean followStream, timestamps, stdout, stderr; + private boolean followStream, timestamps, stdout, stderr; - public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public int getTail() { + public int getTail() { return tail; } @Override - public boolean hasFollowStreamEnabled() { + public boolean hasFollowStreamEnabled() { return followStream; } @Override - public boolean hasTimestampsEnabled() { + public boolean hasTimestampsEnabled() { return timestamps; } @Override - public boolean hasStdoutEnabled() { + public boolean hasStdoutEnabled() { return stdout; } @Override - public boolean hasStderrEnabled() { + public boolean hasStderrEnabled() { return stderr; } @Override - public LogContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public LogContainerCmd withFollowStream() { - return withFollowStream(true); - } - - @Override - public LogContainerCmd withFollowStream(boolean followStream) { - this.followStream = followStream; - return this; - } - - @Override - public LogContainerCmd withTimestamps() { - return withTimestamps(true); - } - - @Override - public LogContainerCmd withTimestamps(boolean timestamps) { - this.timestamps = timestamps; - return this; - } - - @Override - public LogContainerCmd withStdOut() { - return withStdOut(true); - } - - @Override - public LogContainerCmd withStdOut(boolean stdout) { - this.stdout = stdout; - return this; - } - - @Override - public LogContainerCmd withStdErr() { - return withStdErr(true); - } - - @Override - public LogContainerCmd withStdErr(boolean stderr) { - this.stderr = stderr; - return this; - } - - @Override - public LogContainerCmd withTailAll() { - this.tail = -1; - return this; - } - - - @Override - public LogContainerCmd withTail(int tail) { - this.tail = tail; - return this; - } + public LogContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public LogContainerCmd withFollowStream() { + return withFollowStream(true); + } + + @Override + public LogContainerCmd withFollowStream(boolean followStream) { + this.followStream = followStream; + return this; + } + + @Override + public LogContainerCmd withTimestamps() { + return withTimestamps(true); + } + + @Override + public LogContainerCmd withTimestamps(boolean timestamps) { + this.timestamps = timestamps; + return this; + } + + @Override + public LogContainerCmd withStdOut() { + return withStdOut(true); + } + + @Override + public LogContainerCmd withStdOut(boolean stdout) { + this.stdout = stdout; + return this; + } + + @Override + public LogContainerCmd withStdErr() { + return withStdErr(true); + } + + @Override + public LogContainerCmd withStdErr(boolean stderr) { + this.stderr = stderr; + return this; + } + + @Override + public LogContainerCmd withTailAll() { + this.tail = -1; + return this; + } + + @Override + public LogContainerCmd withTail(int tail) { + this.tail = tail; + return this; + } @Override public String toString() { - return new StringBuilder("logs ") - .append(followStream ? "--follow=true" : "") - .append(timestamps ? "--timestamps=true" : "") - .append(containerId) - .toString(); + return new StringBuilder("logs ").append(followStream ? "--follow=true" : "") + .append(timestamps ? "--timestamps=true" : "").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public InputStream exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index 5ea60fe86..81a30dcde 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -8,42 +8,42 @@ /** * Pause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class PauseContainerCmdImpl extends AbstrDockerCmd implements PauseContainerCmd { - private String containerId; + private String containerId; - public PauseContainerCmdImpl(PauseContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public PauseContainerCmdImpl(PauseContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public PauseContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public PauseContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { - return new StringBuilder("pause ") - .append(containerId) - .toString(); + return new StringBuilder("pause ").append(containerId).toString(); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); } - - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java index 15cc1f5b3..c9118a095 100644 --- a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java @@ -8,7 +8,7 @@ */ public class PingCmdImpl extends AbstrDockerCmd implements PingCmd { - public PingCmdImpl(PingCmd.Exec exec) { - super(exec); - } + public PingCmdImpl(PingCmd.Exec exec) { + super(exec); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index d1d4ee026..488562b99 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -16,52 +16,49 @@ public class PullImageCmdImpl extends AbstrAuthCfgDockerCmd implements PushImageCmd { +public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd implements + PushImageCmd { private String name; + private String tag; public PushImageCmdImpl(PushImageCmd.Exec exec, String name) { - super(exec); - withName(name); + super(exec); + withName(name); } @Override - public String getName() { + public String getName() { return name; } @@ -31,17 +34,19 @@ public String getTag() { } /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. - */ - @Override - public PushImageCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; - } + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + @Override + public PushImageCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } /** - * @param tag The image's tag. Can be null or empty. + * @param tag + * The image's tag. Can be null or empty. */ @Override public PushImageCmd withTag(String tag) { @@ -52,16 +57,15 @@ public PushImageCmd withTag(String tag) { @Override public String toString() { - return new StringBuilder("push ") - .append(name) - .toString(); + return new StringBuilder("push ").append(name).toString(); } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ @Override public Response exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 7cd063956..ff23023d2 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -8,72 +8,73 @@ /** * Remove a container. * - * @param removeVolumes - true or false, Remove the volumes associated to the container. Defaults to false - * @param force - true or false, Removes the container even if it was running. Defaults to false + * @param removeVolumes + * - true or false, Remove the volumes associated to the container. Defaults to false + * @param force + * - true or false, Removes the container even if it was running. Defaults to false */ -public class RemoveContainerCmdImpl extends AbstrDockerCmd implements RemoveContainerCmd { +public class RemoveContainerCmdImpl extends AbstrDockerCmd implements RemoveContainerCmd { - private String containerId; + private String containerId; - private boolean removeVolumes, force; + private boolean removeVolumes, force; - public RemoveContainerCmdImpl(RemoveContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public RemoveContainerCmdImpl(RemoveContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } - @Override - public String getContainerId() { - return containerId; - } + @Override + public String getContainerId() { + return containerId; + } - @Override - public boolean hasRemoveVolumesEnabled() { - return removeVolumes; - } + @Override + public boolean hasRemoveVolumesEnabled() { + return removeVolumes; + } - @Override - public boolean hasForceEnabled() { - return force; - } + @Override + public boolean hasForceEnabled() { + return force; + } - @Override - public RemoveContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + @Override + public RemoveContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes) { - this.removeVolumes = removeVolumes; - return this; - } + @Override + public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes) { + this.removeVolumes = removeVolumes; + return this; + } - @Override - public RemoveContainerCmd withForce() { - return withForce(true); - } + @Override + public RemoveContainerCmd withForce() { + return withForce(true); + } - @Override - public RemoveContainerCmd withForce(boolean force) { - this.force = force; - return this; - } + @Override + public RemoveContainerCmd withForce(boolean force) { + this.force = force; + return this; + } - @Override - public String toString() { - return new StringBuilder("rm ") - .append(removeVolumes ? "--volumes=true" : "") - .append(force ? "--force=true" : "").append(containerId) - .toString(); - } + @Override + public String toString() { + return new StringBuilder("rm ").append(removeVolumes ? "--volumes=true" : "") + .append(force ? "--force=true" : "").append(containerId).toString(); + } - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 87e096aae..ee9e7f33b 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -12,73 +12,71 @@ */ public class RemoveImageCmdImpl extends AbstrDockerCmd implements RemoveImageCmd { - private String imageId; + private String imageId; - private boolean force, noPrune; + private boolean force, noPrune; - public RemoveImageCmdImpl(RemoveImageCmd.Exec exec, String imageId) { - super(exec); - withImageId(imageId); - } + public RemoveImageCmdImpl(RemoveImageCmd.Exec exec, String imageId) { + super(exec); + withImageId(imageId); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public boolean hasForceEnabled() { + public boolean hasForceEnabled() { return force; } @Override - public boolean hasNoPruneEnabled() { + public boolean hasNoPruneEnabled() { return noPrune; } @Override - public RemoveImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } - - @Override - public RemoveImageCmd withForce() { - return withForce(true); - } - - @Override - public RemoveImageCmd withForce(boolean force) { - this.force = force; - return this; - } - - @Override - public RemoveImageCmd withNoPrune() { - return withNoPrune(true); - } - - @Override - public RemoveImageCmd withNoPrune(boolean noPrune) { - this.noPrune = noPrune; - return this; - } + public RemoveImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } + + @Override + public RemoveImageCmd withForce() { + return withForce(true); + } + + @Override + public RemoveImageCmd withForce(boolean force) { + this.force = force; + return this; + } + + @Override + public RemoveImageCmd withNoPrune() { + return withNoPrune(true); + } + + @Override + public RemoveImageCmd withNoPrune(boolean noPrune) { + this.noPrune = noPrune; + return this; + } @Override public String toString() { - return new StringBuilder("rmi ") - .append(noPrune ? "--no-prune=true" : "") - .append(force ? "--force=true" : "") - .append(imageId) - .toString(); + return new StringBuilder("rmi ").append(noPrune ? "--no-prune=true" : "").append(force ? "--force=true" : "") + .append(imageId).toString(); } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index adcac9b4c..4766dfdb4 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -9,57 +9,56 @@ /** * Restart a running container. * - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public class RestartContainerCmdImpl extends AbstrDockerCmd implements RestartContainerCmd { - private String containerId; + private String containerId; - private int timeout = 10; + private int timeout = 10; - public RestartContainerCmdImpl(RestartContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public RestartContainerCmdImpl(RestartContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public int getTimeout() { + public int getTimeout() { return timeout; } @Override - public RestartContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public RestartContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public RestartContainerCmd withtTimeout(int timeout) { - checkArgument(timeout >= 0, "timeout must be greater or equal 0"); - this.timeout = timeout; - return this; - } + @Override + public RestartContainerCmd withtTimeout(int timeout) { + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + this.timeout = timeout; + return this; + } @Override public String toString() { - return new StringBuilder("restart ") - .append("--time=" + timeout + " ") - .append(containerId) - .toString(); + return new StringBuilder("restart ").append("--time=" + timeout + " ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 30bb13b2f..ab87c2ea8 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -9,6 +9,7 @@ public class SaveImageCmdImpl extends AbstrDockerCmd implements SaveImageCmd { private String name; + private String tag; public SaveImageCmdImpl(SaveImageCmd.Exec exec, String name) { @@ -27,7 +28,8 @@ public String getTag() { } /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ @Override public SaveImageCmd withName(String name) { @@ -37,7 +39,8 @@ public SaveImageCmd withName(String name) { } /** - * @param tag The image's tag. Can be null or empty. + * @param tag + * The image's tag. Can be null or empty. */ @Override public SaveImageCmd withTag(String tag) { @@ -48,13 +51,12 @@ public SaveImageCmd withTag(String tag) { @Override public String toString() { - return new StringBuilder("get ") - .append(name) - .toString(); + return new StringBuilder("get ").append(name).toString(); } /** - * @throws com.github.dockerjava.api.NotFoundException No such image + * @throws com.github.dockerjava.api.NotFoundException + * No such image */ @Override public InputStream exec() throws NotFoundException { diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 82c94e49f..6630377c8 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -10,34 +10,33 @@ /** * Search images * - * @param term - search term + * @param term + * - search term * */ -public class SearchImagesCmdImpl extends AbstrDockerCmd> implements SearchImagesCmd { +public class SearchImagesCmdImpl extends AbstrDockerCmd> implements SearchImagesCmd { - private String term; + private String term; - public SearchImagesCmdImpl(SearchImagesCmd.Exec exec, String term) { - super(exec); - withTerm(term); - } + public SearchImagesCmdImpl(SearchImagesCmd.Exec exec, String term) { + super(exec); + withTerm(term); + } @Override - public String getTerm() { + public String getTerm() { return term; } @Override - public SearchImagesCmd withTerm(String term) { - checkNotNull(term, "term was not specified"); - this.term = term; - return this; - } + public SearchImagesCmd withTerm(String term) { + checkNotNull(term, "term was not specified"); + this.term = term; + return this; + } @Override public String toString() { - return new StringBuilder("search ") - .append(term) - .toString(); + return new StringBuilder("search ").append(term).toString(); } } 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 33fcf6371..2672056f2 100644 --- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -16,6 +16,7 @@ public class StatsCmdImpl extends AbstrDockerCmd implements StatsCmd { private String containerId; + private StatsCallback statsCallback; public StatsCmdImpl(StatsCmd.Exec exec, StatsCallback statsCallback) { @@ -29,19 +30,18 @@ public StatsCmd withContainerId(String containerId) { 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; @@ -54,8 +54,6 @@ public ExecutorService exec() { @Override public String toString() { - return new StringBuilder("stats") - .append(containerId != null ? " --id=" + containerId : "") - .toString(); + return new StringBuilder("stats").append(containerId != null ? " --id=" + containerId : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index e961bf8ba..28373e2ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -10,59 +10,60 @@ /** * Stop a running container. * - * @param containerId - Id of the container - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param containerId + * - Id of the container + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public class StopContainerCmdImpl extends AbstrDockerCmd implements StopContainerCmd { - private String containerId; + private String containerId; - private int timeout = 10; + private int timeout = 10; - public StopContainerCmdImpl(StopContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public StopContainerCmdImpl(StopContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public int getTimeout() { + public int getTimeout() { return timeout; } @Override - public StopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public StopContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public StopContainerCmd withTimeout(int timeout) { - checkArgument(timeout >= 0, "timeout must be greater or equal 0"); - this.timeout = timeout; - return this; - } + @Override + public StopContainerCmd withTimeout(int timeout) { + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + this.timeout = timeout; + return this; + } @Override public String toString() { - return new StringBuilder("stop ") - .append("--time=" + timeout + " ") - .append(containerId) - .toString(); + return new StringBuilder("stop ").append("--time=" + timeout + " ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container - * @throws NotModifiedException Container already stopped - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException { - return super.exec(); - } + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already stopped + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index 8655ddfe8..e31151147 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -4,87 +4,86 @@ import com.github.dockerjava.api.command.TagImageCmd; - /** * Tag an image into a repository * - * @param image The local image to tag (either a name or an id) - * @param repository The repository to tag in - * @param force (not documented) + * @param image + * The local image to tag (either a name or an id) + * @param repository + * The repository to tag in + * @param force + * (not documented) * */ -public class TagImageCmdImpl extends AbstrDockerCmd implements TagImageCmd { +public class TagImageCmdImpl extends AbstrDockerCmd implements TagImageCmd { - private String imageId, repository, tag; + private String imageId, repository, tag; - private boolean force; + private boolean force; - public TagImageCmdImpl(TagImageCmd.Exec exec, String imageId, String repository, String tag) { - super(exec); - withImageId(imageId); - withRepository(repository); - withTag(tag); - } + public TagImageCmdImpl(TagImageCmd.Exec exec, String imageId, String repository, String tag) { + super(exec); + withImageId(imageId); + withRepository(repository); + withTag(tag); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } @Override - public boolean hasForceEnabled() { + public boolean hasForceEnabled() { return force; } @Override - public TagImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } - - @Override - public TagImageCmd withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } - - @Override - public TagImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } - - @Override - public TagImageCmd withForce() { - return withForce(true); - } - - @Override - public TagImageCmd withForce(boolean force) { - this.force = force; - return this; - } + public TagImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } + + @Override + public TagImageCmd withRepository(String repository) { + checkNotNull(repository, "repository was not specified"); + this.repository = repository; + return this; + } + + @Override + public TagImageCmd withTag(String tag) { + checkNotNull(tag, "tag was not specified"); + this.tag = tag; + return this; + } + + @Override + public TagImageCmd withForce() { + return withForce(true); + } + + @Override + public TagImageCmd withForce(boolean force) { + this.force = force; + return this; + } @Override public String toString() { - return new StringBuilder("tag ") - .append(force ? "--force=true " : "") - .append(repository != null ? repository + "/" : "") - .append(imageId) - .append(tag != null ? ":" + tag : "") - .toString(); + return new StringBuilder("tag ").append(force ? "--force=true " : "") + .append(repository != null ? repository + "/" : "").append(imageId) + .append(tag != null ? ":" + tag : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 5f7190fb4..b4414f29e 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -9,55 +9,53 @@ /** * List processes running inside a container */ -public class TopContainerCmdImpl extends AbstrDockerCmd implements TopContainerCmd { +public class TopContainerCmdImpl extends AbstrDockerCmd implements + TopContainerCmd { - private String containerId; + private String containerId; - private String psArgs; + private String psArgs; - public TopContainerCmdImpl(TopContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public TopContainerCmdImpl(TopContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getPsArgs() { + public String getPsArgs() { return psArgs; } @Override - public TopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - + public TopContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public TopContainerCmd withPsArgs(String psArgs) { - checkNotNull(psArgs, "psArgs was not specified"); - this.psArgs = psArgs; - return this; - } + @Override + public TopContainerCmd withPsArgs(String psArgs) { + checkNotNull(psArgs, "psArgs was not specified"); + this.psArgs = psArgs; + return this; + } @Override public String toString() { - return new StringBuilder("top ") - .append(containerId) - .append(psArgs != null ? " " + psArgs : "") - .toString(); + return new StringBuilder("top ").append(containerId).append(psArgs != null ? " " + psArgs : "").toString(); } /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public TopContainerResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 92d715bcc..583d519c8 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -8,42 +8,42 @@ /** * Unpause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class UnpauseContainerCmdImpl extends AbstrDockerCmd implements UnpauseContainerCmd { - private String containerId; + private String containerId; - public UnpauseContainerCmdImpl(UnpauseContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public UnpauseContainerCmdImpl(UnpauseContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public UnpauseContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public UnpauseContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { - return new StringBuilder("pause ") - .append(containerId) - .toString(); + return new StringBuilder("pause ").append(containerId).toString(); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); } - - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java index 211ed1406..67f46ce3a 100644 --- a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java @@ -6,14 +6,14 @@ /** * Returns the Docker version info. */ -public class VersionCmdImpl extends AbstrDockerCmd implements VersionCmd { +public class VersionCmdImpl extends AbstrDockerCmd implements VersionCmd { - @Override + @Override public String toString() { return "version"; - } - + } + public VersionCmdImpl(VersionCmd.Exec exec) { - super(exec); - } + super(exec); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index d6250cc6f..702eebd33 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -11,24 +11,24 @@ */ public class WaitContainerCmdImpl extends AbstrDockerCmd implements WaitContainerCmd { - private String containerId; + private String containerId; - public WaitContainerCmdImpl(WaitContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public WaitContainerCmdImpl(WaitContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public WaitContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public WaitContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } @Override public String toString() { 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 802299a7c..5997bbefa 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -31,213 +31,201 @@ */ public class Dockerfile { - public final File dockerFile; + public final File dockerFile; - public Dockerfile(File dockerFile) { + public Dockerfile(File dockerFile) { - if (!dockerFile.exists()) { - throw new IllegalStateException( - String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); - } - - if (!dockerFile.isFile()) { - throw new IllegalStateException( - String.format("Dockerfile %s is not a file", dockerFile.getAbsolutePath())); - } - - this.dockerFile = dockerFile; - - } - - private static class LineTransformer - implements Function> { + if (!dockerFile.exists()) { + throw new IllegalStateException(String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); + } - private int line = 0; + if (!dockerFile.isFile()) { + throw new IllegalStateException(String.format("Dockerfile %s is not a file", dockerFile.getAbsolutePath())); + } - @Override - public Optional apply(String input) { - try { - line++; - return DockerfileStatement.createFromLine(input); + this.dockerFile = dockerFile; - } catch (Exception ex) { - throw new DockerClientException("Error on dockerfile line " + line); - } } - } - public Iterable getStatements() throws IOException { - Collection dockerFileContent = FileUtils.readLines(dockerFile); + private static class LineTransformer implements Function> { - if (dockerFileContent.size() <= 0) { - throw new DockerClientException(String.format( - "Dockerfile %s is empty", dockerFile)); - } + private int line = 0; - Collection> optionals = Collections2 - .transform(dockerFileContent, new LineTransformer()); - - return Optional.presentInstances(optionals); - } - - public List getIgnores() throws IOException { - List ignores = new ArrayList(); - File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); - if (dockerIgnoreFile.exists()) { - int lineNumber = 0; - List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); - for (String pattern : dockerIgnoreFileContent) { - lineNumber++; - pattern = pattern.trim(); - if (pattern.isEmpty()) { - continue; // skip empty lines - } - pattern = FilenameUtils.normalize(pattern); - try { - // validate pattern and make sure we aren't excluding Dockerfile - if (GoLangFileMatch.match(pattern, "Dockerfile")) { - throw new DockerClientException( - String.format( - "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", - pattern, lineNumber)); - } - ignores.add(pattern); - } catch (GoLangFileMatchException e) { - throw new DockerClientException(String.format( - "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + @Override + public Optional apply(String input) { + try { + line++; + return DockerfileStatement.createFromLine(input); + + } catch (Exception ex) { + throw new DockerClientException("Error on dockerfile line " + line); + } } - } } - return ignores; - } + public Iterable getStatements() throws IOException { + Collection dockerFileContent = FileUtils.readLines(dockerFile); - public ScannedResult parse() throws IOException { - return new ScannedResult(); - } - + if (dockerFileContent.size() <= 0) { + throw new DockerClientException(String.format("Dockerfile %s is empty", dockerFile)); + } - public File getDockerFolder() { - return dockerFile.getParentFile(); - } + Collection> optionals = Collections2.transform(dockerFileContent, + new LineTransformer()); + return Optional.presentInstances(optionals); + } - /** - * Result of scanning / parsing a docker file. - */ - public class ScannedResult { + public List getIgnores() throws IOException { + List ignores = new ArrayList(); + File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); + if (dockerIgnoreFile.exists()) { + int lineNumber = 0; + List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); + for (String pattern : dockerIgnoreFileContent) { + lineNumber++; + pattern = pattern.trim(); + if (pattern.isEmpty()) { + continue; // skip empty lines + } + pattern = FilenameUtils.normalize(pattern); + try { + // validate pattern and make sure we aren't excluding Dockerfile + if (GoLangFileMatch.match(pattern, "Dockerfile")) { + throw new DockerClientException(String.format( + "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", pattern, + lineNumber)); + } + ignores.add(pattern); + } catch (GoLangFileMatchException e) { + throw new DockerClientException(String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + } + } + } + return ignores; + } - final List ignores; - final Map environmentMap = new HashMap(); - final List filesToAdd = new ArrayList(); + public ScannedResult parse() throws IOException { + return new ScannedResult(); + } - public InputStream buildDockerFolderTar() { - return buildDockerFolderTar(getDockerFolder()); + public File getDockerFolder() { + return dockerFile.getParentFile(); } - public InputStream buildDockerFolderTar(File directory) { + /** + * Result of scanning / parsing a docker file. + */ + public class ScannedResult { - // ARCHIVE TAR - File dockerFolderTar = null; + final List ignores; - try { - String archiveNameWithOutExtension = UUID.randomUUID().toString(); + final Map environmentMap = new HashMap(); - dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, - filesToAdd, - archiveNameWithOutExtension); - return FileUtils.openInputStream(dockerFolderTar); + final List filesToAdd = new ArrayList(); - } catch (IOException ex) { - FileUtils.deleteQuietly(dockerFolderTar); - throw new DockerClientException( - "Error occurred while preparing Docker context folder.", ex); - } - } + public InputStream buildDockerFolderTar() { + return buildDockerFolderTar(getDockerFolder()); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("ignores", ignores) - .add("environmentMap", environmentMap) - .add("filesToAdd", filesToAdd) - .toString(); - } + public InputStream buildDockerFolderTar(File directory) { - public ScannedResult() throws IOException { + // ARCHIVE TAR + File dockerFolderTar = null; - ignores = getIgnores(); - filesToAdd.add(dockerFile); + try { + String archiveNameWithOutExtension = UUID.randomUUID().toString(); - for (DockerfileStatement statement : getStatements()) { - if (statement instanceof DockerfileStatement.Env) { - processEnvStatement((DockerfileStatement.Env) statement); - } else if (statement instanceof DockerfileStatement.Add) { - processAddStatement((DockerfileStatement.Add) statement); - } - } - } + dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, + archiveNameWithOutExtension); + return FileUtils.openInputStream(dockerFolderTar); - private void processAddStatement(DockerfileStatement.Add add) throws IOException { + } catch (IOException ex) { + FileUtils.deleteQuietly(dockerFolderTar); + throw new DockerClientException("Error occurred while preparing Docker context folder.", ex); + } + } - add = add.transform(environmentMap); + @Override + public String toString() { + return Objects.toStringHelper(this).add("ignores", ignores).add("environmentMap", environmentMap) + .add("filesToAdd", filesToAdd).toString(); + } - if (add.isFileResource()) { + public ScannedResult() throws IOException { - File dockerFolder = getDockerFolder(); - String resource = add.source; + ignores = getIgnores(); + filesToAdd.add(dockerFile); - File src = new File(resource); - if (!src.isAbsolute()) { - src = new File(dockerFolder, resource); - } else { - throw new DockerClientException(String.format( - "Source file %s must be relative to %s", - src, dockerFolder)); + for (DockerfileStatement statement : getStatements()) { + if (statement instanceof DockerfileStatement.Env) { + processEnvStatement((DockerfileStatement.Env) statement); + } else if (statement instanceof DockerfileStatement.Add) { + processAddStatement((DockerfileStatement.Add) statement); + } + } } - 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 { - filesToAdd.addAll(resolveWildcards(src, ignores)); + private void processAddStatement(DockerfileStatement.Add add) throws IOException { + + add = add.transform(environmentMap); + + if (add.isFileResource()) { + + File dockerFolder = getDockerFolder(); + String resource = add.source; + + File src = new File(resource); + if (!src.isAbsolute()) { + src = new File(dockerFolder, resource); + } else { + throw new DockerClientException(String.format("Source file %s must be relative to %s", src, + dockerFolder)); + } + + 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 { + filesToAdd.addAll(resolveWildcards(src, ignores)); + } + } } - } - } - private Collection resolveWildcards(File file, List ignores) { - List filesToAdd = new ArrayList(); - - File parent = file.getParentFile(); - if (parent != null) { - if (parent.isDirectory()) { - Collection files = FileUtils.listFiles(parent, - new GoLangMatchFileFilter(parent, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else { - filesToAdd.addAll(resolveWildcards(parent, ignores)); + private Collection resolveWildcards(File file, List ignores) { + List filesToAdd = new ArrayList(); + + File parent = file.getParentFile(); + if (parent != null) { + if (parent.isDirectory()) { + Collection files = FileUtils.listFiles(parent, new GoLangMatchFileFilter(parent, ignores), + TrueFileFilter.INSTANCE); + filesToAdd.addAll(files); + } else { + filesToAdd.addAll(resolveWildcards(parent, ignores)); + } + } else { + throw new DockerClientException(String.format("Source file %s doesn't exist", file)); + } + + return filesToAdd; } - } else { - throw new DockerClientException(String.format( - "Source file %s doesn't exist", file)); - } - return filesToAdd; - } + private void processEnvStatement(DockerfileStatement.Env env) { - private void processEnvStatement(DockerfileStatement.Env env) { + environmentMap.put(env.variable, env.value); + } - environmentMap.put(env.variable, env.value); } - } - } diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index c048f77dd..7b6581e42 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -16,191 +16,182 @@ */ public abstract class DockerfileStatement { - private DockerfileStatement() { - } + private DockerfileStatement() { + } - public T transform(Map env) { - return (T) this; - } + public T transform(Map env) { + return (T) this; + } - protected String filterForEnvironmentVars(Map environmentMap, - String extractedResource) { + protected String filterForEnvironmentVars(Map environmentMap, String extractedResource) { - if (environmentMap.size() > 0) { + if (environmentMap.size() > 0) { - String currentResourceContent = extractedResource; + String currentResourceContent = extractedResource; - for (Map.Entry entry : environmentMap.entrySet()) { + for (Map.Entry entry : environmentMap.entrySet()) { - String variable = entry.getKey(); + String variable = entry.getKey(); - String replacementValue = entry.getValue(); + String replacementValue = entry.getValue(); - // handle: $VARIABLE case - currentResourceContent = currentResourceContent.replaceAll( - "\\$" + variable, Matcher.quoteReplacement(replacementValue)); + // handle: $VARIABLE case + currentResourceContent = currentResourceContent.replaceAll("\\$" + variable, + Matcher.quoteReplacement(replacementValue)); - // handle ${VARIABLE} case - currentResourceContent = currentResourceContent.replaceAll( - "\\$\\{" + variable + "\\}", Matcher.quoteReplacement(replacementValue)); + // handle ${VARIABLE} case + currentResourceContent = currentResourceContent.replaceAll("\\$\\{" + variable + "\\}", + Matcher.quoteReplacement(replacementValue)); - } + } - return currentResourceContent; - } else { - return extractedResource; + return currentResourceContent; + } else { + return extractedResource; + } } - } + /** + * A statement that we don't particularly care about. + */ + public static class OtherLine extends DockerfileStatement { - /** - * A statement that we don't particularly care about. - */ - public static class OtherLine extends DockerfileStatement { + public final String statement; - public final String statement; + public OtherLine(String statement) { + this.statement = statement; + } - public OtherLine(String statement) { - this.statement = statement; + @Override + public String toString() { + return statement; + } } - @Override - public String toString() { - return statement; - } - } + /** + * An ADD or a COPY + */ + public static class Add extends DockerfileStatement { - /** - * An ADD or a COPY - */ - public static class Add extends DockerfileStatement { + private static final Pattern ADD_OR_COPY_PATTERN = Pattern.compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); - private static final Pattern ADD_OR_COPY_PATTERN = Pattern - .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); + public final String source; - public final String source; - public final String destination; + public final String destination; - private Add(String source, String destination) { - this.source = source; - this.destination = destination; - } + private Add(String source, String destination) { + this.source = source; + this.destination = destination; + } - private Add(final Matcher matcher) { - source = matcher.group(2); - destination = matcher.group(3); - } + private Add(final Matcher matcher) { + source = matcher.group(2); + destination = matcher.group(3); + } - @Override - public Add transform(Map env) { - String resource = filterForEnvironmentVars(env, source).trim(); - return new Add(resource, destination); - } + @Override + public Add transform(Map env) { + String resource = filterForEnvironmentVars(env, source).trim(); + return new Add(resource, destination); + } - public boolean isFileResource() { - URI uri; - try { - uri = new URI(source); - } catch (URISyntaxException e) { - return false; - } - return uri.getScheme() == null || "file".equals(uri.getScheme()); - } + public boolean isFileResource() { + URI uri; + try { + uri = new URI(source); + } catch (URISyntaxException e) { + return false; + } + return uri.getScheme() == null || "file".equals(uri.getScheme()); + } - /** - * Createa an Add if it matches, or missing if not. - * - * @param statement statement that may be an ADD or a COPY - * @return optional typed item. - */ - public static Optional create(String statement) { - Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); - if (!matcher.find()) { - return Optional.absent(); - } + /** + * Createa an Add if it matches, or missing if not. + * + * @param statement + * statement that may be an ADD or a COPY + * @return optional typed item. + */ + public static Optional create(String statement) { + Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } - if (matcher.groupCount() != 3) { - throw new DockerClientException("Wrong ADD or COPY format"); - } - - return Optional.of(new Add(matcher)); - } + if (matcher.groupCount() != 3) { + throw new DockerClientException("Wrong ADD or COPY format"); + } + return Optional.of(new Add(matcher)); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("source", source) - .add("destination", destination) - .toString(); + @Override + public String toString() { + return Objects.toStringHelper(this).add("source", source).add("destination", destination).toString(); + } } - } - public static class Env extends DockerfileStatement { + public static class Env extends DockerfileStatement { - private static final Pattern ENV_PATTERN = Pattern - .compile("^ENV\\s+(.*)\\s+(.*)$"); + private static final Pattern ENV_PATTERN = Pattern.compile("^ENV\\s+(.*)\\s+(.*)$"); - public final String variable; - public final String value; + public final String variable; - private Env(String variable, String value) { - this.variable = variable; - this.value = value; - } + public final String value; - private Env(Matcher envMatcher) { - this.variable = envMatcher.group(1).trim(); - this.value = envMatcher.group(2).trim(); - } + private Env(String variable, String value) { + this.variable = variable; + this.value = value; + } - public static Optional create(String statement) { - Matcher matcher = ENV_PATTERN.matcher(statement.trim()); - if (!matcher.find()) { - return Optional.absent(); - } + private Env(Matcher envMatcher) { + this.variable = envMatcher.group(1).trim(); + this.value = envMatcher.group(2).trim(); + } - if (matcher.groupCount() != 2) { - throw new DockerClientException("Wrong ENV format"); - } + public static Optional create(String statement) { + Matcher matcher = ENV_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } - return Optional.of(new Env(matcher)); - } + if (matcher.groupCount() != 2) { + throw new DockerClientException("Wrong ENV format"); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("variable", variable) - .add("value", value) - .toString(); - } - } - - /** - * Return a dockerfile statement - */ - public static Optional createFromLine(String cmd) { - if (cmd.trim().isEmpty() || cmd.startsWith("#")) { - return Optional.absent(); + return Optional.of(new Env(matcher)); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("variable", variable).add("value", value).toString(); + } } - Optional line; + /** + * Return a dockerfile statement + */ + public static Optional createFromLine(String cmd) { + if (cmd.trim().isEmpty() || cmd.startsWith("#")) { + return Optional.absent(); + } - line = Add.create(cmd); + Optional line; - if (line.isPresent()) { - return line; - } + line = Add.create(cmd); - line = Env.create(cmd); + if (line.isPresent()) { + return line; + } - if (line.isPresent()) { - return line; - } + line = Env.create(cmd); - return Optional.of(new OtherLine(cmd)); + if (line.isPresent()) { + return line; + } + return Optional.of(new OtherLine(cmd)); - } + } } diff --git a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java index b4431b1f4..e4ba60f90 100644 --- a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java @@ -9,27 +9,24 @@ import javax.ws.rs.core.Response; /** - * Default implementation of RedirectStrategy honors the restrictions - * on automatic redirection of entity enclosing methods such as POST - * and PUT imposed by the HTTP specification. 302 Moved Temporarily, - * 301 Moved Permanently and 307 Temporary Redirect status codes will - * result in an automatic redirect of HEAD and GET methods only. + * Default implementation of RedirectStrategy honors the restrictions on automatic redirection of entity enclosing + * methods such as POST and PUT imposed by the HTTP specification. 302 Moved Temporarily, 301 Moved Permanently and 307 + * Temporary Redirect status codes will result in an automatic redirect of HEAD and GET methods only. * * {@link org.apache.http.impl.client.DefaultRedirectStrategy} * - * This filter allows arbitrary redirection for other methods. + * This filter allows arbitrary redirection for other methods. */ public class FollowRedirectsFilter implements ClientResponseFilter { @Override - public void filter(ClientRequestContext requestContext, - ClientResponseContext responseContext) throws IOException { + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { if (!responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.REDIRECTION)) { return; } - Response resp = requestContext.getClient().target(responseContext.getLocation()) - .request().method(requestContext.getMethod()); + Response resp = requestContext.getClient().target(responseContext.getLocation()).request() + .method(requestContext.getMethod()); responseContext.setEntityStream((InputStream) resp.getEntity()); responseContext.setStatusInfo(resp.getStatusInfo()); responseContext.setStatus(resp.getStatus()); diff --git a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java index f2911d961..19befc4b2 100644 --- a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java @@ -1,6 +1,5 @@ package com.github.dockerjava.core.util; - import javax.ws.rs.client.ClientRequestContext; import javax.ws.rs.client.ClientResponseContext; import javax.ws.rs.client.ClientResponseFilter; @@ -14,10 +13,10 @@ */ public class JsonClientFilter implements ClientResponseFilter { - @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { - if (responseContext.getMediaType() != null && responseContext.getMediaType().isCompatible(MediaType.TEXT_PLAIN_TYPE)) { + if (responseContext.getMediaType() != null + && responseContext.getMediaType().isCompatible(MediaType.TEXT_PLAIN_TYPE)) { String newContentType = "application/json" + responseContext.getMediaType().toString().substring(10); responseContext.getHeaders().putSingle("Content-Type", newContentType); } diff --git a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java index 5a72ba237..f7314109b 100644 --- a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java @@ -40,7 +40,6 @@ * holder. */ - import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -72,7 +71,6 @@ import javax.ws.rs.ext.WriterInterceptorContext; import javax.annotation.Priority; - /** * Universal logging filter. * @@ -88,44 +86,50 @@ public class LoggingFilter implements ContainerRequestFilter, ClientRequestFilte ClientResponseFilter, WriterInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class.getName()); + private static final String NOTIFICATION_PREFIX = "* "; + private static final String REQUEST_PREFIX = "> "; + private static final String RESPONSE_PREFIX = "< "; + private static final String ENTITY_LOGGER_PROPERTY = LoggingFilter.class.getName() + ".entityLogger"; - private static final Comparator>> COMPARATOR = - new Comparator>>() { + private static final Comparator>> COMPARATOR = new Comparator>>() { - @Override - public int compare(final Map.Entry> o1, final Map.Entry> o2) { - return o1.getKey().compareToIgnoreCase(o2.getKey()); - } - }; + @Override + public int compare(final Map.Entry> o1, final Map.Entry> o2) { + return o1.getKey().compareToIgnoreCase(o2.getKey()); + } + }; private static final int DEFAULT_MAX_ENTITY_SIZE = 8 * 1024; // @SuppressWarnings("NonConstantLogger") private final Logger logger; + private final AtomicLong _id = new AtomicLong(0); + private final boolean printEntity; + private final int maxEntitySize; /** - * Create a logging filter logging the request and response to a default JDK - * logger, named as the fully qualified class name of this class. Entity - * logging is turned off by default. + * Create a logging filter logging the request and response to a default JDK logger, named as the fully qualified + * class name of this class. Entity logging is turned off by default. */ public LoggingFilter() { this(LOGGER, false); } /** - * Create a logging filter with custom logger and custom settings of entity - * logging. + * Create a logging filter with custom logger and custom settings of entity logging. * - * @param logger the logger to log requests and responses. - * @param printEntity if true, entity will be logged as well up to the default maxEntitySize, which is 8KB + * @param logger + * the logger to log requests and responses. + * @param printEntity + * if true, entity will be logged as well up to the default maxEntitySize, which is 8KB */ @SuppressWarnings("BooleanParameter") public LoggingFilter(final Logger logger, final boolean printEntity) { @@ -135,13 +139,15 @@ public LoggingFilter(final Logger logger, final boolean printEntity) { } /** - * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size - * of entity to be buffered and logged. + * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size of + * entity to be buffered and logged. * - * @param logger the logger to log requests and responses. - * @param maxEntitySize maximum number of entity bytes to be logged (and buffered) - if the entity is larger, - * logging filter will print (and buffer in memory) only the specified number of bytes - * and print "...more..." string at the end. + * @param logger + * the logger to log requests and responses. + * @param maxEntitySize + * maximum number of entity bytes to be logged (and buffered) - if the entity is larger, logging filter + * will print (and buffer in memory) only the specified number of bytes and print "...more..." string at + * the end. */ public LoggingFilter(final Logger logger, final int maxEntitySize) { this.logger = logger; @@ -160,25 +166,21 @@ private StringBuilder prefixId(final StringBuilder b, final long id) { return b; } - private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, final URI uri) { - prefixId(b, id).append(NOTIFICATION_PREFIX) - .append(note) - .append(" on thread ").append(Thread.currentThread().getName()) - .append("\n"); - prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" "). - append(uri.toASCIIString()).append("\n"); + private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, + final URI uri) { + prefixId(b, id).append(NOTIFICATION_PREFIX).append(note).append(" on thread ") + .append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" ").append(uri.toASCIIString()).append("\n"); } private void printResponseLine(final StringBuilder b, final String note, final long id, final int status) { - prefixId(b, id).append(NOTIFICATION_PREFIX) - .append(note) - .append(" on thread ").append(Thread.currentThread().getName()).append("\n"); - prefixId(b, id).append(RESPONSE_PREFIX). - append(Integer.toString(status)). - append("\n"); + prefixId(b, id).append(NOTIFICATION_PREFIX).append(note).append(" on thread ") + .append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(RESPONSE_PREFIX).append(Integer.toString(status)).append("\n"); } - private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, final MultivaluedMap headers) { + private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, + final MultivaluedMap headers) { for (final Map.Entry> headerEntry : getSortedHeaders(headers.entrySet())) { final List val = headerEntry.getValue(); final String header = headerEntry.getKey(); @@ -201,7 +203,8 @@ private void printPrefixedHeaders(final StringBuilder b, final long id, final St } private Set>> getSortedHeaders(final Set>> headers) { - final TreeSet>> sortedHeaders = new TreeSet>>(COMPARATOR); + final TreeSet>> sortedHeaders = new TreeSet>>( + COMPARATOR); sortedHeaders.addAll(headers); return sortedHeaders; } @@ -241,7 +244,8 @@ public void filter(final ClientRequestContext context) throws IOException { } @Override - public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) throws IOException { + public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) + throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); @@ -260,7 +264,8 @@ public void filter(final ContainerRequestContext context) throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); - printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo().getRequestUri()); + printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo() + .getRequestUri()); printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getHeaders()); if (printEntity && context.hasEntity()) { @@ -271,7 +276,8 @@ public void filter(final ContainerRequestContext context) throws IOException { } @Override - public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException { + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) + throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); @@ -289,7 +295,8 @@ public void filter(final ContainerRequestContext requestContext, final Container } @Override - public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException { + public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, + WebApplicationException { final LoggingStream stream = (LoggingStream) writerInterceptorContext.getProperty(ENTITY_LOGGER_PROPERTY); writerInterceptorContext.proceed(); if (stream != null) { @@ -299,7 +306,9 @@ public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContex private class LoggingStream extends OutputStream { private final StringBuilder b; + private final OutputStream inner; + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); LoggingStream(final StringBuilder b, final OutputStream inner) { diff --git a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java index 7e9708564..24f31fb14 100644 --- a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java @@ -22,75 +22,71 @@ import com.github.dockerjava.api.UnauthorizedException; /** - * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s + * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s * * @author marcus * */ public class ResponseStatusExceptionFilter implements ClientResponseFilter { - @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { - int status = responseContext.getStatus(); - switch (status) { - case 200: - case 201: - case 204: - return; - case 304: - throw new NotModifiedException(getBodyAsMessage(responseContext)); - case 400: - throw new BadRequestException(getBodyAsMessage(responseContext)); - case 401: - throw new UnauthorizedException(getBodyAsMessage(responseContext)); - case 404: - throw new NotFoundException(getBodyAsMessage(responseContext)); - case 406: - throw new NotAcceptableException(getBodyAsMessage(responseContext)); - case 409: - throw new ConflictException(getBodyAsMessage(responseContext)); - case 500: - throw new InternalServerErrorException(getBodyAsMessage(responseContext)); - default: - throw new DockerException(getBodyAsMessage(responseContext), status); - } + int status = responseContext.getStatus(); + switch (status) { + case 200: + case 201: + case 204: + return; + case 304: + throw new NotModifiedException(getBodyAsMessage(responseContext)); + case 400: + throw new BadRequestException(getBodyAsMessage(responseContext)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(responseContext)); + case 404: + throw new NotFoundException(getBodyAsMessage(responseContext)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(responseContext)); + case 409: + throw new ConflictException(getBodyAsMessage(responseContext)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(responseContext)); + default: + throw new DockerException(getBodyAsMessage(responseContext), status); + } } - private String getBodyAsMessage(ClientResponseContext responseContext) - throws IOException { - if (responseContext.hasEntity()) { - int contentLength = responseContext.getLength(); - if (contentLength != -1) { - byte[] buffer = new byte[contentLength]; - try { - InputStream entityStream = responseContext.getEntityStream(); - IOUtils.readFully(entityStream, buffer); - entityStream.close(); - } - catch (EOFException e) { - return null; - } - Charset charset = null; - MediaType mediaType = responseContext.getMediaType(); - if (mediaType != null) { - String charsetName = mediaType.getParameters().get("charset"); - if (charsetName != null) { - try { - charset = Charset.forName(charsetName); - } - catch (Exception e) { - //Do noting... + private String getBodyAsMessage(ClientResponseContext responseContext) throws IOException { + if (responseContext.hasEntity()) { + int contentLength = responseContext.getLength(); + if (contentLength != -1) { + byte[] buffer = new byte[contentLength]; + try { + InputStream entityStream = responseContext.getEntityStream(); + IOUtils.readFully(entityStream, buffer); + entityStream.close(); + } catch (EOFException e) { + return null; + } + Charset charset = null; + MediaType mediaType = responseContext.getMediaType(); + if (mediaType != null) { + String charsetName = mediaType.getParameters().get("charset"); + if (charsetName != null) { + try { + charset = Charset.forName(charsetName); + } catch (Exception e) { + // Do noting... } - } - } - if (charset == null) { + } + } + if (charset == null) { charset = Charset.defaultCharset(); - } - String message = new String(buffer, charset); - return message; - } - } - return null; - } + } + String message = new String(buffer, charset); + return message; + } + } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java index 8cfe88b73..d4c9b8400 100644 --- a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java @@ -11,18 +11,16 @@ import org.slf4j.Logger; - /** - * A version of the logging filter that will avoid trying to log entities which can cause - * issues with the console. + * A version of the logging filter that will avoid trying to log entities which can cause issues with the console. * * @author sfitts * */ public class SelectiveLoggingFilter extends LoggingFilter { - + // Immutable'ish - private static final Set SKIPPED_CONTENT; + private static final Set SKIPPED_CONTENT; static { Set s = new HashSet(); s.add(MediaType.APPLICATION_OCTET_STREAM); @@ -30,12 +28,11 @@ public class SelectiveLoggingFilter extends LoggingFilter { SKIPPED_CONTENT = Collections.unmodifiableSet(s); } - public SelectiveLoggingFilter(Logger logger, boolean b) { - super(logger, b); - } + super(logger, b); + } - @Override + @Override public void filter(ClientRequestContext context) throws IOException { // Unless the content type is in the list of those we want to ellide, then just have // our super-class handle things. @@ -44,5 +41,5 @@ public void filter(ClientRequestContext context) throws IOException { super.filter(context); } } - + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 840395105..7ce68eed8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -16,62 +16,58 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; -public abstract class AbstrDockerCmdExec, RES_T> - implements DockerCmdExec { +public abstract class AbstrDockerCmdExec, RES_T> implements DockerCmdExec { - private WebTarget baseResource; + private WebTarget baseResource; - public AbstrDockerCmdExec(WebTarget baseResource) { - checkNotNull(baseResource, - "baseResource was not specified"); - this.baseResource = baseResource; - } + public AbstrDockerCmdExec(WebTarget baseResource) { + checkNotNull(baseResource, "baseResource was not specified"); + this.baseResource = baseResource; + } - protected WebTarget getBaseResource() { - return baseResource; - } + protected WebTarget getBaseResource() { + return baseResource; + } - protected String registryAuth(AuthConfig authConfig) { - try { - return Base64.encodeBase64String(new ObjectMapper() - .writeValueAsString(authConfig).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + protected String registryAuth(AuthConfig authConfig) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - protected String registryConfigs(AuthConfigurations authConfigs) { - try { - return Base64.encodeBase64String(new ObjectMapper() - .writeValueAsString(authConfigs).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public RES_T exec(CMD_T command) { - // this hack works because of ResponseStatusExceptionFilter - RES_T result; - try { - result = execute(command); - - } catch (ProcessingException e) { - if(e.getCause() instanceof DockerException) { - throw (DockerException)e.getCause(); - } else { - throw e; - } - } finally { - try { - command.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - return result; - } + protected String registryConfigs(AuthConfigurations authConfigs) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfigs).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - protected abstract RES_T execute(CMD_T command); + @Override + public RES_T exec(CMD_T command) { + // this hack works because of ResponseStatusExceptionFilter + RES_T result; + try { + result = execute(command); + + } catch (ProcessingException e) { + if (e.getCause() instanceof DockerException) { + throw (DockerException) e.getCause(); + } else { + throw e; + } + } finally { + try { + command.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return result; + } + + protected abstract RES_T execute(CMD_T command); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java index 23d6d1ab9..e30028f34 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -1,4 +1,5 @@ package com.github.dockerjava.jaxrs; + /* * Copyright (c) 2014 Spotify AB. * @@ -20,8 +21,6 @@ * under the License. */ - - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -36,291 +35,289 @@ import org.newsclub.net.unix.AFUNIXSocket; /** - * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options - * until the socket is connected. This is necessary because the Apache HTTP client attempts to - * set options prior to connecting the socket, which doesn't work for Unix sockets since options - * are being set on the underlying file descriptor. Until the socket is connected, the file - * descriptor doesn't exist. + * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options until the socket is + * connected. This is necessary because the Apache HTTP client attempts to set options prior to connecting the socket, + * which doesn't work for Unix sockets since options are being set on the underlying file descriptor. Until the socket + * is connected, the file descriptor doesn't exist. * - * This class also noop's any calls to setReuseAddress, which is called by the Apache client but - * isn't supported by AFUnixSocket. + * This class also noop's any calls to setReuseAddress, which is called by the Apache client but isn't supported by + * AFUnixSocket. */ public class ApacheUnixSocket extends Socket { - private final AFUNIXSocket inner; - - private final Queue optionsToSet = new ArrayDeque(); - - public ApacheUnixSocket() throws IOException { - this.inner = AFUNIXSocket.newInstance(); - } - - @Override - public void connect(final SocketAddress endpoint) throws IOException { - inner.connect(endpoint); - setAllSocketOptions(); - } - - @Override - public void connect(final SocketAddress endpoint, final int timeout) throws IOException { - inner.connect(endpoint, timeout); - setAllSocketOptions(); - } - - @Override - public void bind(final SocketAddress bindpoint) throws IOException { - inner.bind(bindpoint); - setAllSocketOptions(); - } - - @Override - public InetAddress getInetAddress() { - return inner.getInetAddress(); - } - - @Override - public InetAddress getLocalAddress() { - return inner.getLocalAddress(); - } - - @Override - public int getPort() { - return inner.getPort(); - } - - @Override - public int getLocalPort() { - return inner.getLocalPort(); - } - - @Override - public SocketAddress getRemoteSocketAddress() { - return inner.getRemoteSocketAddress(); - } - - @Override - public SocketAddress getLocalSocketAddress() { - return inner.getLocalSocketAddress(); - } - - @Override - public SocketChannel getChannel() { - return inner.getChannel(); - } - - @Override - public InputStream getInputStream() throws IOException { - return inner.getInputStream(); - } - - @Override - public OutputStream getOutputStream() throws IOException { - return inner.getOutputStream(); - } - - private void setSocketOption(final SocketOptionSetter s) throws SocketException { - if (inner.isConnected()) { - s.run(); - } else { - if (!optionsToSet.offer(s)) { - throw new SocketException("Failed to queue option"); - } - } - } - - private void setAllSocketOptions() throws SocketException { - for (SocketOptionSetter s : optionsToSet) { - s.run(); - } - } - - @Override - public void setTcpNoDelay(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setTcpNoDelay(on); - } - }); - } - - @Override - public boolean getTcpNoDelay() throws SocketException { - return inner.getTcpNoDelay(); - } - - @Override - public void setSoLinger(final boolean on, final int linger) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSoLinger(on, linger); - } - }); - } - - @Override - public int getSoLinger() throws SocketException { - return inner.getSoLinger(); - } - - @Override - public void sendUrgentData(final int data) throws IOException { - inner.sendUrgentData(data); - } - - @Override - public void setOOBInline(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setOOBInline(on); - } - }); - } - - @Override - public boolean getOOBInline() throws SocketException { - return inner.getOOBInline(); - } - - @Override - public synchronized void setSoTimeout(final int timeout) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSoTimeout(timeout); - } - }); - } - - @Override - public synchronized int getSoTimeout() throws SocketException { - return inner.getSoTimeout(); - } - - @Override - public synchronized void setSendBufferSize(final int size) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSendBufferSize(size); - } - }); - } - - @Override - public synchronized int getSendBufferSize() throws SocketException { - return inner.getSendBufferSize(); - } - - @Override - public synchronized void setReceiveBufferSize(final int size) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setReceiveBufferSize(size); - } - }); - } - - @Override - public synchronized int getReceiveBufferSize() throws SocketException { - return inner.getReceiveBufferSize(); - } - - @Override - public void setKeepAlive(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setKeepAlive(on); - } - }); - } - - @Override - public boolean getKeepAlive() throws SocketException { - return inner.getKeepAlive(); - } - - @Override - public void setTrafficClass(final int tc) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setTrafficClass(tc); - } - }); - } - - @Override - public int getTrafficClass() throws SocketException { - return inner.getTrafficClass(); - } - - @Override - public void setReuseAddress(final boolean on) throws SocketException { - // not supported: Apache client tries to set it, but we want to just ignore it - } - - @Override - public boolean getReuseAddress() throws SocketException { - return inner.getReuseAddress(); - } - - @Override - public synchronized void close() throws IOException { - inner.close(); - } - - @Override - public void shutdownInput() throws IOException { - inner.shutdownInput(); - } - - @Override - public void shutdownOutput() throws IOException { - inner.shutdownOutput(); - } - - @Override - public String toString() { - return inner.toString(); - } - - @Override - public boolean isConnected() { - return inner.isConnected(); - } - - @Override - public boolean isBound() { - return inner.isBound(); - } - - @Override - public boolean isClosed() { - return inner.isClosed(); - } - - @Override - public boolean isInputShutdown() { - return inner.isInputShutdown(); - } - - @Override - public boolean isOutputShutdown() { - return inner.isOutputShutdown(); - } - - @Override - public void setPerformancePreferences(final int connectionTime, final int latency, - final int bandwidth) { - inner.setPerformancePreferences(connectionTime, latency, bandwidth); - } - - interface SocketOptionSetter { - void run() throws SocketException; - } + private final AFUNIXSocket inner; + + private final Queue optionsToSet = new ArrayDeque(); + + public ApacheUnixSocket() throws IOException { + this.inner = AFUNIXSocket.newInstance(); + } + + @Override + public void connect(final SocketAddress endpoint) throws IOException { + inner.connect(endpoint); + setAllSocketOptions(); + } + + @Override + public void connect(final SocketAddress endpoint, final int timeout) throws IOException { + inner.connect(endpoint, timeout); + setAllSocketOptions(); + } + + @Override + public void bind(final SocketAddress bindpoint) throws IOException { + inner.bind(bindpoint); + setAllSocketOptions(); + } + + @Override + public InetAddress getInetAddress() { + return inner.getInetAddress(); + } + + @Override + public InetAddress getLocalAddress() { + return inner.getLocalAddress(); + } + + @Override + public int getPort() { + return inner.getPort(); + } + + @Override + public int getLocalPort() { + return inner.getLocalPort(); + } + + @Override + public SocketAddress getRemoteSocketAddress() { + return inner.getRemoteSocketAddress(); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return inner.getLocalSocketAddress(); + } + + @Override + public SocketChannel getChannel() { + return inner.getChannel(); + } + + @Override + public InputStream getInputStream() throws IOException { + return inner.getInputStream(); + } + + @Override + public OutputStream getOutputStream() throws IOException { + return inner.getOutputStream(); + } + + private void setSocketOption(final SocketOptionSetter s) throws SocketException { + if (inner.isConnected()) { + s.run(); + } else { + if (!optionsToSet.offer(s)) { + throw new SocketException("Failed to queue option"); + } + } + } + + private void setAllSocketOptions() throws SocketException { + for (SocketOptionSetter s : optionsToSet) { + s.run(); + } + } + + @Override + public void setTcpNoDelay(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTcpNoDelay(on); + } + }); + } + + @Override + public boolean getTcpNoDelay() throws SocketException { + return inner.getTcpNoDelay(); + } + + @Override + public void setSoLinger(final boolean on, final int linger) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoLinger(on, linger); + } + }); + } + + @Override + public int getSoLinger() throws SocketException { + return inner.getSoLinger(); + } + + @Override + public void sendUrgentData(final int data) throws IOException { + inner.sendUrgentData(data); + } + + @Override + public void setOOBInline(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setOOBInline(on); + } + }); + } + + @Override + public boolean getOOBInline() throws SocketException { + return inner.getOOBInline(); + } + + @Override + public synchronized void setSoTimeout(final int timeout) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoTimeout(timeout); + } + }); + } + + @Override + public synchronized int getSoTimeout() throws SocketException { + return inner.getSoTimeout(); + } + + @Override + public synchronized void setSendBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSendBufferSize(size); + } + }); + } + + @Override + public synchronized int getSendBufferSize() throws SocketException { + return inner.getSendBufferSize(); + } + + @Override + public synchronized void setReceiveBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setReceiveBufferSize(size); + } + }); + } + + @Override + public synchronized int getReceiveBufferSize() throws SocketException { + return inner.getReceiveBufferSize(); + } + + @Override + public void setKeepAlive(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setKeepAlive(on); + } + }); + } + + @Override + public boolean getKeepAlive() throws SocketException { + return inner.getKeepAlive(); + } + + @Override + public void setTrafficClass(final int tc) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTrafficClass(tc); + } + }); + } + + @Override + public int getTrafficClass() throws SocketException { + return inner.getTrafficClass(); + } + + @Override + public void setReuseAddress(final boolean on) throws SocketException { + // not supported: Apache client tries to set it, but we want to just ignore it + } + + @Override + public boolean getReuseAddress() throws SocketException { + return inner.getReuseAddress(); + } + + @Override + public synchronized void close() throws IOException { + inner.close(); + } + + @Override + public void shutdownInput() throws IOException { + inner.shutdownInput(); + } + + @Override + public void shutdownOutput() throws IOException { + inner.shutdownOutput(); + } + + @Override + public String toString() { + return inner.toString(); + } + + @Override + public boolean isConnected() { + return inner.isConnected(); + } + + @Override + public boolean isBound() { + return inner.isBound(); + } + + @Override + public boolean isClosed() { + return inner.isClosed(); + } + + @Override + public boolean isInputShutdown() { + return inner.isInputShutdown(); + } + + @Override + public boolean isOutputShutdown() { + return inner.isOutputShutdown(); + } + + @Override + public void setPerformancePreferences(final int connectionTime, final int latency, final int bandwidth) { + inner.setPerformancePreferences(connectionTime, latency, bandwidth); + } + + interface SocketOptionSetter { + void run() throws SocketException; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index de4bb3f0c..342fe710f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -12,36 +12,31 @@ import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class AttachContainerCmdExec extends - AbstrDockerCmdExec implements - AttachContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(AttachContainerCmdExec.class); - - public AttachContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(AttachContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()) - .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") - // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("stream", - command.hasFollowStreamEnabled() ? "1" : "0"); - - LOGGER.trace("POST: {}", webResource); - - Response response = webResource.request() - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(null, Response.class); - - return new WrappedResponseInputStream(response); - } +public class AttachContainerCmdExec extends AbstrDockerCmdExec implements + AttachContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); + + public AttachContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(AttachContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/attach") + .resolveTemplate("id", command.getContainerId()) + .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") + // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); + + LOGGER.trace("POST: {}", webResource); + + 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/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java index 3552d9742..8ceca593e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java @@ -12,28 +12,26 @@ import static javax.ws.rs.client.Entity.entity; -public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(AuthCmdExec.class); - - public AuthCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected AuthResponse execute(AuthCmd command) { - WebTarget webResource = getBaseResource().path("/auth"); - LOGGER.trace("POST: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON).post(entity(command.getAuthConfig(), MediaType.APPLICATION_JSON)); - - if(response.getStatus() == 401) { - throw new UnauthorizedException("Unauthorized"); - } +public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AuthCmdExec.class); + + public AuthCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected AuthResponse execute(AuthCmd command) { + WebTarget webResource = getBaseResource().path("/auth"); + LOGGER.trace("POST: {}", webResource); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command.getAuthConfig(), MediaType.APPLICATION_JSON)); + + if (response.getStatus() == 401) { + throw new UnauthorizedException("Unauthorized"); + } return response.readEntity(AuthResponse.class); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 3bdfb006c..3380832ec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -22,99 +22,90 @@ import static javax.ws.rs.client.Entity.entity; -public class BuildImageCmdExec extends - AbstrDockerCmdExec implements - BuildImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(BuildImageCmdExec.class); - - public BuildImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected ResponseImpl execute(BuildImageCmd command) { - WebTarget webResource = getBaseResource().path("/build"); - String dockerFilePath = command.getPathToDockerfile(); - - if (command.getTag() != null) { - webResource = webResource.queryParam("t", command.getTag()); - } - if (command.hasNoCacheEnabled()) { - webResource = webResource.queryParam("nocache", "true"); - } - if (!command.hasRemoveEnabled()) { - webResource = webResource.queryParam("rm", "false"); - } - if (command.isQuiet()) { - webResource = webResource.queryParam("q", "true"); - } - if (command.hasPullEnabled()) { - webResource = webResource.queryParam("pull", "true"); - } - if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webResource = webResource.queryParam("dockerfile", dockerFilePath); - } - - webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, - RequestEntityProcessing.CHUNKED); - webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, - 1024 * 1024); - - LOGGER.debug("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, - webResource.request()) - .accept(MediaType.TEXT_PLAIN) - .post(entity(command.getTarInputStream(), "application/tar"), - Response.class); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - - } - - private Invocation.Builder resourceWithOptionalAuthConfig( - BuildImageCmd command, Invocation.Builder request) { - AuthConfigurations authConfigs = command.getBuildAuthConfigs(); - if (authConfigs != null) { - request = request.header("X-Registry-Config", - registryConfigs(authConfigs)); - } - return request; - } - - public static class ResponseImpl extends BuildImageCmd.Response { - - private final InputStream proxy; - - public ResponseImpl(InputStream proxy) { - this.proxy = proxy; - } - - @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(EventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); - - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } - } - - @Override - public int read() throws IOException { - return proxy.read(); - } - - @Override - public void close() throws IOException { - proxy.close(); - super.close(); - } - } +public class BuildImageCmdExec extends AbstrDockerCmdExec implements + BuildImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); + + public BuildImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected ResponseImpl execute(BuildImageCmd command) { + WebTarget webResource = getBaseResource().path("/build"); + String dockerFilePath = command.getPathToDockerfile(); + + if (command.getTag() != null) { + webResource = webResource.queryParam("t", command.getTag()); + } + if (command.hasNoCacheEnabled()) { + webResource = webResource.queryParam("nocache", "true"); + } + if (!command.hasRemoveEnabled()) { + webResource = webResource.queryParam("rm", "false"); + } + if (command.isQuiet()) { + webResource = webResource.queryParam("q", "true"); + } + if (command.hasPullEnabled()) { + webResource = webResource.queryParam("pull", "true"); + } + if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { + webResource = webResource.queryParam("dockerfile", dockerFilePath); + } + + webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); + webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); + + LOGGER.debug("POST: {}", webResource); + Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept(MediaType.TEXT_PLAIN) + .post(entity(command.getTarInputStream(), "application/tar"), Response.class); + + return new ResponseImpl(new WrappedResponseInputStream(response)); + + } + + private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + + public static class ResponseImpl extends BuildImageCmd.Response { + + private final InputStream proxy; + + public ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(EventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } + } + + @Override + public int read() throws IOException { + return proxy.read(); + } + + @Override + public void close() throws IOException { + proxy.close(); + super.close(); + } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java index f1f4fe33a..b07f5e338 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java @@ -12,27 +12,24 @@ import com.github.dockerjava.api.command.CommitCmd; public class CommitCmdExec extends AbstrDockerCmdExec implements CommitCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CommitCmdExec.class); - - public CommitCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected String execute(CommitCmd command) { - WebTarget webResource = getBaseResource().path("/commit") - .queryParam("container", command.getContainerId()) - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) - .queryParam("m", command.getMessage()) - .queryParam("author", command.getAuthor()) - .queryParam("pause", command.hasPauseEnabled() ? "1" : "0"); - - LOGGER.trace("POST: {}", webResource); - ObjectNode objectNode = webResource.request().accept("application/vnd.docker.raw-stream").post(entity(command, MediaType.APPLICATION_JSON), ObjectNode.class); + + private static final Logger LOGGER = LoggerFactory.getLogger(CommitCmdExec.class); + + public CommitCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected String execute(CommitCmd command) { + WebTarget webResource = getBaseResource().path("/commit").queryParam("container", command.getContainerId()) + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) + .queryParam("m", command.getMessage()).queryParam("author", command.getAuthor()) + .queryParam("pause", command.hasPauseEnabled() ? "1" : "0"); + + LOGGER.trace("POST: {}", webResource); + ObjectNode objectNode = webResource.request().accept("application/vnd.docker.raw-stream") + .post(entity(command, MediaType.APPLICATION_JSON), ObjectNode.class); return objectNode.get("Id").asText(); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java index 2b7059b33..c7c8c293a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java @@ -12,23 +12,23 @@ import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; -public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements ContainerDiffCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(ContainerDiffCmdExec.class); - - public ContainerDiffCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(ContainerDiffCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .get(new GenericType>() { +public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements + ContainerDiffCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ContainerDiffCmdExec.class); + + public ContainerDiffCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(ContainerDiffCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { }); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 0a738be83..88e8c3086 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -14,26 +14,26 @@ import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements CopyFileFromContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CopyFileFromContainerCmdExec.class); - - public CopyFileFromContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(CopyFileFromContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/copy") - .resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("POST: " + webResource.toString()); - - Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON)); - - return new WrappedResponseInputStream(response); - } +public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements + CopyFileFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileFromContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(CopyFileFromContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: " + webResource.toString()); + + Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(entity(command, MediaType.APPLICATION_JSON)); + + return new WrappedResponseInputStream(response); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java index 26dc25cd2..c02b9f4b7 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java @@ -11,25 +11,26 @@ import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; -public class CreateContainerCmdExec extends AbstrDockerCmdExec implements CreateContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); - - public CreateContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected CreateContainerResponse execute(CreateContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/create"); +public class CreateContainerCmdExec extends AbstrDockerCmdExec implements + CreateContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); + + public CreateContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected CreateContainerResponse execute(CreateContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/create"); if (command.getName() != null) { webResource = webResource.queryParam("name", command.getName()); } - LOGGER.trace("POST: {} ", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), CreateContainerResponse.class); - } + LOGGER.trace("POST: {} ", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java index 4c7bae8b0..c5733241d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java @@ -11,25 +11,22 @@ import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; -public class CreateImageCmdExec extends AbstrDockerCmdExec implements CreateImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CreateImageCmdExec.class); - - public CreateImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected CreateImageResponse execute(CreateImageCmd command) { - WebTarget webResource = getBaseResource() - .path("/images/create") - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) - .queryParam("fromSrc", "-"); - - LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM), CreateImageResponse.class); - } +public class CreateImageCmdExec extends AbstrDockerCmdExec implements + CreateImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateImageCmdExec.class); + + public CreateImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected CreateImageResponse execute(CreateImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/create").queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()).queryParam("fromSrc", "-"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM), CreateImageResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 8a5d5d879..77712fdeb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -25,7 +25,6 @@ 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; @@ -41,302 +40,286 @@ 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 - .getLogger(DockerCmdExecFactoryImpl.class.getName()); - private Client client; - private WebTarget baseResource; - - @Override - public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - - ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); - clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, - true); - - clientConfig.register(ResponseStatusExceptionFilter.class); - clientConfig.register(JsonClientFilter.class); - clientConfig.register(JacksonJsonProvider.class); - - if (dockerClientConfig.followRedirectsFilterEnabled()) { - clientConfig.register(FollowRedirectsFilter.class); - } - - if (dockerClientConfig.isLoggingFilterEnabled()) { - clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); - } - - if (dockerClientConfig.getReadTimeout() != null) { - int readTimeout = dockerClientConfig.getReadTimeout(); - clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); - } - - //clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); - - URI originalUri = dockerClientConfig.getUri(); - - SSLContext sslContext = null; - - if (dockerClientConfig.getSslConfig() != null) { - try { - sslContext = dockerClientConfig.getSslConfig().getSSLContext(); - } catch (Exception ex) { - throw new DockerClientException("Error in SSL Configuration", - ex); - } - } - - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( - getSchemeRegistry(originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS); - - - if (dockerClientConfig.getMaxTotalConnections() != null) - connManager - .setMaxTotal(dockerClientConfig.getMaxTotalConnections()); - if (dockerClientConfig.getMaxPerRoutConnections() != null) - connManager.setDefaultMaxPerRoute(dockerClientConfig - .getMaxPerRoutConnections()); - - clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, - connManager); - - clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, - RequestConfig.custom().setConnectionRequestTimeout(1000).build()); - - ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( - clientConfig); - - if (sslContext != null) { - clientBuilder.sslContext(sslContext); - } - - client = clientBuilder.build(); - - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory - .sanitizeUri(originalUri)); - } - WebTarget webResource = client.target(dockerClientConfig.getUri()); - - if (dockerClientConfig.getVersion() == null - || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" - + dockerClientConfig.getVersion()); - } - } - - private org.apache.http.config.Registry getSchemeRegistry( - final URI originalUri, SSLContext sslContext) { - RegistryBuilder registryBuilder = RegistryBuilder - .create(); - registryBuilder.register("http", - PlainConnectionSocketFactory.getSocketFactory()); - if (sslContext != null) { - registryBuilder.register("https", new SSLConnectionSocketFactory( - sslContext)); - } - registryBuilder.register("unix", new UnixConnectionSocketFactory( - originalUri)); - return registryBuilder.build(); - } - - protected WebTarget getBaseResource() { - checkNotNull(baseResource, - "Factory not initialized. You probably forgot to call init()!"); - return baseResource; - } - - @Override - public AuthCmd.Exec createAuthCmdExec() { - return new AuthCmdExec(getBaseResource()); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(getBaseResource()); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return new PingCmdExec(getBaseResource()); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return new VersionCmdExec(getBaseResource()); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return new PullImageCmdExec(getBaseResource()); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return new PushImageCmdExec(getBaseResource()); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { - return new SaveImageCmdExec(getBaseResource()); - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return new SearchImagesCmdExec(getBaseResource()); - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return new ListImagesCmdExec(getBaseResource()); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return new InspectImageCmdExec(getBaseResource()); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return new ListContainersCmdExec(getBaseResource()); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return new StartContainerCmdExec(getBaseResource()); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return new InspectContainerCmdExec(getBaseResource()); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(getBaseResource()); - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return new WaitContainerCmdExec(getBaseResource()); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return new AttachContainerCmdExec(getBaseResource()); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return new ExecStartCmdExec(getBaseResource()); - } - - @Override - public InspectExecCmd.Exec createInspectExecCmdExec() { - return new InspectExecCmdExec(getBaseResource()); - } - - @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return new LogContainerCmdExec(getBaseResource()); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource()); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return new StopContainerCmdExec(getBaseResource()); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return new ContainerDiffCmdExec(getBaseResource()); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return new KillContainerCmdExec(getBaseResource()); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return new RestartContainerCmdExec(getBaseResource()); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return new CommitCmdExec(getBaseResource()); - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return new TopContainerCmdExec(getBaseResource()); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return new TagImageCmdExec(getBaseResource()); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return new PauseContainerCmdExec(getBaseResource()); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return new UnpauseContainerCmdExec(baseResource); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return new EventsCmdExec(getBaseResource()); - } - - @Override + private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + + private Client client; + + private WebTarget baseResource; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + + ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new ApacheConnectorProvider()); + clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); + + clientConfig.register(ResponseStatusExceptionFilter.class); + clientConfig.register(JsonClientFilter.class); + clientConfig.register(JacksonJsonProvider.class); + + if (dockerClientConfig.followRedirectsFilterEnabled()) { + clientConfig.register(FollowRedirectsFilter.class); + } + + if (dockerClientConfig.isLoggingFilterEnabled()) { + clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + } + + if (dockerClientConfig.getReadTimeout() != null) { + int readTimeout = dockerClientConfig.getReadTimeout(); + clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); + } + + // clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); + + URI originalUri = dockerClientConfig.getUri(); + + SSLContext sslContext = null; + + if (dockerClientConfig.getSslConfig() != null) { + try { + sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + } catch (Exception ex) { + throw new DockerClientException("Error in SSL Configuration", ex); + } + } + + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( + originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS); + + if (dockerClientConfig.getMaxTotalConnections() != null) + connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); + if (dockerClientConfig.getMaxPerRoutConnections() != null) + connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); + + clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); + + clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom() + .setConnectionRequestTimeout(1000).build()); + + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); + + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } + + client = clientBuilder.build(); + + if (originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); + } + WebTarget webResource = client.target(dockerClientConfig.getUri()); + + if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { + baseResource = webResource; + } else { + baseResource = webResource.path("v" + dockerClientConfig.getVersion()); + } + } + + private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, + SSLContext sslContext) { + RegistryBuilder registryBuilder = RegistryBuilder.create(); + registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory()); + if (sslContext != null) { + registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); + } + registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri)); + return registryBuilder.build(); + } + + protected WebTarget getBaseResource() { + checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + return baseResource; + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return new AuthCmdExec(getBaseResource()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(getBaseResource()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return new PingCmdExec(getBaseResource()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return new VersionCmdExec(getBaseResource()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return new PullImageCmdExec(getBaseResource()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return new PushImageCmdExec(getBaseResource()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return new SaveImageCmdExec(getBaseResource()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return new SearchImagesCmdExec(getBaseResource()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return new ListImagesCmdExec(getBaseResource()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return new InspectImageCmdExec(getBaseResource()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return new ListContainersCmdExec(getBaseResource()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return new StartContainerCmdExec(getBaseResource()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return new InspectContainerCmdExec(getBaseResource()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return new WaitContainerCmdExec(getBaseResource()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return new AttachContainerCmdExec(getBaseResource()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return new InspectExecCmdExec(getBaseResource()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return new LogContainerCmdExec(getBaseResource()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return new CopyFileFromContainerCmdExec(getBaseResource()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return new StopContainerCmdExec(getBaseResource()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return new ContainerDiffCmdExec(getBaseResource()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return new KillContainerCmdExec(getBaseResource()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return new RestartContainerCmdExec(getBaseResource()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return new CommitCmdExec(getBaseResource()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return new TopContainerCmdExec(getBaseResource()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return new TagImageCmdExec(getBaseResource()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return new PauseContainerCmdExec(getBaseResource()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return new UnpauseContainerCmdExec(baseResource); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return new EventsCmdExec(getBaseResource()); + } + + @Override public StatsCmd.Exec createStatsCmdExec() { - return new StatsCmdExec(getBaseResource()); - } - - @Override - public void close() throws IOException { - checkNotNull(client, - "Factory not initialized. You probably forgot to call init()!"); - client.close(); - } + return new StatsCmdExec(getBaseResource()); + } + + @Override + public void close() throws IOException { + checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); + client.close(); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index a601ea90c..1a60a5ae3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -22,88 +22,81 @@ 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); - // 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 { - if (response != 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); + // 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 { + if (response != null) { response.close(); } - try { - eventCallback.onCompletion(numEvents); - } catch (Exception e) { - eventCallback.onException(e); - } - } - - return null; - } - } + try { + eventCallback.onCompletion(numEvents); + } catch (Exception e) { + eventCallback.onException(e); + } + } + + return null; + } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index 02ea4d8ae..e2d986bbf 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -10,10 +10,10 @@ import static javax.ws.rs.client.Entity.entity; -public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { +public class ExecCreateCmdExec extends AbstrDockerCmdExec implements + ExecCreateCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(VersionCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); public ExecCreateCmdExec(WebTarget baseResource) { super(baseResource); @@ -21,13 +21,12 @@ public ExecCreateCmdExec(WebTarget baseResource) { @Override protected ExecCreateCmdResponse execute(ExecCreateCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", + command.getContainerId()); LOGGER.trace("POST: {}", webResource); - return webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index cbac951d3..46d0e2d29 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -22,18 +22,15 @@ public ExecStartCmdExec(WebTarget baseResource) { super(baseResource); } - @Override protected InputStream execute(ExecStartCmd command) { WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); LOGGER.trace("POST: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), Response.class); - - return new WrappedResponseInputStream(response); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), Response.class); + + return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java index c585f31c9..eafb87b98 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java @@ -10,20 +10,19 @@ import com.github.dockerjava.api.model.Info; public class InfoCmdExec extends AbstrDockerCmdExec implements InfoCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InfoCmdExec.class); - - public InfoCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Info execute(InfoCmd command) { - WebTarget webResource = getBaseResource().path("/info"); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); - } + + private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); + + public InfoCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Info execute(InfoCmd command) { + WebTarget webResource = getBaseResource().path("/info"); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java index 664a67c59..a06e46e7c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java @@ -3,28 +3,28 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; -public class InspectContainerCmdExec extends AbstrDockerCmdExec implements InspectContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InspectContainerCmdExec.class); - - public InspectContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InspectContainerResponse execute(InspectContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/json").resolveTemplate("id", command.getContainerId()); - - LOGGER.debug("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); - } +public class InspectContainerCmdExec extends AbstrDockerCmdExec + implements InspectContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectContainerCmdExec.class); + + public InspectContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InspectContainerResponse execute(InspectContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/json").resolveTemplate("id", + command.getContainerId()); + + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java index b9ee33d61..a58a520cd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java @@ -8,7 +8,8 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -public class InspectExecCmdExec extends AbstrDockerCmdExec implements InspectExecCmd.Exec { +public class InspectExecCmdExec extends AbstrDockerCmdExec implements + InspectExecCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); public InspectExecCmdExec(WebTarget baseResource) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java index 784266091..b03cdd799 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java @@ -9,21 +9,21 @@ import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; -public class InspectImageCmdExec extends AbstrDockerCmdExec implements InspectImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InspectImageCmdExec.class); - - public InspectImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InspectImageResponse execute(InspectImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectImageResponse.class); - } +public class InspectImageCmdExec extends AbstrDockerCmdExec implements + InspectImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectImageCmdExec.class); + + public InspectImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InspectImageResponse execute(InspectImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectImageResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index 6164064c9..bbfd0dbee 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -8,30 +8,27 @@ import com.github.dockerjava.api.command.KillContainerCmd; -public class KillContainerCmdExec extends - AbstrDockerCmdExec implements - KillContainerCmd.Exec { +public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(KillContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(KillContainerCmdExec.class); - public KillContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public KillContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(KillContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/kill") - .resolveTemplate("id", command.getContainerId()); + @Override + protected Void execute(KillContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/kill").resolveTemplate("id", + command.getContainerId()); - if (command.getSignal() != null) { - webResource = webResource.queryParam("signal", command.getSignal()); - } + if (command.getSignal() != null) { + webResource = webResource.queryParam("signal", command.getSignal()); + } - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index 018db9a56..5bb905b56 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -12,19 +12,19 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -public class ListContainersCmdExec extends AbstrDockerCmdExec> implements ListContainersCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); - - public ListContainersCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(ListContainersCmd command) { - WebTarget webResource = getBaseResource().path("/containers/json") - .queryParam("all", command.hasShowAllEnabled() ? "1" : "0") - .queryParam("since", command.getSinceId()) +public class ListContainersCmdExec extends AbstrDockerCmdExec> implements + ListContainersCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); + + public ListContainersCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(ListContainersCmd command) { + WebTarget webResource = getBaseResource().path("/containers/json") + .queryParam("all", command.hasShowAllEnabled() ? "1" : "0").queryParam("since", command.getSinceId()) .queryParam("before", command.getBeforeId()) .queryParam("size", command.hasShowSizeEnabled() ? "1" : "0"); @@ -32,12 +32,13 @@ protected List execute(ListContainersCmd command) { webResource = webResource.queryParam("limit", String.valueOf(command.getLimit())); } - LOGGER.trace("GET: {}", webResource); - List containers = webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { - }); - LOGGER.trace("Response: {}", containers); + LOGGER.trace("GET: {}", webResource); + List containers = webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", containers); - return containers; - } + return containers; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 59e08fb60..b18470e12 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -14,35 +14,30 @@ import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; -public class ListImagesCmdExec extends - AbstrDockerCmdExec> implements - ListImagesCmd.Exec { +public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(ListImagesCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); - public ListImagesCmdExec(WebTarget baseResource) { - super(baseResource); - } + public ListImagesCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected List execute(ListImagesCmd command) { - WebTarget webResource = getBaseResource().path("/images/json") - .queryParam("all", command.hasShowAllEnabled() ? "1" : "0"); + @Override + protected List execute(ListImagesCmd command) { + WebTarget webResource = getBaseResource().path("/images/json").queryParam("all", + command.hasShowAllEnabled() ? "1" : "0"); - if (command.getFilters() != null) - webResource = webResource.queryParam("filters", - urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null) + webResource = webResource.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); - LOGGER.trace("GET: {}", webResource); + LOGGER.trace("GET: {}", webResource); - List images = webResource.request() - .accept(MediaType.APPLICATION_JSON) - .get(new GenericType>() { - }); - LOGGER.trace("Response: {}", images); + List images = webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", images); - return images; - } + return images; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 7d031bddd..39e1dbd3f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -10,27 +10,28 @@ import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); - - public LogContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(LogContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/logs") - .resolveTemplate("id", command.getContainerId()) - .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") - .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); - - LOGGER.trace("GET: {}", webResource); - - return new WrappedResponseInputStream(webResource.request().get()); - } +public class LogContainerCmdExec extends AbstrDockerCmdExec implements + LogContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); + + public LogContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(LogContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/logs") + .resolveTemplate("id", command.getContainerId()) + .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") + .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); + + LOGGER.trace("GET: {}", webResource); + + return new WrappedResponseInputStream(webResource.request().get()); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index 429c61edb..4bd8ddd9a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -8,27 +8,24 @@ import com.github.dockerjava.api.command.PauseContainerCmd; -public class PauseContainerCmdExec extends - AbstrDockerCmdExec implements - PauseContainerCmd.Exec { +public class PauseContainerCmdExec extends AbstrDockerCmdExec implements + PauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(PauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); - public PauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public PauseContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(PauseContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/pause").resolveTemplate("id", - command.getContainerId()); + @Override + protected Void execute(PauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/pause").resolveTemplate("id", + command.getContainerId()); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index 65bdc04b1..9e2677e58 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -9,20 +9,20 @@ public class PingCmdExec extends AbstrDockerCmdExec implements PingCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); - public PingCmdExec(WebTarget baseResource) { - super(baseResource); - } + public PingCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(PingCmd command) { + WebTarget webResource = getBaseResource().path("/_ping"); - @Override - protected Void execute(PingCmd command) { - WebTarget webResource = getBaseResource().path("/_ping"); - LOGGER.trace("GET: {}", webResource); webResource.request().get().close(); - + return null; - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index bd89d22f6..c317aa1c9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -14,39 +14,32 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class PullImageCmdExec extends - AbstrDockerCmdExec implements - PullImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(PullImageCmdExec.class); - - public PullImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(PullImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/create") - .queryParam("tag", command.getTag()) - .queryParam("fromImage", command.getRepository()) - .queryParam("registry", command.getRegistry()); - - LOGGER.trace("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); - - return new WrappedResponseInputStream(response); - } - - private Invocation.Builder resourceWithOptionalAuthConfig( - PullImageCmd command, Invocation.Builder request) { - AuthConfig authConfig = command.getAuthConfig(); - if (authConfig != null) { - request = request.header("X-Registry-Auth", - registryAuth(authConfig)); - } - return request; - } +public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); + + public PullImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(PullImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + + LOGGER.trace("POST: {}", webResource); + Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept( + MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); + + return new WrappedResponseInputStream(response); + } + + private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { + AuthConfig authConfig = command.getAuthConfig(); + if (authConfig != null) { + request = request.header("X-Registry-Auth", registryAuth(authConfig)); + } + return request; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 7fc88d91b..4f5ca5d0a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; - - import static javax.ws.rs.client.Entity.entity; import java.io.IOException; @@ -26,64 +24,58 @@ import com.google.common.collect.ImmutableList; public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(PushImageCmdExec.class); - - public PushImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected ResponseImpl execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push") - .queryParam("tag", command.getTag()); - - final String registryAuth = registryAuth(command.getAuthConfig()); - LOGGER.trace("POST: {}", webResource); - javax.ws.rs.core.Response response = webResource - .request() - .header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON) - .post( - entity(Response.class, MediaType.APPLICATION_JSON)); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - } - - private String name(PushImageCmd command) { - String name = command.getName(); - AuthConfig authConfig = command.getAuthConfig(); - return name.contains("/") ? name : authConfig.getUsername(); - } - - - public static class ResponseImpl extends Response { - - private final InputStream proxy; - - ResponseImpl(InputStream proxy) { - this.proxy = proxy; + + private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); + + public PushImageCmdExec(WebTarget baseResource) { + super(baseResource); } @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(PushEventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); - - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } + protected ResponseImpl execute(PushImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); + + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("POST: {}", webResource); + javax.ws.rs.core.Response response = webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON).post(entity(Response.class, MediaType.APPLICATION_JSON)); + + return new ResponseImpl(new WrappedResponseInputStream(response)); } - @Override - public int read() throws IOException { - return proxy.read(); + private String name(PushImageCmd command) { + String name = command.getName(); + AuthConfig authConfig = command.getAuthConfig(); + return name.contains("/") ? name : authConfig.getUsername(); + } + + public static class ResponseImpl extends Response { + + private final InputStream proxy; + + ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(PushEventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } + } + + @Override + public int read() throws IOException { + return proxy.read(); + } } - } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index d2ff1b837..ebd98fc6f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -8,24 +8,25 @@ import com.github.dockerjava.api.command.RemoveContainerCmd; -public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements RemoveContainerCmd.Exec { +public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements + RemoveContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); - public RemoveContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public RemoveContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(RemoveContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/" + command.getContainerId()) - .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") - .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - - LOGGER.trace("DELETE: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); + @Override + protected Void execute(RemoveContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/" + command.getContainerId()) + .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") + .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - return null; - } + LOGGER.trace("DELETE: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index d5d7b8000..8db23112b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -9,22 +9,22 @@ public class RemoveImageCmdExec extends AbstrDockerCmdExec implements RemoveImageCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); - - public RemoveImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(RemoveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId()) - .queryParam("force", command.hasForceEnabled() ? "1" : "0") - .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); - - LOGGER.trace("DELETE: {}", webResource); - webResource.request().delete().close(); - - return null; - } + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); + + public RemoveImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(RemoveImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getImageId()) + .queryParam("force", command.hasForceEnabled() ? "1" : "0") + .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); + + LOGGER.trace("DELETE: {}", webResource); + webResource.request().delete().close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index 9ac76a36a..f640945a2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -8,28 +8,24 @@ import com.github.dockerjava.api.command.RestartContainerCmd; -public class RestartContainerCmdExec extends - AbstrDockerCmdExec implements - RestartContainerCmd.Exec { +public class RestartContainerCmdExec extends AbstrDockerCmdExec implements + RestartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(RestartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); - public RestartContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public RestartContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(RestartContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/restart") - .resolveTemplate("id", command.getContainerId()) - .queryParam("t", String.valueOf(command.getTimeout())); + @Override + protected Void execute(RestartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/restart") + .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index 8d70e2f6f..de56a39b6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -13,8 +13,7 @@ import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(SaveImageCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); public SaveImageCmdExec(WebTarget baseResource) { super(baseResource); @@ -22,14 +21,11 @@ public SaveImageCmdExec(WebTarget baseResource) { @Override protected InputStream execute(SaveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get") - .queryParam("tag", command.getTag()); + WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get").queryParam("tag", + command.getTag()); LOGGER.trace("GET: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .get(); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON).get(); return new WrappedResponseInputStream(response); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java index a7b6ddbc2..00aeb91ec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java @@ -12,21 +12,22 @@ import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; -public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements SearchImagesCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); - - public SearchImagesCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(SearchImagesCmd command) { - WebTarget webResource = getBaseResource().path("/images/search").queryParam("term", command.getTerm()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { +public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements + SearchImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); + + public SearchImagesCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(SearchImagesCmd command) { + WebTarget webResource = getBaseResource().path("/images/search").queryParam("term", command.getTerm()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { }); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 8ca1a42fc..c90f5e1cc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -10,22 +10,25 @@ import com.github.dockerjava.api.command.StartContainerCmd; -public class StartContainerCmdExec extends AbstrDockerCmdExec implements StartContainerCmd.Exec { +public class StartContainerCmdExec extends AbstrDockerCmdExec implements + StartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); - public StartContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public StartContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(StartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", command.getContainerId()); + @Override + protected Void execute(StartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", + command.getContainerId()); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)).close(); - - return null; - } + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)) + .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 c0c6f36c1..f63e609cb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -31,10 +31,10 @@ public StatsCmdExec(WebTarget baseResource) { @Override protected ExecutorService execute(StatsCmd command) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); + ExecutorService executorService = Executors.newSingleThreadExecutor(); - WebTarget webResource = getBaseResource().path("/containers/{id}/stats") - .resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id", + command.getContainerId()); LOGGER.trace("GET: {}", webResource); StatsNotifier eventNotifier = StatsNotifier.create(command.getStatsCallback(), webResource); @@ -44,9 +44,11 @@ protected ExecutorService execute(StatsCmd command) { 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) { @@ -66,19 +68,16 @@ public Void call() throws Exception { 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); // 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()) { + while (statsCallback.isReceiving() && jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed() + && statsCallback.isReceiving()) { try { - statsCallback.onStats(OBJECT_MAPPER.readValue(jp, - Statistics.class)); + statsCallback.onStats(OBJECT_MAPPER.readValue(jp, Statistics.class)); } catch (Exception e) { statsCallback.onException(e); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index bf683be59..3197e0c0e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -8,26 +8,22 @@ import com.github.dockerjava.api.command.StopContainerCmd; -public class StopContainerCmdExec extends - AbstrDockerCmdExec implements - StopContainerCmd.Exec { +public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(StopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); - public StopContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public StopContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(StopContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/stop") - .resolveTemplate("id", command.getContainerId()) - .queryParam("t", String.valueOf(command.getTimeout())); + @Override + protected Void execute(StopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/stop") + .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index dfbeba072..3cddd63f2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -8,26 +8,22 @@ import com.github.dockerjava.api.command.TagImageCmd; public class TagImageCmdExec extends AbstrDockerCmdExec implements TagImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(TagImageCmdExec.class); - - public TagImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(TagImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId() + "/tag") - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) + + private static final Logger LOGGER = LoggerFactory.getLogger(TagImageCmdExec.class); + + public TagImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(TagImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getImageId() + "/tag") + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - LOGGER.trace("POST: {}", webResource); - webResource.request().post(null).close(); - return null; - } - - + LOGGER.trace("POST: {}", webResource); + webResource.request().post(null).close(); + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java index 55c431ccd..daff2224b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java @@ -11,24 +11,25 @@ import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; -public class TopContainerCmdExec extends AbstrDockerCmdExec implements TopContainerCmd.Exec { +public class TopContainerCmdExec extends AbstrDockerCmdExec implements + TopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); - public TopContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public TopContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected TopContainerResponse execute(TopContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/top") - .resolveTemplate("id", command.getContainerId()); + @Override + protected TopContainerResponse execute(TopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/top").resolveTemplate("id", + command.getContainerId()); - if(!StringUtils.isEmpty(command.getPsArgs())) - webResource = webResource.queryParam("ps_args", command.getPsArgs()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); - } + if (!StringUtils.isEmpty(command.getPsArgs())) + webResource = webResource.queryParam("ps_args", command.getPsArgs()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java index 4b6cfbba3..3fea92126 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java @@ -1,4 +1,5 @@ package com.github.dockerjava.jaxrs; + /* * Copyright (c) 2014 Spotify AB. * @@ -20,8 +21,6 @@ * under the License. */ - - import org.apache.http.HttpHost; import org.apache.http.annotation.Immutable; import org.apache.http.conn.ConnectTimeoutException; @@ -42,44 +41,40 @@ @Immutable public class UnixConnectionSocketFactory implements ConnectionSocketFactory { - private File socketFile; - - public UnixConnectionSocketFactory(final URI socketUri) { - super(); + private File socketFile; - final String filename = socketUri.toString() - .replaceAll("^unix:///", "unix://localhost/") - .replaceAll("^unix://localhost", ""); + public UnixConnectionSocketFactory(final URI socketUri) { + super(); - this.socketFile = new File(filename); - } + final String filename = socketUri.toString().replaceAll("^unix:///", "unix://localhost/") + .replaceAll("^unix://localhost", ""); - public static URI sanitizeUri(final URI uri) { - if (uri.getScheme().equals("unix")) { - return URI.create("unix://localhost:80"); - } else { - return uri; + this.socketFile = new File(filename); } - } - @Override - public Socket createSocket(final HttpContext context) throws IOException { - return new ApacheUnixSocket(); - } + public static URI sanitizeUri(final URI uri) { + if (uri.getScheme().equals("unix")) { + return URI.create("unix://localhost:80"); + } else { + return uri; + } + } - @Override - public Socket connectSocket(final int connectTimeout, - final Socket socket, - final HttpHost host, - final InetSocketAddress remoteAddress, - final InetSocketAddress localAddress, - final HttpContext context) throws IOException { - try { - socket.connect(new AFUNIXSocketAddress(socketFile), connectTimeout); - } catch (SocketTimeoutException e) { - throw new ConnectTimeoutException(e, null, remoteAddress.getAddress()); + @Override + public Socket createSocket(final HttpContext context) throws IOException { + return new ApacheUnixSocket(); } - return socket; - } + @Override + public Socket connectSocket(final int connectTimeout, final Socket socket, final HttpHost host, + final InetSocketAddress remoteAddress, final InetSocketAddress localAddress, final HttpContext context) + throws IOException { + try { + socket.connect(new AFUNIXSocketAddress(socketFile), connectTimeout); + } catch (SocketTimeoutException e) { + throw new ConnectTimeoutException(e, null, remoteAddress.getAddress()); + } + + return socket; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java index 7fed603a5..de507e8ff 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java @@ -8,24 +8,24 @@ import com.github.dockerjava.api.command.UnpauseContainerCmd; -public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements UnpauseContainerCmd.Exec { +public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements + UnpauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); - public UnpauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public UnpauseContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(UnpauseContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/unpause") - .resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON) - .post(null).close(); + @Override + protected Void execute(UnpauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/unpause").resolveTemplate("id", + command.getContainerId()); - return null; - } + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java index 9b4ac817a..e8af1cb29 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java @@ -11,20 +11,18 @@ public class VersionCmdExec extends AbstrDockerCmdExec implements VersionCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(VersionCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); - public VersionCmdExec(WebTarget baseResource) { - super(baseResource); - } + public VersionCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Version execute(VersionCmd command) { - WebTarget webResource = getBaseResource().path("/version"); + @Override + protected Version execute(VersionCmd command) { + WebTarget webResource = getBaseResource().path("/version"); - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .get(Version.class); - } + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Version.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index 1b81eee33..47af2bcfa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -9,25 +9,24 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.command.WaitContainerCmd; -public class WaitContainerCmdExec extends AbstrDockerCmdExec implements WaitContainerCmd.Exec { +public class WaitContainerCmdExec extends AbstrDockerCmdExec implements + WaitContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(WaitContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); - public WaitContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public WaitContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Integer execute(WaitContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/wait") - .resolveTemplate("id", command.getContainerId()); + @Override + protected Integer execute(WaitContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON).post(null, ObjectNode.class); - LOGGER.trace("POST: {}", webResource); - ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON) - .post(null, ObjectNode.class); - return ObjectNode.get("StatusCode").asInt(); - } + } } 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 63fea0954..d11cdd7a0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -40,7 +40,6 @@ * holder. */ - import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -127,8 +126,7 @@ 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. + * 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: *

    @@ -144,35 +142,32 @@ *
  • {@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. + * 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}. + * 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. + * 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. + * 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. + * 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. @@ -190,6 +185,7 @@ 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 { @@ -198,14 +194,18 @@ class ApacheConnector implements Connector { } 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. + * @param config + * client configuration. */ ApacheConnector(Configuration config) { Object reqConfig = null; @@ -215,26 +215,18 @@ class ApacheConnector implements Connector { 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()) - ); + 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()) - ); + LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.REQUEST_CONFIG, reqConfig.getClass().getName(), + RequestConfig.class.getName())); reqConfig = null; } } @@ -267,31 +259,30 @@ class ApacheConnector implements Connector { 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); + 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); + 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) - ); + 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); + 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) { @@ -324,10 +315,8 @@ class ApacheConnector implements Connector { } private SSLContext getSslContext(final Configuration config) { - final SslConfigurator sslConfigurator = ApacheClientProperties.getValue( - config.getProperties(), - ApacheClientProperties.SSL_CONFIG, - SslConfigurator.class); + final SslConfigurator sslConfigurator = ApacheClientProperties.getValue(config.getProperties(), + ApacheClientProperties.SSL_CONFIG, SslConfigurator.class); return sslConfigurator != null ? sslConfigurator.createSSLContext() : null; } @@ -340,34 +329,22 @@ HttpClientConnectionManager getConnectionManager(final Configuration config, fin 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()) - ); + 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); + return createConnectionManager(config, sslContext, null, false); } - private HttpClientConnectionManager createConnectionManager( - final Configuration config, - final SSLContext sslContext, - X509HostnameVerifier hostnameVerifier, - final boolean useSystemProperties) { + 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; + 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; @@ -375,30 +352,26 @@ private HttpClientConnectionManager createConnectionManager( final LayeredConnectionSocketFactory sslSocketFactory; if (sslContext != null) { - sslSocketFactory = new SSLConnectionSocketFactory( - sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier); + sslSocketFactory = new SSLConnectionSocketFactory(sslContext, supportedProtocols, supportedCipherSuites, + hostnameVerifier); } else { if (useSystemProperties) { - sslSocketFactory = new SSLConnectionSocketFactory( - (SSLSocketFactory) SSLSocketFactory.getDefault(), + sslSocketFactory = new SSLConnectionSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault(), supportedProtocols, supportedCipherSuites, hostnameVerifier); } else { - sslSocketFactory = new SSLConnectionSocketFactory( - SSLContexts.createDefault(), - hostnameVerifier); + sslSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), hostnameVerifier); } } - final Registry registry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", sslSocketFactory) + 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)); + final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, + new ConnectionFactory(chunkSize)); if (useSystemProperties) { String s = System.getProperty("http.keepAlive", "true"); @@ -433,8 +406,8 @@ public HttpClient getHttpClient() { /** * Get the {@link CookieStore}. * - * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to - * {@code true}. + * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set + * to {@code true}. */ public CookieStore getCookieStore() { return cookieStore; @@ -465,15 +438,15 @@ 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(), - this.getClass().getName()); + 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 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(); @@ -506,7 +479,6 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing } } - try { responseContext.setEntityStream(new HttpClientResponseInputStream(response)); } catch (final IOException e) { @@ -554,23 +526,18 @@ private HttpHost getHost(final HttpUriRequest request) { } private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) { - final Boolean redirectsEnabled = - clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, requestConfig.isRedirectsEnabled()); + 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(); + 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(); @@ -628,7 +595,8 @@ public boolean isStreaming() { } } - private static Map writeOutBoundHeaders(final MultivaluedMap headers, final HttpUriRequest request) { + private static Map writeOutBoundHeaders(final MultivaluedMap headers, + final HttpUriRequest request) { Map stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers); for (Map.Entry e : stringHeaders.entrySet()) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java index 7ba9d8abd..a4d68e202 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java @@ -18,35 +18,31 @@ * */ 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(); - } - - + + 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 index fbde136ff..90600b608 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java @@ -50,8 +50,8 @@ 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. + * 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: *

    @@ -62,29 +62,28 @@ *
  • {@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 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. + * {@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}. + * 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 @@ -92,9 +91,8 @@ * 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. + * 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. @@ -115,23 +113,23 @@ public Connector getConnector(Client client, Configuration 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}. + * 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}. + * @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}. + * @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())); + throw new IllegalArgumentException(LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component + .getClass().getName())); } final Initializable initializable = (Initializable) component; @@ -148,4 +146,3 @@ public static HttpClient getHttpClient(Configurable component) { throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED()); } } - diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java index bf40dbfc0..5eeef6867 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -6,65 +6,66 @@ import javax.ws.rs.core.Response; /** - * 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. + * 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. * * @author marcus */ public class WrappedResponseInputStream extends InputStream { - - private Response response; - private InputStream delegate; - - public WrappedResponseInputStream(Response response) { - this.response = response; - this.delegate = response.readEntity(InputStream.class); - } - - public int read() throws IOException { - return delegate.read(); - } - - public int hashCode() { - return delegate.hashCode(); - } - - public int read(byte[] b) throws IOException { - return delegate.read(b); - } - - public boolean equals(Object obj) { - return delegate.equals(obj); - } - - public int read(byte[] b, int off, int len) throws IOException { - return delegate.read(b, off, len); - } - - public long skip(long n) throws IOException { - return delegate.skip(n); - } - - public int available() throws IOException { - return delegate.available(); - } - - public void close() throws IOException { - response.close(); - delegate.close(); - } - - public void mark(int readlimit) { - delegate.mark(readlimit); - } - - public void reset() throws IOException { - delegate.reset(); - } - - public boolean markSupported() { - return delegate.markSupported(); - } - + + private Response response; + + private InputStream delegate; + + public WrappedResponseInputStream(Response response) { + this.response = response; + this.delegate = response.readEntity(InputStream.class); + } + + public int read() throws IOException { + return delegate.read(); + } + + public int hashCode() { + return delegate.hashCode(); + } + + public int read(byte[] b) throws IOException { + return delegate.read(b); + } + + public boolean equals(Object obj) { + return delegate.equals(obj); + } + + public int read(byte[] b, int off, int len) throws IOException { + return delegate.read(b, off, len); + } + + public long skip(long n) throws IOException { + return delegate.skip(n); + } + + public int available() throws IOException { + return delegate.available(); + } + + public void close() throws IOException { + response.close(); + delegate.close(); + } + + public void mark(int readlimit) { + delegate.mark(readlimit); + } + + public void reset() throws IOException { + delegate.reset(); + } + + public boolean markSupported() { + return delegate.markSupported(); + } + } diff --git a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java index 500919fdc..8eed37b62 100644 --- a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java +++ b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -26,20 +26,20 @@ /** * References test resources and provides basic tests functionality. + * * @author Oleg Nenashev */ public enum CommandJSONSamples implements JSONResourceRef { - - inspectContainerResponse_full, - inspectContainerResponse_empty; - + + 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 index 2e294b146..bbe0a06f5 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -22,18 +22,18 @@ /** * 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); + 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); @@ -43,7 +43,7 @@ public void roundTrip_full() throws IOException { 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/java/com/github/dockerjava/api/model/AccessModeTest.java b/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java index 432f7b00f..bdbc2e225 100644 --- a/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java @@ -7,25 +7,24 @@ public class AccessModeTest { - @Test - public void defaultAccessMode() { - assertEquals(AccessMode.DEFAULT, rw); - } - - @Test - public void stringify() { - assertEquals(AccessMode.rw.toString(), "rw"); - } - - @Test - public void fromString() { - assertEquals(AccessMode.valueOf("rw"), rw); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "No enum const.*") - public void fromIllegalString() { - AccessMode.valueOf("xx"); - } + @Test + public void defaultAccessMode() { + assertEquals(AccessMode.DEFAULT, rw); + } + + @Test + public void stringify() { + assertEquals(AccessMode.rw.toString(), "rw"); + } + + @Test + public void fromString() { + assertEquals(AccessMode.valueOf("rw"), rw); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "No enum const.*") + public void fromIllegalString() { + AccessMode.valueOf("xx"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/BindTest.java b/src/test/java/com/github/dockerjava/api/model/BindTest.java index 50a41fc38..db5aec212 100644 --- a/src/test/java/com/github/dockerjava/api/model/BindTest.java +++ b/src/test/java/com/github/dockerjava/api/model/BindTest.java @@ -7,62 +7,59 @@ import org.testng.annotations.Test; public class BindTest { - - @Test - public void parseUsingDefaultAccessMode() { - Bind bind = Bind.parse("/host:/container"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), AccessMode.DEFAULT); - } - @Test - public void parseReadWrite() { - Bind bind = Bind.parse("/host:/container:rw"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), rw); - } - - @Test - public void parseReadOnly() { - Bind bind = Bind.parse("/host:/container:ro"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), ro); - } + @Test + public void parseUsingDefaultAccessMode() { + Bind bind = Bind.parse("/host:/container"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), AccessMode.DEFAULT); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind.*") - public void parseInvalidAccessMode() { - Bind.parse("/host:/container:xx"); - } + @Test + public void parseReadWrite() { + Bind bind = Bind.parse("/host:/container:rw"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), rw); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind 'nonsense'") - public void parseInvalidInput() { - Bind.parse("nonsense"); - } + @Test + public void parseReadOnly() { + Bind bind = Bind.parse("/host:/container:ro"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), ro); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind 'null'") - public void parseNull() { - Bind.parse(null); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind.*") + public void parseInvalidAccessMode() { + Bind.parse("/host:/container:xx"); + } - @Test - public void toStringReadOnly() { - assertEquals(Bind.parse("/host:/container:ro").toString(), "/host:/container:ro"); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind 'nonsense'") + public void parseInvalidInput() { + Bind.parse("nonsense"); + } - @Test - public void toStringReadWrite() { - assertEquals(Bind.parse("/host:/container:rw").toString(), "/host:/container:rw"); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind 'null'") + public void parseNull() { + Bind.parse(null); + } - @Test - public void toStringDefaultAccessMode() { - assertEquals(Bind.parse("/host:/container").toString(), "/host:/container:rw"); - } + @Test + public void toStringReadOnly() { + assertEquals(Bind.parse("/host:/container:ro").toString(), "/host:/container:ro"); + } + + @Test + public void toStringReadWrite() { + assertEquals(Bind.parse("/host:/container:rw").toString(), "/host:/container:rw"); + } + + @Test + public void toStringDefaultAccessMode() { + assertEquals(Bind.parse("/host:/container").toString(), "/host:/container:rw"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/BindingTest.java b/src/test/java/com/github/dockerjava/api/model/BindingTest.java index 0379dcdb0..3309a8904 100644 --- a/src/test/java/com/github/dockerjava/api/model/BindingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/BindingTest.java @@ -8,51 +8,49 @@ public class BindingTest { - @Test - public void parseIpAndPort() { - assertEquals(Binding.parse("127.0.0.1:80"), Ports.Binding("127.0.0.1", 80)); - } - - @Test - public void parsePortOnly() { - assertEquals(Binding.parse("80"), Ports.Binding(null, 80)); - } - - @Test - public void parseIPOnly() { - assertEquals(Binding.parse("127.0.0.1"), Ports.Binding("127.0.0.1", null)); - } - - @Test - public void parseEmptyString() { - assertEquals(Binding.parse(""), Ports.Binding(null, null)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Binding 'nonsense'") - public void parseInvalidInput() { - Binding.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Binding 'null'") - public void parseNull() { - Binding.parse(null); - } - - @Test - public void toStringIpAndHost() { - assertEquals(Binding.parse("127.0.0.1:80").toString(), "127.0.0.1:80"); - } - - @Test - public void toStringPortOnly() { - assertEquals(Binding.parse("80").toString(), "80"); - } - - @Test - public void toStringIpOnly() { - assertEquals(Binding.parse("127.0.0.1").toString(), "127.0.0.1"); - } + @Test + public void parseIpAndPort() { + assertEquals(Binding.parse("127.0.0.1:80"), Ports.Binding("127.0.0.1", 80)); + } + + @Test + public void parsePortOnly() { + assertEquals(Binding.parse("80"), Ports.Binding(null, 80)); + } + + @Test + public void parseIPOnly() { + assertEquals(Binding.parse("127.0.0.1"), Ports.Binding("127.0.0.1", null)); + } + + @Test + public void parseEmptyString() { + assertEquals(Binding.parse(""), Ports.Binding(null, null)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Binding 'nonsense'") + public void parseInvalidInput() { + Binding.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Binding 'null'") + public void parseNull() { + Binding.parse(null); + } + + @Test + public void toStringIpAndHost() { + assertEquals(Binding.parse("127.0.0.1:80").toString(), "127.0.0.1:80"); + } + + @Test + public void toStringPortOnly() { + assertEquals(Binding.parse("80").toString(), "80"); + } + + @Test + public void toStringIpOnly() { + assertEquals(Binding.parse("127.0.0.1").toString(), "127.0.0.1"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java b/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java index eb6e2a542..e45ad2e8e 100644 --- a/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java +++ b/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java @@ -8,22 +8,22 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class CapabilityTest { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = new ObjectMapper(); - @Test - public void serializeCapability() throws Exception { - String json = objectMapper.writeValueAsString(Capability.ALL); - assertEquals(json, "\"ALL\""); - } + @Test + public void serializeCapability() throws Exception { + String json = objectMapper.writeValueAsString(Capability.ALL); + assertEquals(json, "\"ALL\""); + } - @Test - public void deserializeCapability() throws Exception { - Capability capability = objectMapper.readValue("\"ALL\"", Capability.class); - assertEquals(capability, Capability.ALL); - } + @Test + public void deserializeCapability() throws Exception { + Capability capability = objectMapper.readValue("\"ALL\"", Capability.class); + assertEquals(capability, Capability.ALL); + } - @Test(expectedExceptions = JsonMappingException.class) - public void deserializeInvalidCapability() throws Exception { - objectMapper.readValue("\"nonsense\"", Capability.class); - } + @Test(expectedExceptions = JsonMappingException.class) + public void deserializeInvalidCapability() throws Exception { + objectMapper.readValue("\"nonsense\"", Capability.class); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java b/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java index de1d23c21..086613045 100644 --- a/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java +++ b/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java @@ -8,33 +8,31 @@ public class ExposedPortTest { - @Test - public void parsePortAndProtocol() { - ExposedPort exposedPort = ExposedPort.parse("80/tcp"); - assertEquals(exposedPort, new ExposedPort(80, TCP)); - } - - @Test - public void parsePortOnly() { - ExposedPort exposedPort = ExposedPort.parse("80"); - assertEquals(exposedPort, new ExposedPort(80, DEFAULT)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'nonsense'") - public void parseInvalidInput() { - ExposedPort.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'null'") - public void parseNull() { - ExposedPort.parse(null); - } - - @Test - public void stringify() { - assertEquals(ExposedPort.parse("80/tcp").toString(), "80/tcp"); - } + @Test + public void parsePortAndProtocol() { + ExposedPort exposedPort = ExposedPort.parse("80/tcp"); + assertEquals(exposedPort, new ExposedPort(80, TCP)); + } + + @Test + public void parsePortOnly() { + ExposedPort exposedPort = ExposedPort.parse("80"); + assertEquals(exposedPort, new ExposedPort(80, DEFAULT)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'nonsense'") + public void parseInvalidInput() { + ExposedPort.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'null'") + public void parseNull() { + ExposedPort.parse(null); + } + + @Test + public void stringify() { + assertEquals(ExposedPort.parse("80/tcp").toString(), "80/tcp"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java index d57c0b572..14325bd12 100644 --- a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java +++ b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java @@ -2,38 +2,36 @@ import junit.framework.TestCase; - public class IdentifierTest extends TestCase { - public void testFromCompoundString() throws Exception { - - Identifier i1 = Identifier.fromCompoundString("10.0.0.1/jim"); - Identifier i2 = Identifier.fromCompoundString("10.0.0.1/jim:123"); - Identifier i3 = Identifier.fromCompoundString("10.0.0.1:123/jim:124"); - Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); + public void testFromCompoundString() throws Exception { - assertTrue(!i1.tag.isPresent()); - assertEquals(i1.repository.name, "10.0.0.1/jim"); + Identifier i1 = Identifier.fromCompoundString("10.0.0.1/jim"); + Identifier i2 = Identifier.fromCompoundString("10.0.0.1/jim:123"); + Identifier i3 = Identifier.fromCompoundString("10.0.0.1:123/jim:124"); + Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); - assertTrue(i2.tag.isPresent()); - assertEquals(i2.tag.get(), "123"); - assertEquals(i2.repository.name, "10.0.0.1/jim"); + assertTrue(!i1.tag.isPresent()); + assertEquals(i1.repository.name, "10.0.0.1/jim"); - assertTrue(i3.tag.isPresent()); - assertEquals(i3.tag.get(), "124"); - assertEquals(i3.repository.name, "10.0.0.1:123/jim"); - assertEquals(i3.repository.getURL().getPort(), 123); - assertEquals(i3A.tag.get(), "latest"); + assertTrue(i2.tag.isPresent()); + assertEquals(i2.tag.get(), "123"); + assertEquals(i2.repository.name, "10.0.0.1/jim"); + assertTrue(i3.tag.isPresent()); + assertEquals(i3.tag.get(), "124"); + assertEquals(i3.repository.name, "10.0.0.1:123/jim"); + assertEquals(i3.repository.getURL().getPort(), 123); + assertEquals(i3A.tag.get(), "latest"); - Identifier i4 = Identifier.fromCompoundString("centos:latest"); - assertTrue(i4.tag.isPresent()); - assertEquals(i4.tag.get(), "latest"); + Identifier i4 = Identifier.fromCompoundString("centos:latest"); + assertTrue(i4.tag.isPresent()); + assertEquals(i4.tag.get(), "latest"); - Identifier i5 = Identifier.fromCompoundString("busybox"); - assertTrue(!i5.tag.isPresent()); + Identifier i5 = Identifier.fromCompoundString("busybox"); + assertTrue(!i5.tag.isPresent()); - Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); - assertEquals(i6.repository.getPath(), "my-test-image"); - } + Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); + assertEquals(i6.repository.getPath(), "my-test-image"); + } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java b/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java index ea0b20d73..25da40d74 100644 --- a/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java +++ b/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java @@ -7,36 +7,34 @@ public class InternetProtocolTest { - @Test - public void defaultProtocol() { - assertEquals(InternetProtocol.DEFAULT, TCP); - } - - @Test - public void stringify() { - assertEquals(TCP.toString(), "tcp"); - } - - @Test - public void parseUpperCase() { - assertEquals(InternetProtocol.parse("TCP"), TCP); - } - - @Test - public void parseLowerCase() { - assertEquals(InternetProtocol.parse("tcp"), TCP); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Protocol.*") - public void parseInvalidInput() { - InternetProtocol.parse("xx"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Protocol 'null'") - public void parseNull() { - InternetProtocol.parse(null); - } + @Test + public void defaultProtocol() { + assertEquals(InternetProtocol.DEFAULT, TCP); + } + + @Test + public void stringify() { + assertEquals(TCP.toString(), "tcp"); + } + + @Test + public void parseUpperCase() { + assertEquals(InternetProtocol.parse("TCP"), TCP); + } + + @Test + public void parseLowerCase() { + assertEquals(InternetProtocol.parse("tcp"), TCP); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Protocol.*") + public void parseInvalidInput() { + InternetProtocol.parse("xx"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Protocol 'null'") + public void parseNull() { + InternetProtocol.parse(null); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/LinkTest.java b/src/test/java/com/github/dockerjava/api/model/LinkTest.java index 2f6df0c5e..208e9f363 100644 --- a/src/test/java/com/github/dockerjava/api/model/LinkTest.java +++ b/src/test/java/com/github/dockerjava/api/model/LinkTest.java @@ -6,35 +6,33 @@ public class LinkTest { - @Test - public void parse() { - Link link = Link.parse("name:alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); - } - - @Test - public void parseWithContainerNames() { - Link link = Link.parse("/name:/conatiner/alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Link 'nonsense'") - public void parseInvalidInput() { - Link.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Link 'null'") - public void parseNull() { - Link.parse(null); - } - - @Test - public void stringify() { - assertEquals(Link.parse("name:alias").toString(), "name:alias"); - } + @Test + public void parse() { + Link link = Link.parse("name:alias"); + assertEquals(link.getName(), "name"); + assertEquals(link.getAlias(), "alias"); + } + + @Test + public void parseWithContainerNames() { + Link link = Link.parse("/name:/conatiner/alias"); + assertEquals(link.getName(), "name"); + assertEquals(link.getAlias(), "alias"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Link 'nonsense'") + public void parseInvalidInput() { + Link.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Link 'null'") + public void parseNull() { + Link.parse(null); + } + + @Test + public void stringify() { + assertEquals(Link.parse("name:alias").toString(), "name:alias"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java b/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java index 2aeb768f6..e5f5f4c1b 100644 --- a/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java @@ -7,55 +7,48 @@ import com.github.dockerjava.api.model.Ports.Binding; public class PortBindingTest { - - private static final ExposedPort TCP_8080 = ExposedPort.tcp(8080); - - @Test - public void fullDefinition() { - assertEquals(PortBinding.parse("127.0.0.1:80:8080/tcp"), - new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); - } - - @Test - public void noProtocol() { - assertEquals(PortBinding.parse("127.0.0.1:80:8080"), - new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); - } - - @Test - public void noHostIp() { - assertEquals(PortBinding.parse("80:8080/tcp"), - new PortBinding(new Binding(80), TCP_8080)); - } - - @Test - public void portsOnly() { - assertEquals(PortBinding.parse("80:8080"), - new PortBinding(new Binding(80), TCP_8080)); - } - - @Test - public void exposedPortOnly() { - assertEquals(PortBinding.parse("8080"), - new PortBinding(new Binding(), TCP_8080)); - } - - @Test - public void dynamicHostPort() { - assertEquals(PortBinding.parse("127.0.0.1::8080"), - new PortBinding(new Binding("127.0.0.1"), TCP_8080)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing PortBinding 'nonsense'") - public void parseInvalidInput() { - PortBinding.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing PortBinding 'null'") - public void parseNull() { - PortBinding.parse(null); - } + + private static final ExposedPort TCP_8080 = ExposedPort.tcp(8080); + + @Test + public void fullDefinition() { + assertEquals(PortBinding.parse("127.0.0.1:80:8080/tcp"), + new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); + } + + @Test + public void noProtocol() { + assertEquals(PortBinding.parse("127.0.0.1:80:8080"), new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); + } + + @Test + public void noHostIp() { + assertEquals(PortBinding.parse("80:8080/tcp"), new PortBinding(new Binding(80), TCP_8080)); + } + + @Test + public void portsOnly() { + assertEquals(PortBinding.parse("80:8080"), new PortBinding(new Binding(80), TCP_8080)); + } + + @Test + public void exposedPortOnly() { + assertEquals(PortBinding.parse("8080"), new PortBinding(new Binding(), TCP_8080)); + } + + @Test + public void dynamicHostPort() { + assertEquals(PortBinding.parse("127.0.0.1::8080"), new PortBinding(new Binding("127.0.0.1"), TCP_8080)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing PortBinding 'nonsense'") + public void parseInvalidInput() { + PortBinding.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing PortBinding 'null'") + public void parseNull() { + PortBinding.parse(null); + } } 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 9190eefd2..8c8d2014f 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 @@ -10,50 +10,51 @@ import com.github.dockerjava.api.model.Ports.Binding; 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 { - Ports ports = objectMapper.readValue(jsonWithDoubleBindingForOnePort, Ports.class); - Map map = ports.getBindings(); - assertEquals(map.size(), 1); - - Binding[] bindings = map.get(ExposedPort.tcp(80)); - assertEquals(bindings.length, 2); - assertEquals(bindings[0], new Binding("10.0.0.1", 80)); - assertEquals(bindings[1], new Binding("10.0.0.2", 80)); - } - - @Test - public void serializingPortWithMultipleBindings() throws Exception { - Ports ports = new Ports(); - ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", 80)); - ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", 80)); - assertEquals(objectMapper.writeValueAsString(ports), jsonWithDoubleBindingForOnePort); - } - - @Test - 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); - } + 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 { + Ports ports = objectMapper.readValue(jsonWithDoubleBindingForOnePort, Ports.class); + Map map = ports.getBindings(); + assertEquals(map.size(), 1); + + Binding[] bindings = map.get(ExposedPort.tcp(80)); + assertEquals(bindings.length, 2); + assertEquals(bindings[0], new Binding("10.0.0.1", 80)); + assertEquals(bindings[1], new Binding("10.0.0.2", 80)); + } + + @Test + public void serializingPortWithMultipleBindings() throws Exception { + Ports ports = new Ports(); + ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", 80)); + ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", 80)); + assertEquals(objectMapper.writeValueAsString(ports), jsonWithDoubleBindingForOnePort); + } + + @Test + 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 18c7f0f09..7b22bd039 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 @@ -11,56 +11,53 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * As there may be several {@link Binding}s per {@link ExposedPort}, - * it makes a difference if you add {@link PortBinding}s for the - * same or different {@link ExposedPort}s to {@link Ports}. - * This test verifies that the Map in {@link Ports} is populated - * correctly in both cases. + * As there may be several {@link Binding}s per {@link ExposedPort}, it makes a difference if you add + * {@link PortBinding}s for the same or different {@link ExposedPort}s to {@link Ports}. This test verifies that the Map + * in {@link Ports} is populated correctly in both cases. */ public class Ports_addBindingsTest { - private static final ExposedPort TCP_80 = ExposedPort.tcp(80); - private static final ExposedPort TCP_90 = ExposedPort.tcp(90); - private static final Binding BINDING_8080 = Ports.Binding(8080); - private static final Binding BINDING_9090 = Ports.Binding(9090); - - private Ports ports; - - @BeforeMethod - public void setup() { - ports = new Ports(); - } - - @Test - public void addTwoBindingsForDifferentExposedPorts() { - ports.add( - new PortBinding(BINDING_8080, TCP_80), - new PortBinding(BINDING_9090, TCP_90)); - - Map bindings = ports.getBindings(); - // two keys with one value each - assertEquals(bindings.size(), 2); - assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080 }); - assertEquals(bindings.get(TCP_90), new Binding[] { BINDING_9090 }); - } - - @Test - public void addTwoBindingsForSameExposedPort() { - ports.add( - new PortBinding(BINDING_8080, TCP_80), - new PortBinding(BINDING_9090, TCP_80)); - - Map bindings = ports.getBindings(); - // one key with two values - assertEquals(bindings.size(), 1); - 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); - } + private static final ExposedPort TCP_80 = ExposedPort.tcp(80); + + private static final ExposedPort TCP_90 = ExposedPort.tcp(90); + + private static final Binding BINDING_8080 = Ports.Binding(8080); + + private static final Binding BINDING_9090 = Ports.Binding(9090); + + private Ports ports; + + @BeforeMethod + public void setup() { + ports = new Ports(); + } + + @Test + public void addTwoBindingsForDifferentExposedPorts() { + ports.add(new PortBinding(BINDING_8080, TCP_80), new PortBinding(BINDING_9090, TCP_90)); + + Map bindings = ports.getBindings(); + // two keys with one value each + assertEquals(bindings.size(), 2); + assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080 }); + assertEquals(bindings.get(TCP_90), new Binding[] { BINDING_9090 }); + } + + @Test + public void addTwoBindingsForSameExposedPort() { + ports.add(new PortBinding(BINDING_8080, TCP_80), new PortBinding(BINDING_9090, TCP_80)); + + Map bindings = ports.getBindings(); + // one key with two values + assertEquals(bindings.size(), 1); + 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); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java index 8a40de28b..8db0273df 100644 --- a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java @@ -3,16 +3,16 @@ import junit.framework.TestCase; public class RepositoryTest extends TestCase { - public void testRepository() throws Exception { + public void testRepository() throws Exception { - Repository repo = new Repository("10.0.0.1/jim"); - Repository repo1 = new Repository("10.0.0.1:1234/jim"); - Repository repo2 = new Repository("busybox"); + Repository repo = new Repository("10.0.0.1/jim"); + Repository repo1 = new Repository("10.0.0.1:1234/jim"); + Repository repo2 = new Repository("busybox"); - assertEquals("jim", repo.getPath()); - assertEquals("jim", repo1.getPath()); - assertEquals("busybox", repo2.getPath()); + assertEquals("jim", repo.getPath()); + assertEquals("jim", repo1.getPath()); + assertEquals("busybox", repo2.getPath()); - assertEquals(1234, repo1.getURL().getPort()); - } + assertEquals(1234, repo1.getURL().getPort()); + } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java index 04823db24..3bc22c00e 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java @@ -6,35 +6,33 @@ public class RestartPolicy_ParsingTest { - @Test - public void noRestart() throws Exception { - assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); - } - - @Test - public void alwaysRestart() throws Exception { - assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); - } - - @Test - public void onFailureRestart() throws Exception { - assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); - } - - @Test - public void onFailureRestartWithCount() throws Exception { - assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") - public void illegalSyntax() throws Exception { - RestartPolicy.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") - public void illegalRetryCount() throws Exception { - RestartPolicy.parse("on-failure:X"); - } + @Test + public void noRestart() throws Exception { + assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); + } + + @Test + public void alwaysRestart() throws Exception { + assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); + } + + @Test + public void onFailureRestart() throws Exception { + assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); + } + + @Test + public void onFailureRestartWithCount() throws Exception { + assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") + public void illegalSyntax() throws Exception { + RestartPolicy.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") + public void illegalRetryCount() throws Exception { + RestartPolicy.parse("on-failure:X"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java index 7b13a3958..b4a9a746a 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java @@ -7,35 +7,38 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** - * Compares serialization results of various {@link RestartPolicy}s with - * what Docker (as of 1.3.3) actually sends when executing - * docker run --restart xxx. + * Compares serialization results of various {@link RestartPolicy}s with what Docker (as of 1.3.3) actually sends when + * executing docker run --restart xxx. */ public class RestartPolicy_SerializingTest { - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test // --restart no - public void noRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); - } - - @Test // --restart always - public void alwaysRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); - } - - @Test // --restart on-failure - public void onFailureRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); - } - - @Test // --restart on-failure:2 - public void onFailureRestartWithCount() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); - assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); - } - + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + // --restart no + public void noRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); + } + + @Test + // --restart always + public void alwaysRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); + } + + @Test + // --restart on-failure + public void onFailureRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); + } + + @Test + // --restart on-failure:2 + public void onFailureRestartWithCount() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); + assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); + } + } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java index a52441d63..a2d99ce9c 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java @@ -7,19 +7,14 @@ public class RestartPolicy_toStringTest { - @DataProvider(name = "input") - public Object[][] restartPolicies() { - return new Object[][] { - { "no" }, - { "always" }, - { "on-failure" }, - { "on-failure:2" } - }; - } + @DataProvider(name = "input") + public Object[][] restartPolicies() { + return new Object[][] { { "no" }, { "always" }, { "on-failure" }, { "on-failure:2" } }; + } - @Test(dataProvider = "input") - public void serializationWithoutCount(String policy) throws Exception { - assertEquals(RestartPolicy.parse(policy).toString(), policy); - } + @Test(dataProvider = "input") + public void serializationWithoutCount(String policy) throws Exception { + assertEquals(RestartPolicy.parse(policy).toString(), policy); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java index e8bafc460..41abaf99d 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -16,8 +16,8 @@ public void t() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class); VolumeBind[] binds = volumeBinds.getBinds(); - assertEquals(binds.length,1); - assertEquals(binds[0].getHostPath(),"/some/path"); + assertEquals(binds.length, 1); + assertEquals(binds[0].getHostPath(), "/some/path"); assertEquals(binds[0].getContainerPath(), "/data"); } @@ -28,5 +28,4 @@ public void t1() throws IOException { objectMapper.readValue(s, VolumeBinds.class); } - } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java index b7c3bbff5..55c7088c4 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java @@ -7,19 +7,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class VolumeFrom_SerializingTest { - private final ObjectMapper objectMapper = new ObjectMapper(); - private final String json = "\"container1:ro\""; - - @Test - public void deserializing() throws Exception { - VolumesFrom volumeFrom = objectMapper.readValue(json, VolumesFrom.class); - assertEquals(volumeFrom, new VolumesFrom("container1", AccessMode.ro)); - } - - @Test - public void serializing() throws Exception { - VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); - assertEquals(objectMapper.writeValueAsString(volumeFrom), json); - } + private final ObjectMapper objectMapper = new ObjectMapper(); + + private final String json = "\"container1:ro\""; + + @Test + public void deserializing() throws Exception { + VolumesFrom volumeFrom = objectMapper.readValue(json, VolumesFrom.class); + assertEquals(volumeFrom, new VolumesFrom("container1", AccessMode.ro)); + } + + @Test + public void serializing() throws Exception { + VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); + assertEquals(objectMapper.writeValueAsString(volumeFrom), json); + } } 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 7419e5dc9..5b8311425 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java @@ -5,8 +5,8 @@ import org.testng.annotations.Test; public class VolumeTest { - @Test - public void getPath() { - assertEquals(new Volume("/path").getPath(), "/path"); - } + @Test + public void getPath() { + assertEquals(new Volume("/path").getPath(), "/path"); + } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 373680471..ba72b492e 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -31,28 +31,26 @@ public abstract class AbstractDockerClientTest extends Assert { - public static final Logger LOG = LoggerFactory - .getLogger(AbstractDockerClientTest.class); + public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); protected DockerClient dockerClient; - protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory(DockerClientBuilder.getDefaultDockerCmdExecFactory()); + protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory( + DockerClientBuilder.getDefaultDockerCmdExecFactory()); - public void beforeTest() { + public void beforeTest() { - LOG.info("======================= BEFORETEST ======================="); - LOG.info("Connecting to Docker server"); - dockerClient = DockerClientBuilder.getInstance(config()) - .withDockerCmdExecFactory(dockerCmdExecFactory) - .build(); + LOG.info("======================= BEFORETEST ======================="); + LOG.info("Connecting to Docker server"); + dockerClient = DockerClientBuilder.getInstance(config()).withDockerCmdExecFactory(dockerCmdExecFactory).build(); - LOG.info("Pulling image 'busybox'"); - // need to block until image is pulled completely - asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); + LOG.info("Pulling image 'busybox'"); + // need to block until image is pulled completely + asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); - assertNotNull(dockerClient); - LOG.info("======================= END OF BEFORETEST =======================\n\n"); - } + assertNotNull(dockerClient); + LOG.info("======================= END OF BEFORETEST =======================\n\n"); + } private DockerClientConfig config() { return config(null); @@ -61,130 +59,124 @@ private DockerClientConfig config() { protected DockerClientConfig config(String password) { DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() .withServerAddress("https://index.docker.io/v1/"); - if (password!=null) { + if (password != null) { builder = builder.withPassword(password); } - return builder - .build(); + return builder.build(); } public void afterTest() { - LOG.info("======================= END OF AFTERTEST ======================="); - } - - - public void beforeMethod(Method method) { - LOG.info(String - .format("################################## STARTING %s ##################################", - method.getName())); - } - - public void afterMethod(ITestResult result) { - - for (String container : dockerCmdExecFactory.getContainerNames()) { - LOG.info("Cleaning up temporary container {}", container); - - try { - dockerClient.removeContainerCmd(container).withForce().exec(); - } catch (DockerException ignore) { - //ignore.printStackTrace(); - } - } - - for (String image : dockerCmdExecFactory.getImageNames()) { - LOG.info("Cleaning up temporary image with {}", image); - try { - dockerClient.removeImageCmd(image).withForce().exec(); - } catch (DockerException ignore) { - //ignore.printStackTrace(); - } - } - - LOG.info( - "################################## END OF {} ##################################\n", - result.getName()); - } - - protected String asString(InputStream response) { - return consumeAsString(response); - } - - public static String consumeAsString(InputStream response) { - - StringWriter logwriter = new StringWriter(); - - try { - LineIterator itr = IOUtils.lineIterator( - response, "UTF-8"); - - while (itr.hasNext()) { - String line = itr.next(); - logwriter.write(line + (itr.hasNext() ? "\n" : "")); - LOG.info("line: "+line); - } - response.close(); - - return logwriter.toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - IOUtils.closeQuietly(response); - } - } - - // UTIL - - /** - * Checks to see if a specific port is available. - * - * @param port - * the port to check for availability - */ - public static boolean available(int port) { - if (port < 1100 || port > 60000) { - throw new IllegalArgumentException("Invalid start port: " + port); - } - - ServerSocket ss = null; - DatagramSocket ds = null; - try { - ss = new ServerSocket(port); - ss.setReuseAddress(true); - ds = new DatagramSocket(port); - ds.setReuseAddress(true); - return true; - } catch (IOException ignored) { - } finally { - if (ds != null) { - ds.close(); - } - - if (ss != null) { - try { - ss.close(); - } catch (IOException e) { - /* should not be thrown */ - } - } - } - - return false; - } - - /** - * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) - * has {@link VolumeBind}s for the given {@link Volume}s - */ - 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())); - } - assertThat(volumes, contains(expectedVolumes)); - } + LOG.info("======================= END OF AFTERTEST ======================="); + } + + public void beforeMethod(Method method) { + LOG.info(String.format("################################## STARTING %s ##################################", + method.getName())); + } + + public void afterMethod(ITestResult result) { + + for (String container : dockerCmdExecFactory.getContainerNames()) { + LOG.info("Cleaning up temporary container {}", container); + + try { + dockerClient.removeContainerCmd(container).withForce().exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + for (String image : dockerCmdExecFactory.getImageNames()) { + LOG.info("Cleaning up temporary image with {}", image); + try { + dockerClient.removeImageCmd(image).withForce().exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + LOG.info("################################## END OF {} ##################################\n", result.getName()); + } + + protected String asString(InputStream response) { + return consumeAsString(response); + } + + public static String consumeAsString(InputStream response) { + + StringWriter logwriter = new StringWriter(); + + try { + LineIterator itr = IOUtils.lineIterator(response, "UTF-8"); + + while (itr.hasNext()) { + String line = itr.next(); + logwriter.write(line + (itr.hasNext() ? "\n" : "")); + LOG.info("line: " + line); + } + response.close(); + + return logwriter.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + IOUtils.closeQuietly(response); + } + } + + // UTIL + + /** + * Checks to see if a specific port is available. + * + * @param port + * the port to check for availability + */ + public static boolean available(int port) { + if (port < 1100 || port > 60000) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException ignored) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + /** + * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) has {@link VolumeBind}s for + * the given {@link Volume}s + */ + 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())); + } + assertThat(volumes, contains(expectedVolumes)); + } } diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index e5bef57d3..85ee0d7ac 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -24,50 +24,46 @@ */ @Test(groups = "integration") public class DockerClientTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(DockerClientTest.class); + public static final Logger LOG = LoggerFactory.getLogger(DockerClientTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - @Test - public void testRunShlex() throws DockerException { + @Test + public void testRunShlex() throws DockerException { - String[] commands = new String[] { - "true", - "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"", - "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'", - "/bin/sh -c echo Hello World", "/bin/sh -c echo 'Hello World'", - "echo 'Night of Nights'", "true && echo 'Night of Nights'" }; + String[] commands = new String[] { "true", + "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"", + "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'", + "/bin/sh -c echo Hello World", "/bin/sh -c echo 'Hello World'", "echo 'Night of Nights'", + "true && echo 'Night of Nights'" }; - for (String command : commands) { - LOG.info("Running command: [{}]", command); + for (String command : commands) { + LOG.info("Running command: [{}]", command); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd(commands).exec(); - dockerClient.startContainerCmd(container.getId()); - - int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(); - assertThat(exitcode, equalTo(0)); - } - } + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(commands).exec(); + dockerClient.startContainerCmd(container.getId()); + int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(); + assertThat(exitcode, equalTo(0)); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java index 5212fe50d..8c93df20a 100644 --- a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java +++ b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java @@ -18,42 +18,43 @@ public class CompressArchiveUtilTest { - @Test - public void testExecutableFlagIsPreserved() throws Exception { - File executableFile = createExecutableFile(); - File archive = CompressArchiveUtil.archiveTARFiles(executableFile.getParentFile(), asList(executableFile), "archive"); - File expectedFile = extractFileByName(archive, "executableFile.sh.result"); - - assertThat("should be executable", expectedFile.canExecute()); - } - - private File createExecutableFile() throws IOException { - File baseDir = new File(FileUtils.getTempDirectoryPath()); - File executableFile = new File(baseDir, "executableFile.sh"); - executableFile.createNewFile(); - executableFile.setExecutable(true); - assertThat(executableFile.canExecute(), is(true)); - return executableFile; - } - - private File extractFileByName(File archive, String filenameToExtract) throws IOException { - File baseDir = new File(FileUtils.getTempDirectoryPath()); - File expectedFile = new File(baseDir, filenameToExtract); - expectedFile.delete(); - assertThat(expectedFile.exists(), is(false)); - - TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new FileInputStream(archive)); - TarArchiveEntry entry; - while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { - String individualFiles = entry.getName(); - // there should be only one file in this archive - assertThat(individualFiles, equalTo("executableFile.sh")); - IOUtils.copy(tarArchiveInputStream, new FileOutputStream(expectedFile)); - if ((entry.getMode() & 0755) == 0755) { - expectedFile.setExecutable(true); - } + @Test + public void testExecutableFlagIsPreserved() throws Exception { + File executableFile = createExecutableFile(); + File archive = CompressArchiveUtil.archiveTARFiles(executableFile.getParentFile(), asList(executableFile), + "archive"); + File expectedFile = extractFileByName(archive, "executableFile.sh.result"); + + assertThat("should be executable", expectedFile.canExecute()); + } + + private File createExecutableFile() throws IOException { + File baseDir = new File(FileUtils.getTempDirectoryPath()); + File executableFile = new File(baseDir, "executableFile.sh"); + executableFile.createNewFile(); + executableFile.setExecutable(true); + assertThat(executableFile.canExecute(), is(true)); + return executableFile; + } + + private File extractFileByName(File archive, String filenameToExtract) throws IOException { + File baseDir = new File(FileUtils.getTempDirectoryPath()); + File expectedFile = new File(baseDir, filenameToExtract); + expectedFile.delete(); + assertThat(expectedFile.exists(), is(false)); + + TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new FileInputStream(archive)); + TarArchiveEntry entry; + while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { + String individualFiles = entry.getName(); + // there should be only one file in this archive + assertThat(individualFiles, equalTo("executableFile.sh")); + IOUtils.copy(tarArchiveInputStream, new FileOutputStream(expectedFile)); + if ((entry.getMode() & 0755) == 0755) { + expectedFile.setExecutable(true); + } + } + tarArchiveInputStream.close(); + return expectedFile; } - tarArchiveInputStream.close(); - return expectedFile; - } } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 64ab912d0..634d0e9a5 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,12 +16,14 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, + false, false, new LocalDirectorySSLConfig("flim"), 20, 2); } @Test public void string() throws Exception { - assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", + assertEquals( + "DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", EXAMPLE_CONFIG.toString()); } @@ -150,7 +152,7 @@ public void defaults() throws Exception { systemProperties.setProperty("user.home", "someHomeDir"); // when you build config - DockerClientConfig config = buildConfig(Collections.emptyMap(), systemProperties); + DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then the cert path is as expected assertEquals(config.getUri(), URI.create("https://localhost:2376")); @@ -159,7 +161,7 @@ public void defaults() throws Exception { assertEquals(config.getVersion(), null); assertEquals(config.isLoggingFilterEnabled(), true); assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); - assertEquals( ((LocalDirectorySSLConfig)config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); + assertEquals(((LocalDirectorySSLConfig) config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); } @Test @@ -179,7 +181,7 @@ public void systemProperties() throws Exception { systemProperties.setProperty("docker.io.enableLoggingFilter", "false"); // when you build new config - DockerClientConfig config = buildConfig(Collections.emptyMap(), systemProperties); + DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then it is the same as the example assertEquals(config, EXAMPLE_CONFIG); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 2a961e3b8..eac3bb725 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,8 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, + false, null, 20, 2); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index 215926a56..cf5b03188 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -40,8 +40,7 @@ public void testMatch(MatchTestCase testCase) throws IOException { @DataProvider public Object[][] getTestData() { - return new Object[][] { - new Object[] { new MatchTestCase("abc", "abc", true, false) }, + return new Object[][] { new Object[] { new MatchTestCase("abc", "abc", true, false) }, new Object[] { new MatchTestCase("*", "abc", true, false) }, new Object[] { new MatchTestCase("*c", "abc", true, false) }, new Object[] { new MatchTestCase("a*", "a", true, false) }, @@ -99,8 +98,11 @@ public Object[][] getTestData() { private final class MatchTestCase { private final String pattern; + private final String s; + private final boolean matches; + private final boolean expectException; public MatchTestCase(String pattern, String s, boolean matches, boolean expectException) { @@ -113,8 +115,8 @@ public MatchTestCase(String pattern, String s, boolean matches, boolean expectEx @Override public String toString() { - return "MatchTestCase [pattern=" + pattern + ", s=" + s + ", matches=" + matches - + ", expectException=" + expectException + "]"; + return "MatchTestCase [pattern=" + pattern + ", s=" + s + ", matches=" + matches + ", expectException=" + + expectException + "]"; } } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index fb764474f..380f5dd9f 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -11,188 +11,184 @@ import com.github.dockerjava.jaxrs.BuildImageCmdExec; /** - * Special {@link DockerCmdExecFactory} implementation that collects container - * and image creations while test execution for the purpose of automatically - * cleanup. + * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution + * for the purpose of automatically cleanup. * * @author marcus * */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { - private List containerNames = new ArrayList(); - - private List imageNames = new ArrayList(); - - private DockerCmdExecFactory delegate; - - public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { - this.delegate = delegate; - } - - @Override - public void init(DockerClientConfig dockerClientConfig) { - delegate.init(dockerClientConfig); - } - - @Override - public void close() throws IOException { - delegate.close(); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmd.Exec() { - @Override - public CreateContainerResponse exec(CreateContainerCmd command) { - CreateContainerResponse createContainerResponse = delegate - .createCreateContainerCmdExec().exec(command); - containerNames.add(createContainerResponse.getId()); - return createContainerResponse; - } - }; - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmd.Exec() { - @Override - public Void exec(RemoveContainerCmd command) { - delegate.createRemoveContainerCmdExec().exec(command); - containerNames.remove(command.getContainerId()); - return null; - } - }; - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmd.Exec() { - @Override - public CreateImageResponse exec(CreateImageCmd command) { - CreateImageResponse createImageResponse = delegate - .createCreateImageCmdExec().exec(command); - imageNames.add(createImageResponse.getId()); - return createImageResponse; - } - }; - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmd.Exec() { - @Override - public Void exec(RemoveImageCmd command) { - delegate.createRemoveImageCmdExec().exec(command); - imageNames.remove(command.getImageId()); - return null; - } - }; - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmd.Exec() { - @Override - public BuildImageCmd.Response exec(BuildImageCmd command) { - // can't detect image id here so tagging it - String tag = command.getTag(); - if (tag == null || "".equals(tag.trim())) { - tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); - command.withTag(tag); - } - InputStream inputStream = delegate.createBuildImageCmdExec() - .exec(command); - imageNames.add(tag); - return new BuildImageCmdExec.ResponseImpl(inputStream); - } - }; - } - - @Override - public Exec createAuthCmdExec() { - return delegate.createAuthCmdExec(); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return delegate.createInfoCmdExec(); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return delegate.createPingCmdExec(); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return delegate.createExecCmdExec(); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return delegate.createVersionCmdExec(); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return delegate.createPullImageCmdExec(); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return delegate.createPushImageCmdExec(); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { - return delegate.createSaveImageCmdExec(); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return delegate.createSearchImagesCmdExec(); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return delegate.createListImagesCmdExec(); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return delegate.createInspectImageCmdExec(); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return delegate.createListContainersCmdExec(); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return delegate.createStartContainerCmdExec(); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return delegate.createInspectContainerCmdExec(); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return delegate.createWaitContainerCmdExec(); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return delegate.createAttachContainerCmdExec(); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return delegate.createExecStartCmdExec(); - } + private List containerNames = new ArrayList(); + + private List imageNames = new ArrayList(); + + private DockerCmdExecFactory delegate; + + public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { + this.delegate = delegate; + } + + @Override + public void init(DockerClientConfig dockerClientConfig) { + delegate.init(dockerClientConfig); + } + + @Override + public void close() throws IOException { + delegate.close(); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmd.Exec() { + @Override + public CreateContainerResponse exec(CreateContainerCmd command) { + CreateContainerResponse createContainerResponse = delegate.createCreateContainerCmdExec().exec(command); + containerNames.add(createContainerResponse.getId()); + return createContainerResponse; + } + }; + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmd.Exec() { + @Override + public Void exec(RemoveContainerCmd command) { + delegate.createRemoveContainerCmdExec().exec(command); + containerNames.remove(command.getContainerId()); + return null; + } + }; + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmd.Exec() { + @Override + public CreateImageResponse exec(CreateImageCmd command) { + CreateImageResponse createImageResponse = delegate.createCreateImageCmdExec().exec(command); + imageNames.add(createImageResponse.getId()); + return createImageResponse; + } + }; + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmd.Exec() { + @Override + public Void exec(RemoveImageCmd command) { + delegate.createRemoveImageCmdExec().exec(command); + imageNames.remove(command.getImageId()); + return null; + } + }; + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmd.Exec() { + @Override + public BuildImageCmd.Response exec(BuildImageCmd command) { + // can't detect image id here so tagging it + String tag = command.getTag(); + if (tag == null || "".equals(tag.trim())) { + tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); + command.withTag(tag); + } + InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); + imageNames.add(tag); + return new BuildImageCmdExec.ResponseImpl(inputStream); + } + }; + } + + @Override + public Exec createAuthCmdExec() { + return delegate.createAuthCmdExec(); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return delegate.createInfoCmdExec(); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return delegate.createPingCmdExec(); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return delegate.createExecCmdExec(); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return delegate.createVersionCmdExec(); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return delegate.createPullImageCmdExec(); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return delegate.createPushImageCmdExec(); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return delegate.createSaveImageCmdExec(); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return delegate.createSearchImagesCmdExec(); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return delegate.createListImagesCmdExec(); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return delegate.createInspectImageCmdExec(); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return delegate.createListContainersCmdExec(); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return delegate.createStartContainerCmdExec(); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return delegate.createInspectContainerCmdExec(); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return delegate.createWaitContainerCmdExec(); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return delegate.createAttachContainerCmdExec(); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return delegate.createExecStartCmdExec(); + } @Override public InspectExecCmd.Exec createInspectExecCmdExec() { @@ -200,76 +196,76 @@ public InspectExecCmd.Exec createInspectExecCmdExec() { } @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return delegate.createLogContainerCmdExec(); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return delegate.createCopyFileFromContainerCmdExec(); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return delegate.createStopContainerCmdExec(); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return delegate.createContainerDiffCmdExec(); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return delegate.createKillContainerCmdExec(); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return delegate.createRestartContainerCmdExec(); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return delegate.createCommitCmdExec(); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return delegate.createTopContainerCmdExec(); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return delegate.createTagImageCmdExec(); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return delegate.createPauseContainerCmdExec(); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return delegate.createUnpauseContainerCmdExec(); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return delegate.createEventsCmdExec(); - } - - @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return delegate.createLogContainerCmdExec(); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return delegate.createCopyFileFromContainerCmdExec(); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return delegate.createStopContainerCmdExec(); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return delegate.createContainerDiffCmdExec(); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return delegate.createKillContainerCmdExec(); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return delegate.createRestartContainerCmdExec(); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return delegate.createCommitCmdExec(); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return delegate.createTopContainerCmdExec(); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return delegate.createTagImageCmdExec(); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return delegate.createPauseContainerCmdExec(); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return delegate.createUnpauseContainerCmdExec(); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return delegate.createEventsCmdExec(); + } + + @Override public StatsCmd.Exec createStatsCmdExec() { - return delegate.createStatsCmdExec(); - } + return delegate.createStatsCmdExec(); + } - public List getContainerNames() { - return new ArrayList(containerNames); - } + public List getContainerNames() { + return new ArrayList(containerNames); + } - public List getImageNames() { - return new ArrayList(imageNames); - } + public List getImageNames() { + return new ArrayList(imageNames); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java index 950111497..3c60cada2 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -13,41 +13,41 @@ @Test(groups = "integration") public class AuthCmdImplTest 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 testAuth() throws Exception { + @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 testAuth() throws Exception { AuthResponse response = dockerClient.authCmd().exec(); assertEquals(response.getStatus(), "Login Succeeded"); } - @Test - public void testAuthInvalid() throws Exception { + @Test + public void testAuthInvalid() throws Exception { try { - DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec(); + DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec(); fail("Expected a UnauthorizedException caused by a bad password."); - } catch (UnauthorizedException e) { - assertEquals(e.getMessage(), "Wrong login/password, please try again\n"); - } - } + } catch (UnauthorizedException e) { + assertEquals(e.getMessage(), "Wrong login/password, please try again\n"); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index c9bd51b90..f61b61e69 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -40,48 +40,43 @@ @Test(groups = "integration") public class BuildImageCmdImplTest 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 testNginxDockerfileBuilder() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("nginx").getFile()); - - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); - - String imageId = StringUtils.substringBetween(fullLog, - "Successfully built ", "\\n\"}").trim(); - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - assertThat(inspectImageResponse, not(nullValue())); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - - assertThat(inspectImageResponse.getAuthor(), - equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); - } + @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 testNginxDockerfileBuilder() { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile()); + + InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + + String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); + } @Test(groups = "ignoreInCircleCi") public void testNonstandard1() { @@ -96,16 +91,12 @@ public void testNonstandard1() { @Test(groups = "ignoreInCircleCi") public void testNonstandard2() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("nonstandard").getFile()); + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nonstandard").getFile()); File dockerFile = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); - - InputStream response = dockerClient.buildImageCmd() - .withBaseDirectory(baseDir) - .withDockerfile(dockerFile) - .withNoCache().exec(); + InputStream response = dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile) + .withNoCache().exec(); String fullLog = asString(response); assertThat(fullLog, containsString("Successfully built")); @@ -121,49 +112,42 @@ public void testDockerBuilderFromTar() throws IOException { } @Test - public void testDockerBuilderAddUrl() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testAddUrl").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Docker")); - } - - @Test - public void testDockerBuilderAddFileInSubfolder() throws DockerException, - IOException { - 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 { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testAddFilesViaWildcard").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Successfully executed testinclude1.sh")); - assertThat(response, not(containsString("Successfully executed testinclude2.sh"))); - } - - @Test - public void testDockerBuilderAddFolder() throws DockerException, - IOException { - 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 { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testEnv").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Successfully executed testrun.sh")); - } + public void testDockerBuilderAddUrl() { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddUrl").getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Docker")); + } + + @Test + public void testDockerBuilderAddFileInSubfolder() throws DockerException, IOException { + 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 { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFilesViaWildcard") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testinclude1.sh")); + assertThat(response, not(containsString("Successfully executed testinclude2.sh"))); + } + + @Test + public void testDockerBuilderAddFolder() throws DockerException, IOException { + 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 { + 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) { return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream)); @@ -171,7 +155,7 @@ private String dockerfileBuild(InputStream tarInputStream) { private String dockerfileBuild(File baseDir) { return execBuild(dockerClient.buildImageCmd(baseDir)); - } + } private String execBuild(BuildImageCmd buildImageCmd) { // Build image @@ -194,91 +178,83 @@ private String execBuild(BuildImageCmd buildImageCmd) { // Log container InputStream logResponse = logContainer(container.getId()); - //assertThat(asString(logResponse), containsString(expectedText)); + // assertThat(asString(logResponse), containsString(expectedText)); return asString(logResponse); } - private InputStream logContainer(String containerId) { - return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec(); - } - - @Test(expectedExceptions={DockerClientException.class}) - public void testDockerfileIgnored() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testDockerfileIgnored").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - } - - @Test(expectedExceptions={DockerClientException.class}) - public void testInvalidDockerIgnorePattern() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testInvalidDockerignorePattern").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - } - - @Test(groups = "ignoreInCircleCi") - public void testDockerIgnore() throws DockerException, - IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testDockerignore").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d")); - } - - @Test - public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("netcat").getFile()); - - Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); - - String imageId = null; - - for(EventStreamItem item : response) { - String text = item.getStream(); - if( text.startsWith("Successfully built ")) { - imageId = StringUtils.substringBetween(text, - "Successfully built ", "\n").trim(); - } - } - - assertNotNull(imageId, "Not successful in build"); - - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - 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(); - - assertThat(inspectContainerResponse.getId(), notNullValue()); - assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), - notNullValue()); - - // No use as such if not running on the server -// for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) { -// int port = Integer.valueOf(p.getHostPort()); -// LOG.info("Checking port {} is open", port); -// assertThat(available(port), is(false)); -// } - dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec(); - - } - - @Test - public void testAddAndCopySubstitution () throws DockerException, IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testENVSubstitution").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("testENVSubstitution successfully completed")); - } + private InputStream logContainer(String containerId) { + return dockerClient.logContainerCmd(containerId).withStdErr().withStdOut().exec(); + } + + @Test(expectedExceptions = { DockerClientException.class }) + public void testDockerfileIgnored() { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") + .getFile()); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + } + + @Test(expectedExceptions = { DockerClientException.class }) + public void testInvalidDockerIgnorePattern() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("testInvalidDockerignorePattern").getFile()); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + } + + @Test(groups = "ignoreInCircleCi") + public void testDockerIgnore() throws DockerException, IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerignore") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d")); + } + + @Test + public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); + + Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); + + String imageId = null; + + for (EventStreamItem item : response) { + String text = item.getStream(); + if (text.startsWith("Successfully built ")) { + imageId = StringUtils.substringBetween(text, "Successfully built ", "\n").trim(); + } + } + + assertNotNull(imageId, "Not successful in build"); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + 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(); + + assertThat(inspectContainerResponse.getId(), notNullValue()); + assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), notNullValue()); + + // No use as such if not running on the server + // for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) { + // int port = Integer.valueOf(p.getHostPort()); + // LOG.info("Checking port {} is open", port); + // assertThat(available(port), is(false)); + // } + dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec(); + + } + + @Test + public void testAddAndCopySubstitution() throws DockerException, IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testENVSubstitution") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("testENVSubstitution successfully completed")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java index ea5f6128d..415ca8f0b 100644 --- a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java @@ -25,63 +25,56 @@ @Test(groups = "integration") public class CommitCmdImplTest 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 commit() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("touch", "/test").exec(); - - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Commiting container: {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - - assertThat(inspectImageResponse, - hasField("container", startsWith(container.getId()))); - assertThat(inspectImageResponse.getContainerConfig().getImage(), - equalTo("busybox")); - - InspectImageResponse busyboxImg = dockerClient.inspectImageCmd("busybox").exec(); - - assertThat(inspectImageResponse.getParent(), - equalTo(busyboxImg.getId())); - } - - - @Test - public void commitNonExistingContainer() throws DockerException { - try { - dockerClient.commitCmd("non-existent").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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 commit() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Commiting container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse, hasField("container", startsWith(container.getId()))); + assertThat(inspectImageResponse.getContainerConfig().getImage(), equalTo("busybox")); + + InspectImageResponse busyboxImg = dockerClient.inspectImageCmd("busybox").exec(); + + assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId())); + } + + @Test + public void commitNonExistingContainer() throws DockerException { + try { + dockerClient.commitCmd("non-existent").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java index 58c95486c..e94c8c6c2 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -26,56 +26,53 @@ @Test(groups = "integration") public class ContainerDiffCmdImplTest 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(groups = "ignoreInCircleCi") - public void testContainerDiff() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("touch", "/test" ).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)); - - List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); - LOG.info("Container DIFF: {}", filesystemDiff.toString()); - - assertThat(filesystemDiff.size(), equalTo(1)); - ChangeLog testChangeLog = selectUnique(filesystemDiff, - hasField("path", equalTo("/test"))); - - assertThat(testChangeLog, hasField("path", equalTo("/test"))); - assertThat(testChangeLog, hasField("kind", equalTo(1))); - } - - @Test - public void testContainerDiffWithNonExistingContainer() throws DockerException { - try { - dockerClient.containerDiffCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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(groups = "ignoreInCircleCi") + public void testContainerDiff() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").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)); + + List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); + LOG.info("Container DIFF: {}", filesystemDiff.toString()); + + assertThat(filesystemDiff.size(), equalTo(1)); + ChangeLog testChangeLog = selectUnique(filesystemDiff, hasField("path", equalTo("/test"))); + + assertThat(testChangeLog, hasField("path", equalTo("/test"))); + assertThat(testChangeLog, hasField("kind", equalTo(1))); + } + + @Test + public void testContainerDiffWithNonExistingContainer() throws DockerException { + try { + dockerClient.containerDiffCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java index 193b787ce..72a97d04c 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -40,9 +40,7 @@ public void afterMethod(ITestResult result) { public void copyFromContainer() throws Exception { // TODO extract this into a shared method CreateContainerResponse container = dockerClient.createContainerCmd("busybox") - .withName("docker-java-itest-copyFromContainer") - .withCmd("touch", "/copyFromContainer") - .exec(); + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); LOG.info("Created container: {}", container); assertThat(container.getId(), not(isEmptyOrNullString())); @@ -58,7 +56,7 @@ public void copyFromContainer() throws Exception { assertNotNull(responseAsString); assertTrue(responseAsString.length() > 0); } - + @Test public void copyFromNonExistingContainer() throws Exception { try { diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java index c652f51d7..a33cfddfe 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -23,546 +23,471 @@ @Test(groups = "integration") public class CreateContainerCmdImplTest 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 createContainerWithExistingName() throws DockerException { - - String containerName = "generated_" + new SecureRandom().nextInt(); - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("env") - .withName(containerName).exec(); - - LOG.info("Created container {}", container.toString()); - - assertThat(container.getId(), not(isEmptyString())); - - try { - dockerClient.createContainerCmd("busybox").withCmd("env") - .withName(containerName).exec(); - fail("expected ConflictException"); - } catch (ConflictException e) { - } - } - - @Test - public void createContainerWithVolume() throws DockerException { - - Volume volume = new Volume("/var/log"); - - 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("/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(); + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - LOG.info("Created container {}", container.toString()); + @AfterTest + public void afterTest() { + super.afterTest(); + } - assertThat(container.getId(), not(isEmptyString())); + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - LOG.info("Inspect container {}", inspectContainerResponse.getConfig() - .getVolumes()); + @Test + public void createContainerWithExistingName() throws DockerException { - assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), - contains("/srv/test")); - - assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(new VolumeRW(volume))); - } - - @Test - public void createContainerWithVolumesFrom() throws DockerException { + String containerName = "generated_" + new SecureRandom().nextInt(); - Volume volume1 = new Volume("/opt/webapp1"); - Volume volume2 = new Volume("/opt/webapp2"); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("env") + .withName(containerName).exec(); - 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()); + LOG.info("Created container {}", container.toString()); - dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("Started container1 {}", container1.toString()); + assertThat(container.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( - container1.getId()).exec(); + try { + dockerClient.createContainerCmd("busybox").withCmd("env").withName(containerName).exec(); + fail("expected ConflictException"); + } catch (ConflictException e) { + } + } - assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + @Test + public void createContainerWithVolume() throws DockerException { - // 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()); + Volume volume = new Volume("/var/log"); - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume) + .withCmd("true").exec(); - // No volumes are created, the information is just stored in .HostConfig.VolumesFrom - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name))); + LOG.info("Created container {}", container.toString()); - // 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(container.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom(container1Name))); - assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); - } - - @Test - public void createContainerWithEnv() throws DockerException { + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withEnv("VARIABLE=success") - .withCmd("env").exec(); - - LOG.info("Created container {}", container.toString()); - - assertThat(container.getId(), not(isEmptyString())); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - - assertThat( - Arrays.asList(inspectContainerResponse.getConfig().getEnv()), - containsInAnyOrder("VARIABLE=success")); + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); - dockerClient.startContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); - assertThat(asString(dockerClient.logContainerCmd(container.getId()) - .withStdOut().exec()), containsString("VARIABLE=success")); - } + assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw))); + } - @Test - public void createContainerWithHostname() throws DockerException { + @Test + public void createContainerWithReadOnlyVolume() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withHostName("docker-java") - .withCmd("env").exec(); + Volume volume = new Volume("/srv/test"); - 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())); - assertThat(inspectContainerResponse.getConfig().getHostName(), - equalTo("docker-java")); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - dockerClient.startContainerCmd(container.getId()).exec(); + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); - assertThat(asString(dockerClient.logContainerCmd(container.getId()) - .withStdOut().exec()), containsString("HOSTNAME=docker-java")); - } + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test")); - @Test - public void createContainerWithName() throws DockerException { + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume))); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withCmd("env").exec(); + @Test + public void createContainerWithVolumesFrom() throws DockerException { - LOG.info("Created container {}", container.toString()); + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); - assertThat(container.getId(), not(isEmptyString())); + String container1Name = UUID.randomUUID().toString(); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + // 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()); - assertThat(inspectContainerResponse.getName(), equalTo("/container")); + dockerClient.startContainerCmd(container1.getId()).exec(); + LOG.info("Started container1 {}", container1.toString()); - try { - dockerClient.createContainerCmd("busybox").withName("container") - .withCmd("env").exec(); - fail("Expected ConflictException"); - } catch (ConflictException e) { - } + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); - } - - @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(); + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + // 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()); - 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(); - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1","container1Link")})); - } + // No volumes are created, the information is just stored in .HostConfig.VolumesFrom + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); - @Test - public void createContainerWithCapAddAndCapDrop() 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()); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCapAdd(NET_ADMIN) - .withCapDrop(MKNOD).exec(); + inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); - LOG.info("Created container {}", container.toString()); + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } - assertThat(container.getId(), not(isEmptyString())); + @Test + public void createContainerWithEnv() throws DockerException { - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withEnv("VARIABLE=success") + .withCmd("env").exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapAdd()), contains(NET_ADMIN)); + LOG.info("Created container {}", container.toString()); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getCapDrop()), contains(MKNOD)); - } + assertThat(container.getId(), not(isEmptyString())); - @Test - public void createContainerWithDns() throws DockerException { + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - String aDnsServer = "8.8.8.8"; - String anotherDnsServer = "8.8.4.4"; + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEnv()), containsInAnyOrder("VARIABLE=success")); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true").withDns(aDnsServer, anotherDnsServer).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - LOG.info("Created container {}", container.toString()); + assertThat(asString(dockerClient.logContainerCmd(container.getId()).withStdOut().exec()), + containsString("VARIABLE=success")); + } - assertThat(container.getId(), not(isEmptyString())); + @Test + public void createContainerWithHostname() throws DockerException { - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withHostName("docker-java") + .withCmd("env").exec(); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), - contains(aDnsServer, anotherDnsServer)); - } - - @Test - public void createContainerWithEntrypoint() throws DockerException { + LOG.info("Created container {}", container.toString()); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withName("container") - .withEntrypoint("sleep", "9999").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(inspectContainerResponse.getConfig().getHostName(), equalTo("docker-java")); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999")); + assertThat(asString(dockerClient.logContainerCmd(container.getId()).withStdOut().exec()), + containsString("HOSTNAME=docker-java")); + } - } + @Test + public void createContainerWithName() throws DockerException { - @Test - public void createContainerWithExtraHosts() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withCmd("env").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(inspectContainerResponse.getName(), equalTo("/container")); - assertThat(container.getId(), not(isEmptyString())); + try { + dockerClient.createContainerCmd("busybox").withName("container").withCmd("env").exec(); + fail("Expected ConflictException"); + } catch (ConflictException e) { + } - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + } - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), - containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); - } - - @Test - public void createContainerWithDevices() throws DockerException { + @Test + public void createContainerWithLink() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")) - .exec(); + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").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()); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); + 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())); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig() - .getDevices()), contains(new Device("rwm", "/dev/nulo", - "/dev/zero"))); - } - - @Test - public void createContainerWithPortBindings() throws DockerException { + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + } - 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)); + @Test + public void createContainerWithCapAddAndCapDrop() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23) - .withPortBindings(portBindings) - .exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD).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() - .getExposedPorts()), contains(tcp22, tcp23)); - - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp22)[0], is(equalTo(Ports.Binding(11022)))); - - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[0], is(equalTo(Ports.Binding(11023)))); - - assertThat(inspectContainerResponse.getHostConfig().getPortBindings() - .getBindings().get(tcp23)[1], is(equalTo(Ports.Binding(11024)))); - - } - - @Test - public void createContainerWithLinking() throws DockerException { - - CreateContainerResponse container1 = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999") - .withName("container1").exec(); - - LOG.info("Created container1 {}", container1.toString()); - assertThat(container1.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container1.getId()).exec(); - - InspectContainerResponse inspectContainerResponse1 = dockerClient - .inspectContainerCmd(container1.getId()).exec(); - LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - - assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getId(), - startsWith(container1.getId())); - assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); - assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); - assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); - - if (!inspectContainerResponse1.getState().isRunning()) { - assertThat(inspectContainerResponse1.getState().getExitCode(), - is(equalTo(0))); - } - - CreateContainerResponse container2 = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999") - .withName("container2") - .withLinks(new Link("container1", "container1Link")) - .exec(); - - LOG.info("Created container2 {}", container2.toString()); - assertThat(container2.getId(), not(isEmptyString())); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container2.getId()).exec(); - LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); - - assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); - assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); - assertThat(inspectContainerResponse2.getHostConfig(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), - is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); - assertThat(inspectContainerResponse2.getId(), - startsWith(container2.getId())); - assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); - assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); - - - } - - @Test - public void createContainerWithRestartPolicy() throws DockerException { - - RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999") - .withRestartPolicy(restartPolicy) - .exec(); - - LOG.info("Created container {}", container.toString()); - - assertThat(container.getId(), not(isEmptyString())); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - - assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), - is(equalTo(restartPolicy))); - } - - /** - * This tests support for --net option for the docker run command: - * --net="bridge" Set the Network mode for the container 'bridge': creates a - * new network stack for the container on the docker bridge 'none': no - * networking for this container 'container:': reuses another container - * network stack 'host': use the host network stack inside the container. - * Note: the host mode gives the container full access to local system - * services such as D-bus and is therefore considered insecure. - */ - @Test - public void createContainerWithNetworkMode() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("true") - .withNetworkMode("host") - .exec(); - - LOG.info("Created container {}", container.toString()); - - assertThat(container.getId(), not(isEmptyString())); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - - assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), - is(equalTo("host"))); - } - - @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().getCapAdd()), contains(NET_ADMIN)); - assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()), - containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096))); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD)); + } + + @Test + public void createContainerWithDns() throws DockerException { + + String aDnsServer = "8.8.8.8"; + String anotherDnsServer = "8.8.4.4"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDns(aDnsServer, anotherDnsServer).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(aDnsServer, anotherDnsServer)); + } + + @Test + public void createContainerWithEntrypoint() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withEntrypoint("sleep", "9999").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999")); + + } + + @Test + public void createContainerWithExtraHosts() throws DockerException { + + String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" }; + + HostConfig hostConfig = new HostConfig(); + hostConfig.setExtraHosts(extraHosts); + + 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().getExtraHosts()), + containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); + } + + @Test + public void createContainerWithDevices() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", + "/dev/nulo", "/dev/zero"))); + } + + @Test + public void createContainerWithPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], + is(equalTo(Ports.Binding(11022)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], + is(equalTo(Ports.Binding(11023)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], + is(equalTo(Ports.Binding(11024)))); + + } + + @Test + public void createContainerWithLinking() throws DockerException { + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + assertThat(container1.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); + + assertThat(inspectContainerResponse1.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + + } + + @Test + public void createContainerWithRestartPolicy() throws DockerException { + + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); + } + + /** + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the + * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for + * this container 'container:': reuses another container network stack 'host': use the host network stack inside the + * container. Note: the host mode gives the container full access to local system services such as D-bus and is + * therefore considered insecure. + */ + @Test + public void createContainerWithNetworkMode() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withNetworkMode("host").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host"))); + } + + @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/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 53131c611..2d6ec9522 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -22,9 +22,13 @@ public class DockerfileFixture implements AutoCloseable { private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileFixture.class); + private final DockerClient dockerClient; + private String directory; + private String repository; + private String containerId; public DockerfileFixture(DockerClient dockerClient, String directory) { @@ -35,35 +39,27 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { public void open() throws IOException { LOGGER.info("building {}", directory); - InputStream response = dockerClient - .buildImageCmd(new File("src/test/resources", directory)) - .withNoCache() // remove alternatives, cause problems + InputStream response = dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() // remove + // alternatives, + // cause + // problems .exec(); - + String log = AbstractDockerClientTest.consumeAsString(response); - + assertThat(log, containsString("Successfully built")); - Image lastCreatedImage = dockerClient - .listImagesCmd() - .exec() - .get(0); + Image lastCreatedImage = dockerClient.listImagesCmd().exec().get(0); - repository = lastCreatedImage - .getRepoTags()[0]; + repository = lastCreatedImage.getRepoTags()[0]; LOGGER.info("created {} {}", lastCreatedImage.getId(), repository); - containerId = dockerClient - .createContainerCmd(lastCreatedImage.getId()) - .exec() - .getId(); + containerId = dockerClient.createContainerCmd(lastCreatedImage.getId()).exec().getId(); LOGGER.info("starting {}", containerId); - dockerClient - .startContainerCmd(containerId) - .exec(); + dockerClient.startContainerCmd(containerId).exec(); } @Override @@ -72,9 +68,7 @@ public void close() throws Exception { if (containerId != null) { LOGGER.info("removing container {}", containerId); try { - dockerClient - .removeContainerCmd(containerId) - .withForce() // stop too + dockerClient.removeContainerCmd(containerId).withForce() // stop too .exec(); } catch (NotFoundException | InternalServerErrorException ignored) { LOGGER.info("ignoring {}", ignored.getMessage()); @@ -85,10 +79,7 @@ public void close() throws Exception { if (repository != null) { LOGGER.info("removing repository {}", repository); try { - dockerClient - .removeImageCmd(repository) - .withForce() - .exec(); + dockerClient.removeImageCmd(repository).withForce().exec(); } catch (NotFoundException | InternalServerErrorException e) { LOGGER.info("ignoring {}", e.getMessage()); } 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 07bca25b5..c311540b1 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -17,9 +17,8 @@ import static org.hamcrest.core.IsNull.nullValue; import static org.testng.AssertJUnit.assertNull; - @Test(groups = "integration") -public class EventStreamReaderITest { +public class EventStreamReaderITest { private DockerClient dockerClient; @@ -36,17 +35,13 @@ public void tearDown() throws Exception { @Test(groups = "ignoreInCircleCi") public void pullCanBeStreamed() throws Exception { - try (EventStreamReader reader = new EventStreamReader<>( - dockerClient.pullImageCmd("busybox:latest").exec(), - PullEventStreamItem.class) - ) {; - assertThat(reader.readItem(), - allOf( - hasProperty("status", equalTo("Pulling from busybox")), - hasProperty("progress", nullValue()), - hasProperty("progressDetail", nullValue()) - ) - ); + try (EventStreamReader reader = new EventStreamReader<>(dockerClient.pullImageCmd( + "busybox:latest").exec(), PullEventStreamItem.class)) { + ; + assertThat( + reader.readItem(), + allOf(hasProperty("status", equalTo("Pulling from busybox")), hasProperty("progress", nullValue()), + hasProperty("progressDetail", nullValue()))); assertNull(reader.readItem()); } } @@ -54,17 +49,12 @@ public void pullCanBeStreamed() throws Exception { @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()) - ) - ); + 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()); } 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 0d61c8f59..e19d4f1fc 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -26,147 +26,144 @@ @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { - private static int KNOWN_NUM_EVENTS = 4; - - private static String getEpochTime() { - return String.valueOf(System.currentTimeMillis() / 1000); - } - - @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 testEventStreamTimeBound() throws InterruptedException, - IOException { - // Don't include other tests events - TimeUnit.SECONDS.sleep(1); - - String startTime = getEpochTime(); - int expectedEvents = generateEvents(); - String endTime = getEpochTime(); - - CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback) - .withSince(startTime).withUntil(endTime); - ExecutorService executorService = eventsCmd.exec(); - - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); - - executorService.shutdown(); - eventCallback.close(); - - assertTrue(zeroCount, "Received only: " + 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(10, TimeUnit.SECONDS); - executorService.shutdown(); - eventCallback.close(); - assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); - } - - @Test(groups = "ignoreInCircleCi") - public void testEventStreaming2() 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(10, TimeUnit.SECONDS); - executorService.shutdown(); - eventCallback.close(); - assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); - } - - /** - * This method generates {#link KNOWN_NUM_EVENTS} events - */ - private int generateEvents() { - String testImage = "busybox"; - asString(dockerClient.pullImageCmd(testImage).exec()); - CreateContainerResponse container = dockerClient - .createContainerCmd(testImage).withCmd("sleep", "9999").exec(); - dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.stopContainerCmd(container.getId()).exec(); - return KNOWN_NUM_EVENTS; - } - - private class EventCallbackTest 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; - } - - public void close() { - isReceiving.set(false); - } - - @Override - public void onEvent(Event event) { - LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); - countDownLatch.countDown(); - events.add(event); - } - - @Override - public void onException(Throwable throwable) { - LOG.error("Error occurred: {}", throwable.getMessage()); - } - - @Override - public void onCompletion(int numEvents) { - LOG.info("Number of events received: {}", numEvents); - } - - @Override - public boolean isReceiving() { - return isReceiving.get(); - } - - public List getEvents() { - return new ArrayList(events); - } - } + private static int KNOWN_NUM_EVENTS = 4; + + private static String getEpochTime() { + return String.valueOf(System.currentTimeMillis() / 1000); + } + + @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 testEventStreamTimeBound() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); + + String startTime = getEpochTime(); + int expectedEvents = generateEvents(); + String endTime = getEpochTime(); + + CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(startTime).withUntil(endTime); + ExecutorService executorService = eventsCmd.exec(); + + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + + executorService.shutdown(); + eventCallback.close(); + + assertTrue(zeroCount, "Received only: " + 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(10, TimeUnit.SECONDS); + executorService.shutdown(); + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } + + @Test(groups = "ignoreInCircleCi") + public void testEventStreaming2() 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(10, TimeUnit.SECONDS); + executorService.shutdown(); + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } + + /** + * This method generates {#link KNOWN_NUM_EVENTS} events + */ + private int generateEvents() { + String testImage = "busybox"; + asString(dockerClient.pullImageCmd(testImage).exec()); + CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.stopContainerCmd(container.getId()).exec(); + return KNOWN_NUM_EVENTS; + } + + private class EventCallbackTest 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; + } + + public void close() { + isReceiving.set(false); + } + + @Override + public void onEvent(Event event) { + LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); + countDownLatch.countDown(); + events.add(event); + } + + @Override + public void onException(Throwable throwable) { + LOG.error("Error occurred: {}", throwable.getMessage()); + } + + @Override + public void onCompletion(int numEvents) { + LOG.info("Number of events received: {}", numEvents); + } + + @Override + public boolean isReceiving() { + return isReceiving.get(); + } + + public List getEvents() { + return new ArrayList(events); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java index 028f4cac1..d5ec79307 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -40,8 +40,7 @@ public void afterMethod(ITestResult result) { public void execCreateTest() { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); @@ -50,7 +49,8 @@ public void execCreateTest() { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withCmd("touch", "file.log").exec(); assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 80619efeb..a80f0c86e 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -41,9 +41,7 @@ public void afterMethod(ITestResult result) { public void execStartTest() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -51,8 +49,7 @@ public void execStartTest() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true) - .withCmd("touch", "/execStartTest.log").exec(); + .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 24c833559..fca8ae3a2 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -18,80 +18,73 @@ @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); + + 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/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java index 2b5e2b644..10210c281 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -14,13 +14,16 @@ 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 diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index 7170c12f3..19e275078 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -21,53 +21,51 @@ @Test(groups = "integration") public class InfoCmdImplTest 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 info() throws DockerException { + @Test + public void info() throws DockerException { // Make sure that there is at least one container for the assertion // TODO extract this into a shared method - if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox") - .withName("docker-java-itest-info") - .withCmd("touch", "/test") - .exec(); + if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-info").withCmd("touch", "/test").exec(); - LOG.info("Created container: {}", container); - assertThat(container.getId(), not(isEmptyOrNullString())); + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); - dockerClient.startContainerCmd(container.getId()).exec(); - } + dockerClient.startContainerCmd(container.getId()).exec(); + } - Info dockerInfo = dockerClient.infoCmd().exec(); - LOG.info(dockerInfo.toString()); + Info dockerInfo = dockerClient.infoCmd().exec(); + LOG.info(dockerInfo.toString()); - assertTrue(dockerInfo.toString().contains("containers")); - assertTrue(dockerInfo.toString().contains("images")); - assertTrue(dockerInfo.toString().contains("debug")); + assertTrue(dockerInfo.toString().contains("containers")); + assertTrue(dockerInfo.toString().contains("images")); + assertTrue(dockerInfo.toString().contains("debug")); - assertTrue(dockerInfo.getContainers() > 0); - assertTrue(dockerInfo.getImages() > 0); - assertTrue(dockerInfo.getNFd() > 0); - assertTrue(dockerInfo.getNGoroutines() > 0); - assertTrue(dockerInfo.getNCPU() > 0); - } + assertTrue(dockerInfo.getContainers() > 0); + assertTrue(dockerInfo.getImages() > 0); + assertTrue(dockerInfo.getNFd() > 0); + assertTrue(dockerInfo.getNGoroutines() > 0); + assertTrue(dockerInfo.getNCPU() > 0); + } } 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 f1270f4e6..69f4d78e1 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -47,9 +47,7 @@ public void afterMethod(ITestResult result) { public void inspectExecTest() throws IOException { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -57,31 +55,25 @@ public void inspectExecTest() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout() - .withAttachStderr() - .withCmd("touch", "/marker").exec(); + .withAttachStdout().withAttachStderr().withCmd("touch", "/marker").exec(); LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout() - .withAttachStderr() - .withCmd("test", "-e", "/marker").exec(); + .withAttachStdout().withAttachStderr().withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); // Check that file does not exist InputStream response1 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()) - .exec(); - asString(response1); // consume + .withExecId(checkFileCmdCreateResponse.getId()).exec(); + asString(response1); // consume InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(first.getExitCode(), is(1)); // Create the file InputStream response2 = dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileCmdCreateResponse.getId()) - .exec(); + .withExecId(touchFileCmdCreateResponse.getId()).exec(); asString(response2); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); @@ -89,8 +81,7 @@ public void inspectExecTest() throws IOException { // Check that file does exist now InputStream response3 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()) - .exec(); + .withExecId(checkFileCmdCreateResponse.getId()).exec(); asString(response3); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java index 33d80ef2d..e60930d88 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -26,60 +26,55 @@ @Test(groups = "integration") public class KillContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(KillContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void killContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Killing container: {}", container.getId()); - dockerClient.killContainerCmd(container.getId()).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), - is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), - not(equalTo(0))); - - } - - @Test - public void killNonExistingContainer() throws DockerException { - - try { - dockerClient.killContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + public static final Logger LOG = LoggerFactory.getLogger(KillContainerCmdImplTest.class); + + @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(groups = "ignoreInCircleCi") + public void killContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Killing container: {}", container.getId()); + dockerClient.killContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + + } + + @Test + public void killNonExistingContainer() throws DockerException { + + try { + dockerClient.killContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java index f73ac5e4b..b074409bd 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -31,76 +31,72 @@ @Test(groups = "integration") public class ListContainersCmdImplTest 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 testListContainers() throws DockerException { + @Test + public void testListContainers() throws DockerException { - String testImage = "busybox"; + String testImage = "busybox"; - // need to block until image is pulled completely - asString(dockerClient.pullImageCmd(testImage).exec()); + // need to block until image is pulled completely + asString(dockerClient.pullImageCmd(testImage).exec()); - List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - assertThat(containers, notNullValue()); - LOG.info("Container List: {}", containers); + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + assertThat(containers, notNullValue()); + LOG.info("Container List: {}", containers); - int size = containers.size(); + int size = containers.size(); - CreateContainerResponse container1 = dockerClient - .createContainerCmd(testImage).withCmd("echo").exec(); + CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo").exec(); - assertThat(container1.getId(), not(isEmptyString())); + assertThat(container1.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); - assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); + assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); - dockerClient.startContainerCmd(container1.getId()).exec(); + dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("container id: " + container1.getId()); + LOG.info("container id: " + container1.getId()); - List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); - for(Container container: containers2) { - LOG.info("listContainer: id=" + container.getId() +" image=" + container.getImage()); - } + for (Container container : containers2) { + LOG.info("listContainer: id=" + container.getId() + " image=" + container.getImage()); + } - assertThat(size + 1, is(equalTo(containers2.size()))); - Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); - assertThat(containers2, matcher); + assertThat(size + 1, is(equalTo(containers2.size()))); + Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); + assertThat(containers2, matcher); - List filteredContainers = filter( - hasField("id", startsWith(container1.getId())), containers2); - assertThat(filteredContainers.size(), is(equalTo(1))); - - for(Container container: filteredContainers) { - LOG.info("filteredContainer: " + container); - } - - Container container2 = filteredContainers.get(0); - assertThat(container2.getCommand(), not(isEmptyString())); - assertThat(container2.getImage(), startsWith(testImage + ":")); - } + List filteredContainers = filter(hasField("id", startsWith(container1.getId())), containers2); + assertThat(filteredContainers.size(), is(equalTo(1))); + for (Container container : filteredContainers) { + LOG.info("filteredContainer: " + container); + } + Container container2 = filteredContainers.get(0); + assertThat(container2.getCommand(), not(isEmptyString())); + assertThat(container2.getImage(), startsWith(testImage + ":")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 05bf94837..e91641eeb 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -22,78 +22,75 @@ @Test(groups = "integration") public class ListImagesCmdImplTest 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 listImages() throws DockerException { - List images = dockerClient.listImagesCmd().withShowAll(true).exec(); - assertThat(images, notNullValue()); - LOG.info("Images List: {}", images); - Info info = dockerClient.infoCmd().exec(); - - assertThat(images.size(), equalTo(info.getImages())); - - Image img = images.get(0); - assertThat(img.getCreated(), is(greaterThan(0L))); - assertThat(img.getVirtualSize(), is(greaterThan(0L))); - assertThat(img.getId(), not(isEmptyString())); - assertThat(img.getRepoTags(), not(emptyArray())); - } - - @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { - String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd() - .withFilters("{\"dangling\":[\"true\"]}") - .withShowAll(true).exec(); - assertThat(images, notNullValue()); - LOG.info("Images List: {}", images); - assertThat(images.size(), is(greaterThan(0))); - boolean imageInFilteredList = isImageInFilteredList(images, imageId); - assertTrue(imageInFilteredList); - } - - private boolean isImageInFilteredList(List images, String expectedImageId) { - for (Image image : images) { - if (expectedImageId.equals(image.getId())) { - return true; - } - } - return false; - } - - private String createDanglingImage() { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "5").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Committing container {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); - - dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); - dockerClient.removeContainerCmd(container.getId()).exec(); - return imageId; - } + @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 listImages() throws DockerException { + List images = dockerClient.listImagesCmd().withShowAll(true).exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + Info info = dockerClient.infoCmd().exec(); + + assertThat(images.size(), equalTo(info.getImages())); + + Image img = images.get(0); + assertThat(img.getCreated(), is(greaterThan(0L))); + assertThat(img.getVirtualSize(), is(greaterThan(0L))); + assertThat(img.getId(), not(isEmptyString())); + assertThat(img.getRepoTags(), not(emptyArray())); + } + + @Test(groups = "ignoreInCircleCi") + public void listDanglingImages() throws DockerException { + String imageId = createDanglingImage(); + List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) + .exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + assertThat(images.size(), is(greaterThan(0))); + boolean imageInFilteredList = isImageInFilteredList(images, imageId); + assertTrue(imageInFilteredList); + } + + private boolean isImageInFilteredList(List images, String expectedImageId) { + for (Image image : images) { + if (expectedImageId.equals(image.getId())) { + return true; + } + } + return false; + } + + private String createDanglingImage() { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + return imageId; + } } diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java index 94a27b1d3..1f00c1524 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -24,96 +24,95 @@ @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 logContainer() 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 { + InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); - try { - dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } - - @Test - public void multipleLogContainer() throws Exception { + String log = asString(response); - String snippet = "hello world"; + // LOG.info("resonse: " + log); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("/bin/echo", snippet).exec(); + assertThat(log, endsWith(snippet)); + } - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); + @Test + public void logNonExistingContainer() throws Exception { - dockerClient.startContainerCmd(container.getId()).exec(); - - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + try { + dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } - assertThat(exitCode, equalTo(0)); + @Test + public void multipleLogContainer() throws Exception { - InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + String snippet = "hello world"; - response.close(); - - //String log = asString(response); - - response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); - //log = asString(response); - response.close(); - - response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); - String log = asString(response); - - assertThat(log, endsWith(snippet)); - } + dockerClient.startContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + + assertThat(exitCode, equalTo(0)); + + InputStream response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + response.close(); + + // String log = asString(response); + + response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + // log = asString(response); + response.close(); + + response = dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(); + + String log = asString(response); + + assertThat(log, endsWith(snippet)); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index f9968a449..f3871e042 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -28,24 +28,24 @@ public InputStream exec(PullImageCmd command) { }; @BeforeTest - public void beforeTest() throws DockerException { - super.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 nullAuthConfig() throws Exception { @@ -59,59 +59,57 @@ public void nullAuthConfig() throws Exception { } @Test - public void testPullImage() throws DockerException, IOException { - Info info = dockerClient.infoCmd().exec(); - LOG.info("Client info: {}", info.toString()); - - int imgCount = info.getImages(); - LOG.info("imgCount1: {}", imgCount); - - // This should be an image that is not used by other repositories - // already - // pulled down, preferably small in size. If tag is not used pull will - // download all images in that repository but tmpImgs will only - // deleted 'latest' image but not images with other tags - String testImage = "hackmann/empty"; - - LOG.info("Removing image: {}", testImage); - - try { - dockerClient.removeImageCmd(testImage).withForce().exec(); - } catch (NotFoundException e) { - // just ignore if not exist - } - - - info = dockerClient.infoCmd().exec(); - LOG.info("Client info: {}", info.toString()); - - imgCount = info.getImages(); - LOG.info("imgCount2: {}", imgCount); - - LOG.info("Pulling image: {}", testImage); - - InputStream response = dockerClient.pullImageCmd(testImage).exec(); - - assertThat(asString(response), containsString("Download complete")); - - info = dockerClient.infoCmd().exec(); - LOG.info("Client info after pull, {}", info.toString()); - - assertThat(imgCount, lessThanOrEqualTo(info.getImages())); - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(testImage).exec(); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - assertThat(inspectImageResponse, notNullValue()); - } - - @Test - public void testPullNonExistingImage() throws DockerException, IOException { - - // does not throw an exception - InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); - // stream needs to be fully read in order to close the underlying connection - asString(is); - } + public void testPullImage() throws DockerException, IOException { + Info info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + int imgCount = info.getImages(); + LOG.info("imgCount1: {}", imgCount); + + // This should be an image that is not used by other repositories + // already + // pulled down, preferably small in size. If tag is not used pull will + // download all images in that repository but tmpImgs will only + // deleted 'latest' image but not images with other tags + String testImage = "hackmann/empty"; + + LOG.info("Removing image: {}", testImage); + + try { + dockerClient.removeImageCmd(testImage).withForce().exec(); + } catch (NotFoundException e) { + // just ignore if not exist + } + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + imgCount = info.getImages(); + LOG.info("imgCount2: {}", imgCount); + + LOG.info("Pulling image: {}", testImage); + + InputStream response = dockerClient.pullImageCmd(testImage).exec(); + + assertThat(asString(response), containsString("Download complete")); + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info after pull, {}", info.toString()); + + assertThat(imgCount, lessThanOrEqualTo(info.getImages())); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(testImage).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + assertThat(inspectImageResponse, notNullValue()); + } + + @Test + public void testPullNonExistingImage() throws DockerException, IOException { + + // does not throw an exception + InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); + // stream needs to be fully read in order to close the underlying connection + asString(is); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index f409aebf7..8498256a8 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -16,60 +16,58 @@ @Test(groups = "integration") public class PushImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(PushImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class); String username; - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); username = dockerClient.authConfig().getUsername(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test - public void pushLatest() throws Exception { + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); + @Test + public void pushLatest() throws Exception { - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container {}", container.toString()); - LOG.info("Committing container: {}", container.toString()); - String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); + assertThat(container.getId(), not(isEmptyString())); - // we have to block until image is pushed - asString(dockerClient.pushImageCmd(username + "/busybox").exec()); + LOG.info("Committing container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); + + // we have to block until image is pushed + asString(dockerClient.pushImageCmd(username + "/busybox").exec()); LOG.info("Removing image: {}", imageId); - dockerClient.removeImageCmd(imageId).exec(); - - String response = asString(dockerClient.pullImageCmd(username + "/busybox").exec()); + dockerClient.removeImageCmd(imageId).exec(); - assertThat(response, not(containsString("HTTP code: 404"))); - } + String response = asString(dockerClient.pullImageCmd(username + "/busybox").exec()); - @Test - public void pushExistentImage() throws Exception { + assertThat(response, not(containsString("HTTP code: 404"))); + } - assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); - } + @Test + public void pushExistentImage() throws Exception { -} + assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java index b6fe173ae..22fbb096c 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -28,57 +28,53 @@ @Test(groups = "integration") public class RemoveContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(RemoveContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void removeContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); - - dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); - - LOG.info("Removing container: {}", container.getId()); - dockerClient.removeContainerCmd(container.getId()).exec(); - - List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); - - Matcher matcher = not(hasItem(hasField("id", - startsWith(container.getId())))); - assertThat(containers2, matcher); - - } - - @Test - public void removeNonExistingContainer() throws DockerException { - try { - dockerClient.removeContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + public static final Logger LOG = LoggerFactory.getLogger(RemoveContainerCmdImplTest.class); + @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(groups = "ignoreInCircleCi") + public void removeContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(); + LOG.info("Removing container: {}", container.getId()); + dockerClient.removeContainerCmd(container.getId()).exec(); + + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(container.getId())))); + assertThat(containers2, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java index af6bc39cc..1c0f3db1c 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -29,64 +29,60 @@ @Test(groups = "integration") public class RemoveImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(RemoveImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(RemoveImageCmdImplTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test(groups = "ignoreInCircleCi") - public void removeImage() throws DockerException, InterruptedException { + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); + @Test(groups = "ignoreInCircleCi") + public void removeImage() throws DockerException, InterruptedException { - LOG.info("Committing container {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); - dockerClient.removeContainerCmd(container.getId()).exec(); + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); - LOG.info("Removing image: {}", imageId); - dockerClient.removeImageCmd(imageId).exec(); + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); - List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + LOG.info("Removing image: {}", imageId); + dockerClient.removeImageCmd(imageId).exec(); - Matcher matcher = not(hasItem(hasField("id", startsWith(imageId)))); - assertThat(containers, matcher); - } + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - @Test - public void removeNonExistingImage() throws DockerException, InterruptedException { - try { - dockerClient.removeImageCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } + Matcher matcher = not(hasItem(hasField("id", startsWith(imageId)))); + assertThat(containers, matcher); + } - } + @Test + public void removeNonExistingImage() throws DockerException, InterruptedException { + try { + dockerClient.removeImageCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } - diff --git a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java index b6040a0ff..866800163 100644 --- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java @@ -24,67 +24,61 @@ @Test(groups = "integration") public class RestartContainerCmdImplTest 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 restartContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - String startTime = inspectContainerResponse.getState().getStartedAt(); - - dockerClient.restartContainerCmd(container.getId()).withtTimeout(2).exec(); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect After Restart: {}", - inspectContainerResponse2.toString()); - - String startTime2 = inspectContainerResponse2.getState().getStartedAt(); - - assertThat(startTime, not(equalTo(startTime2))); - - assertThat(inspectContainerResponse.getState().isRunning(), - is(equalTo(true))); - - dockerClient.killContainerCmd(container.getId()).exec(); - } - - @Test - public void restartNonExistingContainer() throws DockerException, InterruptedException { - try { - dockerClient.restartContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - - } + @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 restartContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + String startTime = inspectContainerResponse.getState().getStartedAt(); + + dockerClient.restartContainerCmd(container.getId()).withtTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect After Restart: {}", inspectContainerResponse2.toString()); + + String startTime2 = inspectContainerResponse2.getState().getStartedAt(); + + assertThat(startTime, not(equalTo(startTime2))); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(true))); + + dockerClient.killContainerCmd(container.getId()).exec(); + } + + @Test + public void restartNonExistingContainer() throws DockerException, InterruptedException { + try { + dockerClient.restartContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java index 859a76cc2..9facdc2d9 100644 --- a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java @@ -26,8 +26,7 @@ @Test(groups = "integration") public class SaveImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(SaveImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(SaveImageCmdImplTest.class); String username; @@ -35,6 +34,7 @@ public class SaveImageCmdImplTest extends AbstractDockerClientTest { public void beforeTest() throws DockerException { super.beforeTest(); } + @AfterTest public void afterTest() { super.afterTest(); @@ -53,8 +53,7 @@ public void afterMethod(ITestResult result) { @Test public void saveImage() throws Exception { - InputStream image = IOUtils.toBufferedInputStream(dockerClient - .saveImageCmd("busybox").exec()); + InputStream image = IOUtils.toBufferedInputStream(dockerClient.saveImageCmd("busybox").exec()); assertThat(image.available(), greaterThan(0)); } diff --git a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java index 5c2393534..f61ff078a 100644 --- a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java @@ -25,38 +25,35 @@ @Test(groups = "integration") public class SearchImagesCmdImplTest 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 searchImages() throws DockerException { - List dockerSearch = dockerClient.searchImagesCmd("busybox").exec(); - LOG.info("Search returned {}", dockerSearch.toString()); - - Matcher matcher = hasItem(hasField("name", equalTo("busybox"))); - assertThat(dockerSearch, matcher); - - assertThat( - filter(hasField("name", is("busybox")), dockerSearch).size(), - equalTo(1)); - } - + @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 searchImages() throws DockerException { + List dockerSearch = dockerClient.searchImagesCmd("busybox").exec(); + LOG.info("Search returned {}", dockerSearch.toString()); + + Matcher matcher = hasItem(hasField("name", equalTo("busybox"))); + assertThat(dockerSearch, matcher); + + assertThat(filter(hasField("name", is("busybox")), dockerSearch).size(), equalTo(1)); + } } 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 b82f2f75c..248189d15 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -29,55 +29,53 @@ @Test(groups = "integration") public class StatsCmdImplTest extends AbstractDockerClientTest { - private static int NUM_STATS = 5; + private static int NUM_STATS = 5; - @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(groups = "ignoreInCircleCi") - public void testStatsStreaming() throws InterruptedException, IOException { - TimeUnit.SECONDS.sleep(1); + @Test(groups = "ignoreInCircleCi") + public void testStatsStreaming() throws InterruptedException, IOException { + TimeUnit.SECONDS.sleep(1); - CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS); - StatsCallbackTest statsCallback = new StatsCallbackTest(countDownLatch); + 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())); + 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(); + dockerClient.startContainerCmd(container.getId()).exec(); - StatsCmd statsCmd = dockerClient.statsCmd(statsCallback).withContainerId(container.getId()); - ExecutorService executorService = statsCmd.exec(); + StatsCmd statsCmd = dockerClient.statsCmd(statsCallback).withContainerId(container.getId()); + ExecutorService executorService = statsCmd.exec(); - countDownLatch.await(3, TimeUnit.SECONDS); - boolean gotStats = statsCallback.gotStats(); + countDownLatch.await(3, TimeUnit.SECONDS); + boolean gotStats = statsCallback.gotStats(); LOG.info("Stop stats collection"); - executorService.shutdown(); - statsCallback.close(); + executorService.shutdown(); + statsCallback.close(); LOG.info("Stopping container"); dockerClient.stopContainerCmd(container.getId()).exec(); @@ -86,48 +84,50 @@ public void testStatsStreaming() throws InterruptedException, IOException { 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; - } - } + } + + 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; + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java index 3cf643c4e..8a2a2f13e 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -26,57 +26,54 @@ @Test(groups = "integration") public class StopContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(StopContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void testStopContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Stopping container: {}", container.getId()); - dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); - } - - @Test - public void testStopNonExistingContainer() throws DockerException { - try { - dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - - } - } + public static final Logger LOG = LoggerFactory.getLogger(StopContainerCmdImplTest.class); + + @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(groups = "ignoreInCircleCi") + public void testStopContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Stopping container: {}", container.getId()); + dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + } + + @Test + public void testStopNonExistingContainer() throws DockerException { + try { + dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java index 97f422f28..b7c8bc4ff 100644 --- a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java @@ -19,47 +19,46 @@ @Test(groups = "integration") public class TagImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(TagImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(TagImageCmdImplTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test - public void tagImage() throws Exception { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - dockerClient.tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); + @Test + public void tagImage() throws Exception { + String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); - dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec(); - } - - @Test - public void tagNonExistingImage() throws Exception { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); - - try { - dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + dockerClient.tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); -} + dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec(); + } + + @Test + public void tagNonExistingImage() throws Exception { + String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + try { + dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java index 8c9064346..edb5560e6 100644 --- a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java @@ -17,37 +17,36 @@ @Test(groups = "integration") public class VersionCmdImplTest 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 version() throws DockerException { - Version version = dockerClient.versionCmd().exec(); - LOG.info(version.toString()); - - assertTrue(version.getGoVersion().length() > 0); - assertTrue(version.getVersion().length() > 0); - - assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); - - } + @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 version() throws DockerException { + Version version = dockerClient.versionCmd().exec(); + LOG.info(version.toString()); + + assertTrue(version.getGoVersion().length() > 0); + assertTrue(version.getVersion().length() > 0); + + assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 19c7057d2..576506498 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -24,56 +24,54 @@ @Test(groups = "integration") public class WaitContainerCmdImplTest 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 testWaitContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); - - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container.getId()).exec(); - - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); - LOG.info("Container exit code: {}", exitCode); - - assertThat(exitCode, equalTo(0)); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); - } - - @Test - public void testWaitNonExistingContainer() throws DockerException { - try { - dockerClient.waitContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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 testWaitContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + LOG.info("Container exit code: {}", exitCode); + + assertThat(exitCode, equalTo(0)); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); + } + + @Test + public void testWaitNonExistingContainer() throws DockerException { + try { + dockerClient.waitContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java index 428511c2e..8b5e3c7e4 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java @@ -13,38 +13,37 @@ public class DockerfileTest extends TestCase { - private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class); + private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class); - @Test - public void testAllItems() throws IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("netcat").getFile()); + @Test + public void testAllItems() throws IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); - File root = baseDir.getParentFile(); + File root = baseDir.getParentFile(); - Map dockerfiles = new HashMap(); - Map results = new HashMap(); + Map dockerfiles = new HashMap(); + Map results = new HashMap(); - for (File child : root.listFiles()) { - if (new File(child, "Dockerfile").exists()) { - Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); - dockerfiles.put(child.getName(), dockerfile); - } - } + for (File child : root.listFiles()) { + if (new File(child, "Dockerfile").exists()) { + Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); + dockerfiles.put(child.getName(), dockerfile); + } + } - for (String name : dockerfiles.keySet()) { - log.info("Scanning {}", name); - try { - results.put(name, dockerfiles.get(name).parse()); - } catch (Exception ex) { - log.error("Error in {}", name, ex); - } + for (String name : dockerfiles.keySet()) { + log.info("Scanning {}", name); + try { + results.put(name, dockerfiles.get(name).parse()); + } catch (Exception ex) { + log.error("Error in {}", name, ex); + } - } + } - for (String name : results.keySet()) { - log.info("Name: {} = {}", name, results.get(name)); + for (String name : results.keySet()) { + log.info("Name: {} = {}", name, results.get(name)); + } } - } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java index 882b3b012..1d5f43a6f 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java +++ b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java @@ -17,15 +17,17 @@ /** * 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 index 96e5df726..662b9b216 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java @@ -18,20 +18,23 @@ import java.io.IOException; /** - * References JSON resources, which + * 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(); + 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 index b6a33b722..c83851370 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -29,16 +29,20 @@ /** * 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 + * + * @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()); @@ -47,71 +51,91 @@ public static String readString(JSONResourceRef resource) throws IOException { } 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 + * + * @param + * Data class to be read + * @param resource + * Resource reference + * @param tclass + * Class entry * @return Item - * @throws IOException JSON conversion error + * @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 + * + * @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 { + 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 + * + * @param + * Item class + * @param item + * Item to be checked * @return Deserialized object after the roundtrip - * @throws IOException JSON Conversion error - * @throws AssertionError Validation error + * @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()); + 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 + * + * @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 + * @throws IOException + * JSON Conversion error + * @throws AssertionError + * Validation error */ - public static TClass testRoundTrip(TClass item, Class asclass) - throws IOException, AssertionError { + public static TClass testRoundTrip(TClass item, Class asclass) throws IOException, AssertionError { ObjectMapper mapper = new ObjectMapper(); - + 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 a9112e3ca9b309434d7e4e053837e84406b9c6ee Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 26 Jun 2015 20:46:57 +0200 Subject: [PATCH 0251/1399] Formatting sources --- .../dockerjava/api/BadRequestException.java | 13 +- .../dockerjava/api/ConflictException.java | 13 +- .../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 +- .../dockerjava/api/async/ResultCallback.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/EventsCmd.java | 7 +- .../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/StatsCmd.java | 5 +- .../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 | 5 +- .../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 | 6 +- .../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/async/ResponseStreamProcessor.java | 3 +- .../core/async/ResultCallbackTemplate.java | 2 +- .../core/command/AbstrAuthCfgDockerCmd.java | 71 +- .../core/command/AbstrDockerCmd.java | 25 +- .../core/command/AttachContainerCmdImpl.java | 210 +++--- .../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/ExecCreateCmdImpl.java | 50 +- .../core/command/ExecStartCmdImpl.java | 59 +- .../dockerjava/core/command/FrameReader.java | 2 - .../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 | 151 +++-- .../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 +- .../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 | 52 +- .../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 | 4 +- .../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 | 35 +- .../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 +- .../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/async/AbstractCallbackNotifier.java | 4 +- .../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 | 269 ++++---- .../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 +++++++------- .../command/AttachContainerCmdImplTest.java | 8 +- .../core/command/AuthCmdImplTest.java | 58 +- .../core/command/BuildImageCmdImplTest.java | 293 ++++----- .../core/command/CommitCmdImplTest.java | 109 ++-- .../command/ContainerDiffCmdImplTest.java | 97 ++- .../CopyFileFromContainerCmdImplTest.java | 6 +- .../command/CreateContainerCmdImplTest.java | 27 +- .../core/command/DockerfileFixture.java | 41 +- .../core/command/EventStreamReaderITest.java | 38 +- .../core/command/EventsCmdImplTest.java | 182 +++--- .../core/command/ExecCreateCmdImplTest.java | 6 +- .../core/command/ExecStartCmdImplTest.java | 14 +- .../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 | 2 - .../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 +- .../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 ++- 253 files changed, 8502 insertions(+), 8850 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/src/main/java/com/github/dockerjava/api/BadRequestException.java index 1e04bcb3b..2696c5bc1 100644 --- a/src/main/java/com/github/dockerjava/api/BadRequestException.java +++ b/src/main/java/com/github/dockerjava/api/BadRequestException.java @@ -1,22 +1,21 @@ package com.github.dockerjava.api; - /** * */ public class BadRequestException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public BadRequestException(String message, Throwable cause) { + public BadRequestException(String message, Throwable cause) { super(message, 400, cause); } - - public BadRequestException(String message) { + + public BadRequestException(String message) { this(message, null); } - - public BadRequestException(Throwable cause) { + + public BadRequestException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/src/main/java/com/github/dockerjava/api/ConflictException.java index bed2a375e..6a84fdee3 100644 --- a/src/main/java/com/github/dockerjava/api/ConflictException.java +++ b/src/main/java/com/github/dockerjava/api/ConflictException.java @@ -1,22 +1,21 @@ package com.github.dockerjava.api; - /** * */ public class ConflictException extends DockerException { - private static final long serialVersionUID = -290093024775500239L; + private static final long serialVersionUID = -290093024775500239L; - public ConflictException(String message, Throwable cause) { + public ConflictException(String message, Throwable cause) { super(message, 409, cause); } - - public ConflictException(String message) { + + public ConflictException(String message) { this(message, null); } - - public ConflictException(Throwable cause) { + + public ConflictException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/src/main/java/com/github/dockerjava/api/DockerClientException.java index 85efc3498..538698bb6 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClientException.java +++ b/src/main/java/com/github/dockerjava/api/DockerClientException.java @@ -6,8 +6,8 @@ */ public class DockerClientException extends RuntimeException { -private static final long serialVersionUID = 7667768099261650608L; - + private static final long serialVersionUID = 7667768099261650608L; + public DockerClientException(String message) { super(message); } diff --git a/src/main/java/com/github/dockerjava/api/DockerException.java b/src/main/java/com/github/dockerjava/api/DockerException.java index 673bf2ccc..48bb2dd90 100644 --- a/src/main/java/com/github/dockerjava/api/DockerException.java +++ b/src/main/java/com/github/dockerjava/api/DockerException.java @@ -1,8 +1,5 @@ package com.github.dockerjava.api; - - - /** * * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -11,9 +8,9 @@ public class DockerException extends RuntimeException { -private static final long serialVersionUID = 7667768099261650608L; - - private int httpStatus = 0; + private static final long serialVersionUID = 7667768099261650608L; + + private int httpStatus = 0; public DockerException(String message, int httpStatus) { super(message); @@ -23,8 +20,8 @@ public DockerException(String message, int httpStatus) { public DockerException(String message, int httpStatus, Throwable cause) { super(message, cause); } - + public int getHttpStatus() { - return httpStatus; - } + return httpStatus; + } } diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java index 366484e53..cda5602ed 100644 --- a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java +++ b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java @@ -5,17 +5,17 @@ */ public class InternalServerErrorException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public InternalServerErrorException(String message, Throwable cause) { + public InternalServerErrorException(String message, Throwable cause) { super(message, 500, cause); } - - public InternalServerErrorException(String message) { + + public InternalServerErrorException(String message) { this(message, null); } - - public InternalServerErrorException(Throwable cause) { + + public InternalServerErrorException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java index affa4ce9b..78345a68b 100644 --- a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java +++ b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java @@ -5,17 +5,17 @@ */ public class NotAcceptableException extends DockerException { - private static final long serialVersionUID = -1771212181727204375L; + private static final long serialVersionUID = -1771212181727204375L; - public NotAcceptableException(String message, Throwable cause) { + public NotAcceptableException(String message, Throwable cause) { super(message, 406, cause); } - - public NotAcceptableException(String message) { + + public NotAcceptableException(String message) { this(message, null); } - - public NotAcceptableException(Throwable cause) { + + public NotAcceptableException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/src/main/java/com/github/dockerjava/api/NotFoundException.java index 10f328cdc..67e6f18bf 100644 --- a/src/main/java/com/github/dockerjava/api/NotFoundException.java +++ b/src/main/java/com/github/dockerjava/api/NotFoundException.java @@ -7,17 +7,17 @@ */ public class NotFoundException extends DockerException { - private static final long serialVersionUID = -2450396075981100160L; + private static final long serialVersionUID = -2450396075981100160L; - public NotFoundException(String message, Throwable cause) { + public NotFoundException(String message, Throwable cause) { super(message, 404, cause); } - - public NotFoundException(String message) { + + public NotFoundException(String message) { this(message, null); } - - public NotFoundException(Throwable cause) { + + public NotFoundException(Throwable cause) { this(cause.getMessage(), cause); } } diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/src/main/java/com/github/dockerjava/api/NotModifiedException.java index d521bae2d..fa0aa459f 100644 --- a/src/main/java/com/github/dockerjava/api/NotModifiedException.java +++ b/src/main/java/com/github/dockerjava/api/NotModifiedException.java @@ -5,17 +5,17 @@ */ public class NotModifiedException extends DockerException { - private static final long serialVersionUID = -290093024775500239L; + private static final long serialVersionUID = -290093024775500239L; - public NotModifiedException(String message, Throwable cause) { + public NotModifiedException(String message, Throwable cause) { super(message, 304, cause); } - - public NotModifiedException(String message) { + + public NotModifiedException(String message) { this(message, null); } - - public NotModifiedException(Throwable cause) { + + public NotModifiedException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java index 5d48d2163..b097d6523 100644 --- a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java +++ b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java @@ -5,17 +5,17 @@ */ public class UnauthorizedException extends DockerException { - private static final long serialVersionUID = 8257731964780578278L; + private static final long serialVersionUID = 8257731964780578278L; - public UnauthorizedException(String message, Throwable cause) { + public UnauthorizedException(String message, Throwable cause) { super(message, 401, cause); } - - public UnauthorizedException(String message) { + + public UnauthorizedException(String message) { this(message, null); } - - public UnauthorizedException(Throwable cause) { + + public UnauthorizedException(Throwable cause) { this(cause.getMessage(), cause); } diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index 2954b9242..fc3e5985e 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -6,12 +6,18 @@ * Result callback */ 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 */ + /** + * 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 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 onComplete(); 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 ffb282095..c414947fe 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -19,64 +19,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 AsyncDockerCmd { - 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 Void 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 Void exec() throws NotFoundException; - public static interface Exec extends - DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index 3c5922583..c84fcb3b9 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -10,20 +10,21 @@ * */ public interface AuthCmd extends DockerCmd { - - public AuthConfig getAuthConfig(); - public AuthCmd withAuthConfig(AuthConfig authConfig); + public AuthConfig getAuthConfig(); + + public AuthCmd withAuthConfig(AuthConfig authConfig); /** * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: - * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." - * @throws UnauthorizedException If you're not authorised (e.g. bad password). + * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." + * @throws UnauthorizedException + * If you're not authorised (e.g. bad password). */ - @Override - public AuthResponse exec() throws UnauthorizedException; - - public static interface Exec extends DockerCmdExec { - } + @Override + public AuthResponse exec() throws UnauthorizedException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index 925946db4..5dd1cc177 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -14,58 +14,58 @@ * TODO: http://docs.docker.com/reference/builder/#dockerignore * */ -public interface BuildImageCmd extends DockerCmd{ +public interface BuildImageCmd extends DockerCmd { - public BuildImageCmd withTag(String tag); + public BuildImageCmd withTag(String tag); - public InputStream getTarInputStream(); + public InputStream getTarInputStream(); - public String getTag(); + public String getTag(); - public boolean hasNoCacheEnabled(); + public boolean hasNoCacheEnabled(); - public boolean hasRemoveEnabled(); - - public boolean isQuiet(); - - public boolean hasPullEnabled(); + public boolean hasRemoveEnabled(); + + public boolean isQuiet(); + + public boolean hasPullEnabled(); public String getPathToDockerfile(); - public AuthConfigurations getBuildAuthConfigs(); + public AuthConfigurations getBuildAuthConfigs(); public BuildImageCmd withBaseDirectory(File baseDirectory); public BuildImageCmd withDockerfile(File dockerfile); - - public BuildImageCmd withTarInputStream(InputStream tarInputStream); - - public BuildImageCmd withNoCache(); - - public BuildImageCmd withNoCache(boolean noCache); - - public BuildImageCmd withRemove(); - - public BuildImageCmd withRemove(boolean rm); - - public BuildImageCmd withQuiet(); - - public BuildImageCmd withQuiet(boolean quiet); - - public BuildImageCmd withPull(); - - public BuildImageCmd withPull(boolean pull); - - public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); - - public static interface Exec extends DockerCmdExec { - } - - /** - * @see {@link com.github.dockerjava.core.command.EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; - } + + public BuildImageCmd withTarInputStream(InputStream tarInputStream); + + public BuildImageCmd withNoCache(); + + public BuildImageCmd withNoCache(boolean noCache); + + public BuildImageCmd withRemove(); + + public BuildImageCmd withRemove(boolean rm); + + public BuildImageCmd withQuiet(); + + public BuildImageCmd withQuiet(boolean quiet); + + public BuildImageCmd withPull(); + + public BuildImageCmd withPull(boolean pull); + + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); + + public static interface Exec extends DockerCmdExec { + } + + /** + * @see {@link com.github.dockerjava.core.command.EventStreamReader} + */ + public static abstract class Response extends InputStream { + public abstract Iterable getItems() throws IOException; + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index ac0a7bb5e..2c24a0f42 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -5,111 +5,112 @@ import com.github.dockerjava.api.model.Volumes; /** -* -* Create a new image from a container's changes. Returns the new image ID. -* -*/ -public interface CommitCmd extends DockerCmd{ + * + * Create a new image from a container's changes. Returns the new image ID. + * + */ +public interface CommitCmd extends DockerCmd { - public String getContainerId(); - - public CommitCmd withContainerId(String containerId); + public String getContainerId(); - public String getRepository(); + public CommitCmd withContainerId(String containerId); - public String getTag(); + public String getRepository(); - public String getMessage(); + public String getTag(); - public String getAuthor(); + public String getMessage(); - public boolean hasPauseEnabled(); + public String getAuthor(); - public CommitCmd withAttachStderr(boolean attachStderr); + public boolean hasPauseEnabled(); - public CommitCmd withAttachStderr(); + public CommitCmd withAttachStderr(boolean attachStderr); - public CommitCmd withAttachStdin(boolean attachStdin); + public CommitCmd withAttachStderr(); - public CommitCmd withAttachStdin(); + public CommitCmd withAttachStdin(boolean attachStdin); - public CommitCmd withAttachStdout(boolean attachStdout); + public CommitCmd withAttachStdin(); - public CommitCmd withAttachStdout(); + public CommitCmd withAttachStdout(boolean attachStdout); - public CommitCmd withCmd(String... cmd); + public CommitCmd withAttachStdout(); - public CommitCmd withDisableNetwork(boolean disableNetwork); + public CommitCmd withCmd(String... cmd); - public CommitCmd withAuthor(String author); + public CommitCmd withDisableNetwork(boolean disableNetwork); - public CommitCmd withMessage(String message); + public CommitCmd withAuthor(String author); - public CommitCmd withTag(String tag); + public CommitCmd withMessage(String message); - public CommitCmd withRepository(String repository); + public CommitCmd withTag(String tag); - public CommitCmd withPause(boolean pause); + public CommitCmd withRepository(String repository); - public String[] getEnv(); + public CommitCmd withPause(boolean pause); - public CommitCmd withEnv(String... env); + public String[] getEnv(); - public ExposedPorts getExposedPorts(); + public CommitCmd withEnv(String... env); - public CommitCmd withExposedPorts(ExposedPorts exposedPorts); + public ExposedPorts getExposedPorts(); - public String getHostname(); + public CommitCmd withExposedPorts(ExposedPorts exposedPorts); - public CommitCmd withHostname(String hostname); + public String getHostname(); - public Integer getMemory(); + public CommitCmd withHostname(String hostname); - public CommitCmd withMemory(Integer memory); + public Integer getMemory(); - public Integer getMemorySwap(); + public CommitCmd withMemory(Integer memory); - public CommitCmd withMemorySwap(Integer memorySwap); + public Integer getMemorySwap(); - public boolean isOpenStdin(); + public CommitCmd withMemorySwap(Integer memorySwap); - public CommitCmd withOpenStdin(boolean openStdin); + public boolean isOpenStdin(); - public String[] getPortSpecs(); + public CommitCmd withOpenStdin(boolean openStdin); - public CommitCmd withPortSpecs(String... portSpecs); + public String[] getPortSpecs(); - public boolean isStdinOnce(); + public CommitCmd withPortSpecs(String... portSpecs); - public CommitCmd withStdinOnce(boolean stdinOnce); + public boolean isStdinOnce(); - public CommitCmd withStdinOnce(); + public CommitCmd withStdinOnce(boolean stdinOnce); - public boolean isTty(); + public CommitCmd withStdinOnce(); - public CommitCmd withTty(boolean tty); + public boolean isTty(); - public CommitCmd withTty(); + public CommitCmd withTty(boolean tty); - public String getUser(); + public CommitCmd withTty(); - public CommitCmd withUser(String user); + public String getUser(); - public Volumes getVolumes(); + public CommitCmd withUser(String user); - public CommitCmd withVolumes(Volumes volumes); + public Volumes getVolumes(); - public String getWorkingDir(); + public CommitCmd withVolumes(Volumes volumes); - public CommitCmd withWorkingDir(String workingDir); + public String getWorkingDir(); - /** - * @throws NotFoundException No such container - */ - @Override - public String exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + public CommitCmd withWorkingDir(String workingDir); + + /** + * @throws NotFoundException + * No such container + */ + @Override + public String exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 21d99045d..ed7028460 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -9,22 +9,25 @@ public interface ContainerDiffCmd extends DockerCmd> { - public String getContainerId(); - - public ContainerDiffCmd withContainerId(String containerId); - - @Override - public String toString(); - - /** - * @throws NotFoundException No such container - * @throws InternalServerErrorException server error - * @throws DockerException unexpected http status code - */ - @Override - public List exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec> { - } + public String getContainerId(); + + public ContainerDiffCmd withContainerId(String containerId); + + @Override + public String toString(); + + /** + * @throws NotFoundException + * No such container + * @throws InternalServerErrorException + * server error + * @throws DockerException + * unexpected http status code + */ + @Override + public List exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec> { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index 5e85d9984..eb67dfbd9 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -6,28 +6,28 @@ public interface CopyFileFromContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getResource(); + public String getResource(); - public CopyFileFromContainerCmd withContainerId(String containerId); + public CopyFileFromContainerCmd withContainerId(String containerId); - public CopyFileFromContainerCmd withResource(String resource); + public CopyFileFromContainerCmd withResource(String resource); - public String getHostPath(); + public String getHostPath(); - public CopyFileFromContainerCmd withHostPath(String hostPath); + public CopyFileFromContainerCmd withHostPath(String hostPath); - /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws NotFoundException No such container - */ - @Override - public InputStream exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java index d26824715..a25535d5b 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -4,31 +4,33 @@ public interface CreateImageCmd extends DockerCmd { - public String getRepository(); - - // TODO remove method - public String getTag(); - - public InputStream getImageStream(); - - /** - * @param repository the repository to import to - */ - public CreateImageCmd withRepository(String repository); - - /** - * @param imageStream the InputStream of the tar file - */ - public CreateImageCmd withImageStream(InputStream imageStream); - - /** - * @param tag any tag for this image - * @deprecated use repo:tag format for repository - */ - public CreateImageCmd withTag(String tag); - - public static interface Exec extends DockerCmdExec { - } - + public String getRepository(); + + // TODO remove method + public String getTag(); + + public InputStream getImageStream(); + + /** + * @param repository + * the repository to import to + */ + public CreateImageCmd withRepository(String repository); + + /** + * @param imageStream + * the InputStream of the tar file + */ + public CreateImageCmd withImageStream(InputStream imageStream); + + /** + * @param tag + * any tag for this image + * @deprecated use repo:tag format for repository + */ + public CreateImageCmd withTag(String tag); + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java index 89c31666f..79236b890 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -4,6 +4,6 @@ public interface DockerCmd extends Closeable { - public RES_T exec(); + public RES_T exec(); } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java index 8cf13e7bb..635395ed0 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java @@ -1,7 +1,7 @@ package com.github.dockerjava.api.command; public interface DockerCmdExec, RES_T> { - - public RES_T exec(CMD_T command); + + public RES_T exec(CMD_T command); } diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 294d50994..fc750a743 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -7,82 +7,81 @@ public interface DockerCmdExecFactory extends Closeable { - public void init(DockerClientConfig dockerClientConfig); + public void init(DockerClientConfig dockerClientConfig); - public AuthCmd.Exec createAuthCmdExec(); + public AuthCmd.Exec createAuthCmdExec(); - public InfoCmd.Exec createInfoCmdExec(); + public InfoCmd.Exec createInfoCmdExec(); - public PingCmd.Exec createPingCmdExec(); + public PingCmd.Exec createPingCmdExec(); public ExecCreateCmd.Exec createExecCmdExec(); - public VersionCmd.Exec createVersionCmdExec(); + public VersionCmd.Exec createVersionCmdExec(); - public PullImageCmd.Exec createPullImageCmdExec(); + public PullImageCmd.Exec createPullImageCmdExec(); + + public PushImageCmd.Exec createPushImageCmdExec(); - public PushImageCmd.Exec createPushImageCmdExec(); - public SaveImageCmd.Exec createSaveImageCmdExec(); - public CreateImageCmd.Exec createCreateImageCmdExec(); + public CreateImageCmd.Exec createCreateImageCmdExec(); - public SearchImagesCmd.Exec createSearchImagesCmdExec(); + public SearchImagesCmd.Exec createSearchImagesCmdExec(); - public RemoveImageCmd.Exec createRemoveImageCmdExec(); + public RemoveImageCmd.Exec createRemoveImageCmdExec(); - public ListImagesCmd.Exec createListImagesCmdExec(); + public ListImagesCmd.Exec createListImagesCmdExec(); - public InspectImageCmd.Exec createInspectImageCmdExec(); + public InspectImageCmd.Exec createInspectImageCmdExec(); - public ListContainersCmd.Exec createListContainersCmdExec(); + public ListContainersCmd.Exec createListContainersCmdExec(); - public CreateContainerCmd.Exec createCreateContainerCmdExec(); + public CreateContainerCmd.Exec createCreateContainerCmdExec(); - public StartContainerCmd.Exec createStartContainerCmdExec(); + public StartContainerCmd.Exec createStartContainerCmdExec(); - public InspectContainerCmd.Exec createInspectContainerCmdExec(); + public InspectContainerCmd.Exec createInspectContainerCmdExec(); - public RemoveContainerCmd.Exec createRemoveContainerCmdExec(); + public RemoveContainerCmd.Exec createRemoveContainerCmdExec(); - public WaitContainerCmd.Exec createWaitContainerCmdExec(); + public WaitContainerCmd.Exec createWaitContainerCmdExec(); - public AttachContainerCmd.Exec createAttachContainerCmdExec(); + public AttachContainerCmd.Exec createAttachContainerCmdExec(); public ExecStartCmd.Exec createExecStartCmdExec(); public InspectExecCmd.Exec createInspectExecCmdExec(); - public LogContainerCmd.Exec createLogContainerCmdExec(); + public LogContainerCmd.Exec createLogContainerCmdExec(); - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); - public StopContainerCmd.Exec createStopContainerCmdExec(); + public StopContainerCmd.Exec createStopContainerCmdExec(); - public ContainerDiffCmd.Exec createContainerDiffCmdExec(); + public ContainerDiffCmd.Exec createContainerDiffCmdExec(); - public KillContainerCmd.Exec createKillContainerCmdExec(); + public KillContainerCmd.Exec createKillContainerCmdExec(); - public RestartContainerCmd.Exec createRestartContainerCmdExec(); + public RestartContainerCmd.Exec createRestartContainerCmdExec(); - public CommitCmd.Exec createCommitCmdExec(); + public CommitCmd.Exec createCommitCmdExec(); - public BuildImageCmd.Exec createBuildImageCmdExec(); + public BuildImageCmd.Exec createBuildImageCmdExec(); - public TopContainerCmd.Exec createTopContainerCmdExec(); + public TopContainerCmd.Exec createTopContainerCmdExec(); - public TagImageCmd.Exec createTagImageCmdExec(); + public TagImageCmd.Exec createTagImageCmdExec(); - public PauseContainerCmd.Exec createPauseContainerCmdExec(); + public PauseContainerCmd.Exec createPauseContainerCmdExec(); - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); - public EventsCmd.Exec createEventsCmdExec(); - - public StatsCmd.Exec createStatsCmdExec(); + public EventsCmd.Exec createEventsCmdExec(); + public StatsCmd.Exec createStatsCmdExec(); - @Override - public void close() throws IOException; + @Override + public void close() throws IOException; } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index 17ec37248..057bed644 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 com.github.dockerjava.api.model.Event; - /** * 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 AsyncDockerCmd { public EventsCmd withSince(String since); diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java index c1f32e293..ffeef0153 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -3,33 +3,33 @@ public interface ExecCreateCmd extends DockerCmd { public String getContainerId(); - + public ExecCreateCmd withContainerId(String containerId); public ExecCreateCmd withCmd(String... cmd); public ExecCreateCmd withAttachStdin(boolean attachStdin); - + public ExecCreateCmd withAttachStdin(); - + public boolean hasAttachStdinEnabled(); public ExecCreateCmd withAttachStdout(boolean attachStdout); - + public ExecCreateCmd withAttachStdout(); - + public boolean hasAttachStdoutEnabled(); public ExecCreateCmd withAttachStderr(boolean attachStderr); - + public ExecCreateCmd withAttachStderr(); - + public boolean hasAttachStderrEnabled(); public ExecCreateCmd withTty(boolean tty); - + public ExecCreateCmd withTty(); - + public boolean hasTtyEnabled(); public static interface Exec extends DockerCmdExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index 7ccb90cff..339e2c9a0 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -6,33 +6,31 @@ public interface ExecStartCmd extends DockerCmd { - public String getExecId(); + public String getExecId(); - public ExecStartCmd withExecId(String execId); + public ExecStartCmd withExecId(String execId); - public boolean hasDetachEnabled(); + public boolean hasDetachEnabled(); - public ExecStartCmd withDetach(boolean detach); - - public ExecStartCmd withDetach(); + public ExecStartCmd withDetach(boolean detach); - public boolean hasTtyEnabled(); + public ExecStartCmd withDetach(); - public ExecStartCmd withTty(boolean tty); - - public ExecStartCmd withTty(); + public boolean hasTtyEnabled(); - /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws com.github.dockerjava.api.NotFoundException - * No such exec instance - */ - @Override - public InputStream exec() throws NotFoundException; + public ExecStartCmd withTty(boolean tty); - public static interface Exec extends - DockerCmdExec { - } + public ExecStartCmd withTty(); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws com.github.dockerjava.api.NotFoundException + * No such exec instance + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java index d340fe268..10e3597e6 100644 --- a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java @@ -4,7 +4,7 @@ public interface InfoCmd extends DockerCmd { - public static interface Exec extends DockerCmdExec { - } + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index f67fe4aea..e0d087847 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -4,17 +4,18 @@ public interface InspectContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public InspectContainerCmd withContainerId(String containerId); + public InspectContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public InspectContainerResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public InspectContainerResponse exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index f95656899..dc0507e50 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.command; - import java.util.List; import java.util.Map; @@ -19,58 +18,58 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class InspectContainerResponse { - @JsonProperty("Args") - private String[] args; + @JsonProperty("Args") + private String[] args; - @JsonProperty("Config") - private ContainerConfig config; + @JsonProperty("Config") + private ContainerConfig config; - @JsonProperty("Created") - private String created; + @JsonProperty("Created") + private String created; - @JsonProperty("Driver") - private String driver; + @JsonProperty("Driver") + private String driver; - @JsonProperty("ExecDriver") - private String execDriver; + @JsonProperty("ExecDriver") + private String execDriver; - @JsonProperty("HostConfig") - private HostConfig hostConfig; + @JsonProperty("HostConfig") + private HostConfig hostConfig; - @JsonProperty("HostnamePath") - private String hostnamePath; + @JsonProperty("HostnamePath") + private String hostnamePath; - @JsonProperty("HostsPath") - private String hostsPath; + @JsonProperty("HostsPath") + private String hostsPath; - @JsonProperty("Id") + @JsonProperty("Id") private String id; - @JsonProperty("Image") - private String imageId; + @JsonProperty("Image") + private String imageId; - @JsonProperty("MountLabel") - private String mountLabel; + @JsonProperty("MountLabel") + private String mountLabel; - @JsonProperty("Name") - private String name; + @JsonProperty("Name") + private String name; - @JsonProperty("NetworkSettings") - private NetworkSettings networkSettings; + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; - @JsonProperty("Path") + @JsonProperty("Path") private String path; - @JsonProperty("ProcessLabel") + @JsonProperty("ProcessLabel") private String processLabel; - @JsonProperty("ResolvConfPath") - private String resolvConfPath; + @JsonProperty("ResolvConfPath") + private String resolvConfPath; @JsonProperty("ExecIDs") private List execIds; - @JsonProperty("State") + @JsonProperty("State") private ContainerState state; @JsonProperty("Volumes") @@ -92,8 +91,8 @@ public String getPath() { } public String getProcessLabel() { - return processLabel; - } + return processLabel; + } public String[] getArgs() { return args; @@ -150,12 +149,12 @@ public HostConfig getHostConfig() { } public String getExecDriver() { - return execDriver; - } + return execDriver; + } public String getMountLabel() { - return mountLabel; - } + return mountLabel; + } public List getExecIds() { return execIds; @@ -169,37 +168,47 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class NetworkSettings { - @JsonProperty("IPAddress") private String ipAddress; - @JsonProperty("IPPrefixLen") private int ipPrefixLen; - @JsonProperty("Gateway") private String gateway; - @JsonProperty("Bridge") private String bridge; - @JsonProperty("PortMapping") private Map> portMapping; - @JsonProperty("Ports") private Ports ports; + @JsonProperty("IPAddress") + private String ipAddress; - public String getIpAddress() { - return ipAddress; - } + @JsonProperty("IPPrefixLen") + private int ipPrefixLen; + + @JsonProperty("Gateway") + private String gateway; + + @JsonProperty("Bridge") + private String bridge; - public int getIpPrefixLen() { - return ipPrefixLen; - } + @JsonProperty("PortMapping") + private Map> portMapping; - public String getGateway() { - return gateway; - } + @JsonProperty("Ports") + private Ports ports; - public String getBridge() { - return bridge; - } + public String getIpAddress() { + return ipAddress; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } - public Map> getPortMapping() { - return portMapping; - } + public String getGateway() { + return gateway; + } + + public String getBridge() { + return bridge; + } - public Ports getPorts() { - return ports; - } + public Map> getPortMapping() { + return portMapping; + } + public Ports getPorts() { + return ports; + } @Override public String toString() { @@ -210,36 +219,47 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { - @JsonProperty("Running") private boolean running; - @JsonProperty("Paused") private boolean paused; - @JsonProperty("Pid") private int pid; - @JsonProperty("ExitCode") private int exitCode; - @JsonProperty("StartedAt") private String startedAt; - @JsonProperty("FinishedAt") private String finishedAt; + @JsonProperty("Running") + private boolean running; + + @JsonProperty("Paused") + private boolean paused; + + @JsonProperty("Pid") + private int pid; + + @JsonProperty("ExitCode") + private int exitCode; + + @JsonProperty("StartedAt") + private String startedAt; + + @JsonProperty("FinishedAt") + private String finishedAt; public boolean isRunning() { - return running; - } + return running; + } - public boolean isPaused() { - return paused; - } + public boolean isPaused() { + return paused; + } - public int getPid() { - return pid; - } + public int getPid() { + return pid; + } - public int getExitCode() { - return exitCode; - } + public int getExitCode() { + return exitCode; + } - public String getStartedAt() { - return startedAt; - } + public String getStartedAt() { + return startedAt; + } - public String getFinishedAt() { - return finishedAt; - } + public String getFinishedAt() { + return finishedAt; + } @Override public String toString() { @@ -248,4 +268,3 @@ public String toString() { } } - diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java index 13882b8f7..82243614c 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -4,13 +4,16 @@ public interface InspectExecCmd extends DockerCmd { public String getExecId(); + public InspectExecCmd withExecId(String execId); /** - * @throws NotFoundException if no such exec has been found + * @throws NotFoundException + * if no such exec has been found */ @Override public InspectExecResponse exec() throws NotFoundException; - public static interface Exec extends DockerCmdExec {} + public static interface Exec extends DockerCmdExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index d064badba..ebf6550d2 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -5,19 +5,20 @@ /** * Inspect the details of an image. */ -public interface InspectImageCmd extends DockerCmd{ +public interface InspectImageCmd extends DockerCmd { - public String getImageId(); + public String getImageId(); - public InspectImageCmd withImageId(String imageId); + public InspectImageCmd withImageId(String imageId); - /** - * @throws NotFoundException No such image - */ - @Override - public InspectImageResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such image + */ + @Override + public InspectImageResponse 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/InspectImageResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java index b5b6432d7..63f5e49c6 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java @@ -14,28 +14,28 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class InspectImageResponse { - @JsonProperty("Architecture") + @JsonProperty("Architecture") private String arch; - @JsonProperty("Author") + @JsonProperty("Author") private String author; - @JsonProperty("Comment") + @JsonProperty("Comment") private String comment; - @JsonProperty("Config") + @JsonProperty("Config") private ContainerConfig config; - @JsonProperty("Container") + @JsonProperty("Container") private String container; - @JsonProperty("ContainerConfig") + @JsonProperty("ContainerConfig") private ContainerConfig containerConfig; - @JsonProperty("Created") - private String created; + @JsonProperty("Created") + private String created; - @JsonProperty("DockerVersion") + @JsonProperty("DockerVersion") private String dockerVersion; @JsonProperty("Id") diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index b9522cb8c..33fceba3b 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -7,21 +7,22 @@ */ public interface KillContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getSignal(); + public String getSignal(); - public KillContainerCmd withContainerId(String containerId); + public KillContainerCmd withContainerId(String containerId); - public KillContainerCmd withSignal(String signal); + public KillContainerCmd withSignal(String signal); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index ed457dab7..6d641f2e3 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -7,36 +7,41 @@ /** * List containers * - * @param showAll - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - true or false, Show the containers sizes. This is false by default. - * @param limit - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - Show only containers created since Id, include non-running ones. - * @param beforeId - Show only containers created before Id, include non-running ones. + * @param showAll + * - true or false, Show all containers. Only running containers are shown by default. + * @param showSize + * - true or false, Show the containers sizes. This is false by default. + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + * @param sinceId + * - Show only containers created since Id, include non-running ones. + * @param beforeId + * - Show only containers created before Id, include non-running ones. * */ -public interface ListContainersCmd extends DockerCmd>{ +public interface ListContainersCmd extends DockerCmd> { - public int getLimit(); + public int getLimit(); - public boolean hasShowSizeEnabled(); + public boolean hasShowSizeEnabled(); - public boolean hasShowAllEnabled(); + public boolean hasShowAllEnabled(); - public String getSinceId(); + public String getSinceId(); - public String getBeforeId(); + public String getBeforeId(); - public ListContainersCmd withShowAll(boolean showAll); + public ListContainersCmd withShowAll(boolean showAll); - public ListContainersCmd withShowSize(boolean showSize); + public ListContainersCmd withShowSize(boolean showSize); - public ListContainersCmd withLimit(int limit); + public ListContainersCmd withLimit(int limit); - public ListContainersCmd withSince(String since); + public ListContainersCmd withSince(String since); - public ListContainersCmd withBefore(String before); - - public static interface Exec extends DockerCmdExec> { - } + public ListContainersCmd withBefore(String before); + + public static interface Exec extends DockerCmdExec> { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index fad6d1da7..4c6a899cf 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -7,20 +7,22 @@ /** * List images * - * @param showAll - Show all images (by default filter out the intermediate images used to build) - * @param filters - a json encoded value of the filters (a map[string][]string) to process on the images list. + * @param showAll + * - Show all images (by default filter out the intermediate images used to build) + * @param filters + * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public interface ListImagesCmd extends DockerCmd> { - public String getFilters(); + public String getFilters(); - public boolean hasShowAllEnabled(); + public boolean hasShowAllEnabled(); - public ListImagesCmd withShowAll(boolean showAll); + public ListImagesCmd withShowAll(boolean showAll); - public ListImagesCmd withFilters(String filters); + public ListImagesCmd withFilters(String filters); - 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 2eff3c217..48a3b8976 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -17,73 +17,67 @@ * @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. * @param tail - * - `all` or ``, Output specified number of lines at the end - * of logs + * - `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. + * Consider wrapping any input stream you get with a frame reader to make reading frame easier. * */ public interface LogContainerCmd extends AsyncDockerCmd { - public String getContainerId(); + public String getContainerId(); - public int getTail(); + public int getTail(); - 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 LogContainerCmd withContainerId(String containerId); + public LogContainerCmd withContainerId(String containerId); - /** - * See {@link #withFollowStream(boolean)} - */ - public LogContainerCmd withFollowStream(); + /** + * 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); + /** + * 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(); - public LogContainerCmd withTimestamps(boolean timestamps); + public LogContainerCmd withTimestamps(boolean timestamps); - public LogContainerCmd withStdOut(); + public LogContainerCmd withStdOut(); - public LogContainerCmd withStdOut(boolean stdout); + public LogContainerCmd withStdOut(boolean stdout); - public LogContainerCmd withStdErr(); + public LogContainerCmd withStdErr(); - public LogContainerCmd withStdErr(boolean stderr); + public LogContainerCmd withStdErr(boolean stderr); - public LogContainerCmd withTailAll(); + public LogContainerCmd withTailAll(); - public LogContainerCmd withTail(int tail); + 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 - */ - @Override - public Void 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 Void 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/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index 652d433e4..a052c8bcf 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -5,22 +5,24 @@ /** * Pause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ -public interface PauseContainerCmd extends DockerCmd{ +public interface PauseContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public PauseContainerCmd withContainerId(String containerId); + public PauseContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/PingCmd.java b/src/main/java/com/github/dockerjava/api/command/PingCmd.java index 7d5af1e35..a5d88056a 100644 --- a/src/main/java/com/github/dockerjava/api/command/PingCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PingCmd.java @@ -1,13 +1,12 @@ package com.github.dockerjava.api.command; - /** * Ping the Docker server * */ public interface PingCmd 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/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index 4b5fc4c32..b3e6db6aa 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -6,34 +6,33 @@ import java.io.InputStream; /** -* -* Pull image from repository. -* -*/ -public interface PullImageCmd extends DockerCmd{ + * + * Pull image from repository. + * + */ +public interface PullImageCmd extends DockerCmd { - public String getRepository(); + public String getRepository(); - public String getTag(); + public String getTag(); - public String getRegistry(); + public String getRegistry(); public AuthConfig getAuthConfig(); public PullImageCmd withRepository(String repository); - public PullImageCmd withTag(String tag); + public PullImageCmd withTag(String tag); - public PullImageCmd withRegistry(String registry); + public PullImageCmd withRegistry(String registry); public PullImageCmd withAuthConfig(AuthConfig authConfig); public static interface Exec extends DockerCmdExec { - } - + } + /** - * 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. * * @see {@link EventStreamReader} */ 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 9ed38beb7..6b9a67ebe 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -11,41 +11,45 @@ /** * Push the latest image to the repository. * - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ -public interface PushImageCmd extends DockerCmd{ +public interface PushImageCmd extends DockerCmd { - public String getName(); + public String getName(); - public String getTag(); + public String getTag(); - /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. - */ - public PushImageCmd withName(String name); - /** - * @param tag The image's tag. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + public PushImageCmd withName(String name); + + /** + * @param tag + * The image's tag. Not null. */ public PushImageCmd withTag(String tag); public AuthConfig getAuthConfig(); - - public PushImageCmd withAuthConfig(AuthConfig authConfig); - - /** - * @throws NotFoundException No such image - */ - public Response exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } - - /** - * @see {@link EventStreamReader} - */ - public static abstract class Response extends InputStream { - public abstract Iterable getItems() throws IOException; - } + + public PushImageCmd withAuthConfig(AuthConfig authConfig); + + /** + * @throws NotFoundException + * No such image + */ + public Response exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec { + } + + /** + * @see {@link 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/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index b9c1f9437..9f917a327 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -5,32 +5,35 @@ /** * Remove a container. * - * @param removeVolumes - true or false, Remove the volumes associated to the container. Defaults to false - * @param force - true or false, Removes the container even if it was running. Defaults to false + * @param removeVolumes + * - true or false, Remove the volumes associated to the container. Defaults to false + * @param force + * - true or false, Removes the container even if it was running. Defaults to false */ public interface RemoveContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public boolean hasRemoveVolumesEnabled(); + public boolean hasRemoveVolumesEnabled(); - public boolean hasForceEnabled(); + public boolean hasForceEnabled(); - public RemoveContainerCmd withContainerId(String containerId); + public RemoveContainerCmd withContainerId(String containerId); - public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes); + public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes); - public RemoveContainerCmd withForce(); + public RemoveContainerCmd withForce(); - public RemoveContainerCmd withForce(boolean force); + public RemoveContainerCmd withForce(boolean force); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index be65ca41e..1ce1cd210 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -3,48 +3,49 @@ import com.github.dockerjava.api.NotFoundException; /** -* -* Remove an image, deleting any tags it might have. -* -*/ -public interface RemoveImageCmd extends DockerCmd{ - - public String getImageId(); - - public boolean hasForceEnabled(); - - public boolean hasNoPruneEnabled(); - - public RemoveImageCmd withImageId(String imageId); - - /** - * force delete of an image, even if it's tagged in multiple repositories - */ - public RemoveImageCmd withForce(); - - /** - * force parameter to force delete of an image, even if it's tagged in multiple repositories - */ - public RemoveImageCmd withForce(boolean force); - - /** - * prevent the deletion of parent images - */ - public RemoveImageCmd withNoPrune(); - - /** - * noprune parameter to prevent the deletion of parent images - * - */ - public RemoveImageCmd withNoPrune(boolean noPrune); - - /** - * @throws NotFoundException No such image - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + * + * Remove an image, deleting any tags it might have. + * + */ +public interface RemoveImageCmd extends DockerCmd { + + public String getImageId(); + + public boolean hasForceEnabled(); + + public boolean hasNoPruneEnabled(); + + public RemoveImageCmd withImageId(String imageId); + + /** + * force delete of an image, even if it's tagged in multiple repositories + */ + public RemoveImageCmd withForce(); + + /** + * force parameter to force delete of an image, even if it's tagged in multiple repositories + */ + public RemoveImageCmd withForce(boolean force); + + /** + * prevent the deletion of parent images + */ + public RemoveImageCmd withNoPrune(); + + /** + * noprune parameter to prevent the deletion of parent images + * + */ + public RemoveImageCmd withNoPrune(boolean noPrune); + + /** + * @throws NotFoundException + * No such image + */ + @Override + public Void 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/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 8da41d38a..aa07fffd1 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -5,26 +5,28 @@ /** * Restart a running container. * - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public interface RestartContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public int getTimeout(); + public int getTimeout(); - public RestartContainerCmd withContainerId(String containerId); + public RestartContainerCmd withContainerId(String containerId); - public RestartContainerCmd withtTimeout(int timeout); + public RestartContainerCmd withtTimeout(int timeout); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 48c5f3191..67425ab66 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -4,32 +4,33 @@ import java.io.InputStream; -public interface SaveImageCmd extends DockerCmd{ +public interface SaveImageCmd extends DockerCmd { public String getName(); public String getTag(); /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ public SaveImageCmd withName(String name); /** - * @param tag The image's tag. Not null. + * @param tag + * The image's tag. Not null. */ public SaveImageCmd withTag(String tag); /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent - * connection leaks. - * - * @throws com.github.dockerjava.api.NotFoundException No such image + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws com.github.dockerjava.api.NotFoundException + * No such image */ public InputStream exec() throws NotFoundException; public static interface Exec extends DockerCmdExec { } - } diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java index c609e6e8e..9279272d3 100644 --- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -7,16 +7,17 @@ /** * Search images * - * @param term - search term + * @param term + * - search term * */ public interface SearchImagesCmd extends DockerCmd> { - public String getTerm(); + public String getTerm(); - public SearchImagesCmd withTerm(String term); - - public static interface Exec extends DockerCmdExec> { - } + public SearchImagesCmd withTerm(String term); + + public static interface Exec extends 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 0547cc616..f394d7f3e 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -3,9 +3,8 @@ import com.github.dockerjava.api.model.Statistics; /** - * 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. + * Get container stats. The result of {@link Statistics} is handled asynchronously because the docker remote API will + * block when a container is stopped until the container is up again. */ public interface StatsCmd extends AsyncDockerCmd { public StatsCmd withContainerId(String containerId); diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index 19c248552..d5bf2e610 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -6,28 +6,32 @@ /** * Stop a running container. * - * @param containerId - Id of the container - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param containerId + * - Id of the container + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public interface StopContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public int getTimeout(); + public int getTimeout(); - public StopContainerCmd withContainerId(String containerId); + public StopContainerCmd withContainerId(String containerId); - public StopContainerCmd withTimeout(int timeout); + public StopContainerCmd withTimeout(int timeout); - /** - * @throws NotFoundException No such container - * @throws NotModifiedException Container already stopped - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already stopped + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException; + + public static interface Exec extends DockerCmdExec { + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index ace84996e..44fd588f1 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -1,35 +1,37 @@ package com.github.dockerjava.api.command; - /** * Tag an image into a repository * - * @param image The local image to tag (either a name or an id) - * @param repository The repository to tag in - * @param force (not documented) + * @param image + * The local image to tag (either a name or an id) + * @param repository + * The repository to tag in + * @param force + * (not documented) * */ public interface TagImageCmd extends DockerCmd { - public String getImageId(); + public String getImageId(); + + public String getRepository(); - public String getRepository(); + public String getTag(); - public String getTag(); + public boolean hasForceEnabled(); - public boolean hasForceEnabled(); + public TagImageCmd withImageId(String imageId); - public TagImageCmd withImageId(String imageId); + public TagImageCmd withRepository(String repository); - public TagImageCmd withRepository(String repository); + public TagImageCmd withTag(String tag); - public TagImageCmd withTag(String tag); + public TagImageCmd withForce(); - public TagImageCmd withForce(); + public TagImageCmd withForce(boolean force); - public TagImageCmd withForce(boolean force); - - 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/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index 63865c2a6..cc7e33aa3 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -7,21 +7,22 @@ */ public interface TopContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public String getPsArgs(); + public String getPsArgs(); - public TopContainerCmd withContainerId(String containerId); + public TopContainerCmd withContainerId(String containerId); - public TopContainerCmd withPsArgs(String psArgs); + public TopContainerCmd withPsArgs(String psArgs); - /** - * @throws NotFoundException No such container - */ - @Override - public TopContainerResponse exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public TopContainerResponse 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/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index c92ffa4ce..8864167f3 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -12,32 +12,30 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class TopContainerResponse { - @JsonProperty("Titles") - private String[] titles; + @JsonProperty("Titles") + private String[] titles; - @JsonProperty("Processes") - private String[][] processes; + @JsonProperty("Processes") + private String[][] processes; - public String[] getTitles() { - return titles; - } + public String[] getTitles() { + return titles; + } - public String[][] getProcesses() { - return processes; - } + public String[][] getProcesses() { + return processes; + } - @Override + @Override public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("["); - for(String[] fields: processes) { - buffer.append("[" + Joiner.on("; ").skipNulls().join(fields) + "]"); - } - buffer.append("]"); - - return "TopContainerResponse{" + - "titles=" + Joiner.on("; ").skipNulls().join(titles) + - ", processes=" + buffer.toString() + - '}'; + StringBuffer buffer = new StringBuffer(); + buffer.append("["); + for (String[] fields : processes) { + buffer.append("[" + Joiner.on("; ").skipNulls().join(fields) + "]"); + } + buffer.append("]"); + + return "TopContainerResponse{" + "titles=" + Joiner.on("; ").skipNulls().join(titles) + ", processes=" + + buffer.toString() + '}'; } } diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 166bfa6a8..442191416 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -5,22 +5,24 @@ /** * Unpause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public interface UnpauseContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public UnpauseContainerCmd withContainerId(String containerId); + public UnpauseContainerCmd withContainerId(String containerId); - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void 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/VersionCmd.java b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java index 740a335e9..703524623 100644 --- a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java @@ -6,8 +6,8 @@ * Returns the Docker version info. */ public interface VersionCmd 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/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index e71831559..8841b08a3 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -9,17 +9,18 @@ */ public interface WaitContainerCmd extends DockerCmd { - public String getContainerId(); + public String getContainerId(); - public WaitContainerCmd withContainerId(String containerId); - - /** - * @throws NotFoundException container not found - */ - @Override - public Integer exec() throws NotFoundException; - - public static interface Exec extends DockerCmdExec { - } + public WaitContainerCmd withContainerId(String containerId); + + /** + * @throws NotFoundException + * container not found + */ + @Override + public Integer 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/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java index a893e7f38..e87494215 100644 --- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java +++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java @@ -1,28 +1,26 @@ package com.github.dockerjava.api.model; /** - * The access mode of a file system or file: read-write - * or read-only. + * The access mode of a file system or file: read-write or read-only. */ public enum AccessMode { - /** read-write */ - rw, - - /** read-only */ - ro; - - /** - * 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; - } + /** read-write */ + rw, + + /** read-only */ + ro; + + /** + * 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/AuthConfig.java b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java index 42c49bce0..c7ee0af7f 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -13,117 +13,113 @@ public class AuthConfig { public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/"; @JsonProperty - private String username; - - @JsonProperty - private String password; - - @JsonProperty - private String email; - - @JsonProperty("serveraddress") - private String serverAddress = DEFAULT_SERVER_ADDRESS; - - private String auth; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getServerAddress() { - return serverAddress; - } - - public void setServerAddress(String serverAddress) { - this.serverAddress = serverAddress; - } - - @JsonIgnore - public String getAuth() { - return auth; - } - - @JsonProperty("auth") - public void setAuth(String auth) { - this.auth = auth; - } - - @Override - public String toString() { - return "AuthConfig{" + - "username='" + username + '\'' + - ", password='" + password + '\'' + - ", email='" + email + '\'' + - ", serverAddress='" + serverAddress + '\'' + - '}'; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((auth == null) ? 0 : auth.hashCode()); - result = prime * result + ((email == null) ? 0 : email.hashCode()); - result = prime * result + ((password == null) ? 0 : password.hashCode()); - result = prime * result + ((serverAddress == null) ? 0 : serverAddress.hashCode()); - result = prime * result + ((username == null) ? 0 : username.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AuthConfig other = (AuthConfig) obj; - if (auth == null) { - if (other.auth != null) - return false; - } else if (!auth.equals(other.auth)) - return false; - if (email == null) { - if (other.email != null) - return false; - } else if (!email.equals(other.email)) - return false; - if (password == null) { - if (other.password != null) - return false; - } else if (!password.equals(other.password)) - return false; - if (serverAddress == null) { - if (other.serverAddress != null) - return false; - } else if (!serverAddress.equals(other.serverAddress)) - return false; - if (username == null) { - if (other.username != null) - return false; - } else if (!username.equals(other.username)) - return false; - return true; - } + private String username; + + @JsonProperty + private String password; + + @JsonProperty + private String email; + + @JsonProperty("serveraddress") + private String serverAddress = DEFAULT_SERVER_ADDRESS; + + private String auth; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getServerAddress() { + return serverAddress; + } + + public void setServerAddress(String serverAddress) { + this.serverAddress = serverAddress; + } + + @JsonIgnore + public String getAuth() { + return auth; + } + + @JsonProperty("auth") + public void setAuth(String auth) { + this.auth = auth; + } + + @Override + public String toString() { + return "AuthConfig{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + + '\'' + ", serverAddress='" + serverAddress + '\'' + '}'; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((auth == null) ? 0 : auth.hashCode()); + result = prime * result + ((email == null) ? 0 : email.hashCode()); + result = prime * result + ((password == null) ? 0 : password.hashCode()); + result = prime * result + ((serverAddress == null) ? 0 : serverAddress.hashCode()); + result = prime * result + ((username == null) ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AuthConfig other = (AuthConfig) obj; + if (auth == null) { + if (other.auth != null) + return false; + } else if (!auth.equals(other.auth)) + return false; + if (email == null) { + if (other.email != null) + return false; + } else if (!email.equals(other.email)) + return false; + if (password == null) { + if (other.password != null) + return false; + } else if (!password.equals(other.password)) + return false; + if (serverAddress == null) { + if (other.serverAddress != null) + return false; + } else if (!serverAddress.equals(other.serverAddress)) + return false; + if (username == null) { + if (other.username != null) + return false; + } else if (!username.equals(other.username)) + return false; + return true; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java index 5a62c7587..21451e64b 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java @@ -7,15 +7,15 @@ public class AuthConfigurations { - @JsonProperty("configs") - private Map configs = new TreeMap<>(); - - public void addConfig(AuthConfig authConfig){ - configs.put(authConfig.getServerAddress(), authConfig); - } - - public Map getConfigs(){ - return this.configs; - } - + @JsonProperty("configs") + private Map configs = new TreeMap<>(); + + public void addConfig(AuthConfig authConfig) { + configs.put(authConfig.getServerAddress(), authConfig); + } + + public Map getConfigs() { + return this.configs; + } + } 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 0071bff97..60c64d096 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -1,102 +1,96 @@ package com.github.dockerjava.api.model; - - import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; /** - * Represents a host path being bind mounted as a {@link Volume} - * in a Docker container. - * The Bind can be in read only or read write access mode. + * Represents a host path being bind mounted as a {@link Volume} in a Docker container. The Bind can be in read only or + * read write access mode. */ public class Bind { - private String path; - - private Volume volume; - - private AccessMode accessMode; - - public Bind(String path, Volume volume) { - this(path, volume, AccessMode.DEFAULT); - } - - public Bind(String path, Volume volume, AccessMode accessMode) { - this.path = path; - this.volume = volume; - this.accessMode = accessMode; - } - - public String getPath() { - return path; - } - - public Volume getVolume() { - return volume; - } - - public AccessMode getAccessMode() { - return accessMode; - } - - - /** - * Parses a bind mount specification to a {@link Bind}. - * - * @param serialized the specification, e.g. /host:/container:ro - * @return a {@link Bind} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static Bind parse(String serialized) { - try { - String[] parts = serialized.split(":"); - switch (parts.length) { - case 2: { - return new Bind(parts[0], new Volume(parts[1])); - } - case 3: { - AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); - return new Bind(parts[0], new Volume(parts[1]), accessMode); - } - default: { - throw new IllegalArgumentException(); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Bind '" + serialized - + "'"); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Bind) { - Bind other = (Bind) obj; - return new EqualsBuilder().append(path, other.getPath()) - .append(volume, other.getVolume()) - .append(accessMode, other.getAccessMode()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(path).append(volume) - .append(accessMode).toHashCode(); - } - - /** - * Returns a string representation of this {@link Bind} suitable - * for inclusion in a JSON message. - * The format is <host path>:<container path>:<access mode>, - * like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link Bind} - */ - @Override - public String toString() { - return path + ":" + volume.getPath() + ":" + accessMode.toString(); - } + private String path; + + private Volume volume; + + private AccessMode accessMode; + + public Bind(String path, Volume volume) { + this(path, volume, AccessMode.DEFAULT); + } + + public Bind(String path, Volume volume, AccessMode accessMode) { + this.path = path; + this.volume = volume; + this.accessMode = accessMode; + } + + public String getPath() { + return path; + } + + public Volume getVolume() { + return volume; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + /** + * Parses a bind mount specification to a {@link Bind}. + * + * @param serialized + * the specification, e.g. /host:/container:ro + * @return a {@link Bind} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static Bind parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 2: { + return new Bind(parts[0], new Volume(parts[1])); + } + case 3: { + AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); + return new Bind(parts[0], new Volume(parts[1]), accessMode); + } + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Bind) { + Bind other = (Bind) obj; + return new EqualsBuilder().append(path, other.getPath()).append(volume, other.getVolume()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(path).append(volume).append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link Bind} suitable for inclusion in a JSON message. The format is + * <host path>:<container path>:<access mode>, like the argument in + * {@link #parse(String)}. + * + * @return a string representation of this {@link Bind} + */ + @Override + public String toString() { + return path + ":" + volume.getPath() + ":" + accessMode.toString(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Binds.java b/src/main/java/com/github/dockerjava/api/model/Binds.java index bfc8dbf2d..1824ca77b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Binds.java +++ b/src/main/java/com/github/dockerjava/api/model/Binds.java @@ -19,51 +19,50 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = Binds.Serializer.class) @JsonDeserialize(using = Binds.Deserializer.class) public class Binds { - private Bind[] binds; + private Bind[] binds; - public Binds(Bind... binds) { - this.binds = binds; - } + public Binds(Bind... binds) { + this.binds = binds; + } - public Bind[] getBinds() { - return binds; - } + public Bind[] getBinds() { + return binds; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(Binds binds, JsonGenerator jsonGen, SerializerProvider serProvider) throws IOException, + JsonProcessingException { - @Override - public void serialize(Binds binds, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - // - jsonGen.writeStartArray(); - for (Bind bind : binds.getBinds()) { - jsonGen.writeString(bind.toString()); - } - jsonGen.writeEndArray(); - // - } + // + jsonGen.writeStartArray(); + for (Bind bind : binds.getBinds()) { + jsonGen.writeString(bind.toString()); + } + jsonGen.writeEndArray(); + // + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List binds = new ArrayList(); + List binds = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - binds.add(Bind.parse(field.getKey())); + binds.add(Bind.parse(field.getKey())); } } return new Binds(binds.toArray(new Bind[0])); diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/src/main/java/com/github/dockerjava/api/model/Capability.java index c86c07961..b17827553 100644 --- a/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -1,329 +1,297 @@ package com.github.dockerjava.api.model; /** - * The Linux capabilities supported by Docker. - * The list of capabilities is defined in Docker's types.go, - * {@link #ALL} was added manually. + * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} + * was added manually. * - * @see http://man7.org/linux/man-pages/man7/capabilities.7.html + * @see http://man7.org/linux/man-pages/man7/capabilities.7.html */ public enum Capability { - /** - * This meta capability includes all Linux capabilities. - */ - ALL, - /** - *

    - *
  • Enable and disable kernel auditing. - *
  • Change auditing filter rules. - *
  • Retrieve auditing status and filtering rules. - *
- */ - AUDIT_CONTROL, - /** - * Write records to kernel auditing log. - */ - AUDIT_WRITE, - /** - * Employ features that can block system suspend. - */ - BLOCK_SUSPEND, - /** - * Make arbitrary changes to file UIDs and GIDs (see chown(2)). - */ - CHOWN, - /** - * Bypass file read, write, and execute permission checks. - * (DAC is an abbreviation of "discretionary access control".) - */ - DAC_OVERRIDE, - /** - * Bypass file read permission checks and directory read and - * execute permission checks. - */ - DAC_READ_SEARCH, - /** - *
    - *
  • Bypass permission checks on operations that normally require - * the file system UID of the process to match the UID of the file - * (e.g., chmod(2), utime(2)), excluding those operations covered - * by the {@link #DAC_OVERRIDE} and{@link #DAC_READ_SEARCH}. - *
  • Set extended file attributes (see chattr(1)) on arbitrary files. - *
  • Set Access Control Lists (ACLs) on arbitrary files. - *
  • Ignore directory sticky bit on file deletion. - *
  • Specify O_NOATIME for arbitrary files in open(2)and fcntl(2). - *
- */ - FOWNER, - /** - *
    - *
  • Don't clear set-user-ID and set-group-ID permission bits when - * a file is modified. - *
  • Set the set-group-ID bit for a file whose GID does not match - * the file system or any of the supplementary GIDs of the calling - * process. - *
- */ - FSETID, - /** - * Permit memory locking (mlock(2), mlockall(2), mmap(2), shmctl(2)). - */ - IPC_LOCK, - /** - * Bypass permission checks for operations on System V IPC objects. - */ - IPC_OWNER, - /** - * Bypass permission checks for sending signals (see kill(2)). - * This includes use of the ioctl(2) KDSIGACCEPT operation. - */ - KILL, - /** - * Establish leases on arbitrary files (see fcntl(2)). - */ - LEASE, - /** - * Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags (see chattr(1)). - */ - LINUX_IMMUTABLE, - /** - * Override Mandatory Access Control (MAC). - * Implemented for the Smack Linux Security Module (LSM). - */ - MAC_ADMIN, - /** - * Allow MAC configuration or state changes. Implemented for the Smack LSM. - */ - MAC_OVERRIDE, - /** - * Create special files using mknod(2). - */ - MKNOD, - /** - * Perform various network-related operations: - *
    - *
  • Interface configuration. - *
  • Administration of IP firewall, masquerading, and accounting. - *
  • Modify routing tables. - *
  • Bind to any address for transparent proxying. - *
  • Set type-of-service (TOS). - *
  • Clear driver statistics. - *
  • Set promiscuous mode. - *
  • Enabling multicasting. - *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, - * SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), - * SO_RCVBUFFORCE, and SO_SNDBUFFORCE. - *
- */ - NET_ADMIN, - /** - * Bind a socket to Internet domain privileged ports (port numbers less - * than 1024). - */ - NET_BIND_SERVICE, - /** - * (Unused) Make socket broadcasts, and listen to multicasts. - */ - NET_BROADCAST, - /** - *
    - *
  • Use RAW and PACKET sockets. - *
  • Bind to any address for transparent proxying. - *
- */ - NET_RAW, - /** - * Set file capabilities. - */ - SETFCAP, - /** - *
    - *
  • Make arbitrary manipulations of process GIDs and supplementary - * GID list. - *
  • Forge GID when passing socket credentials via UNIX domain - * sockets. - *
- */ - SETGID, - /** - * If file capabilities are not supported: - *
    - *
  • grant or remove any capability in the caller's permitted - * capability set to or from any other process. (This property of - * CAP_SETPCAP is not available when the kernel is configured to - * support file capabilities, since CAP_SETPCAP has entirely different - * semantics for such kernels.) - *
- *

- * If file capabilities are supported: - *

    - *
  • Add any capability from the calling thread's bounding set to its - * inheritable set. - *
  • Drop capabilities from the bounding set (via prctl(2) - * PR_CAPBSET_DROP). - *
  • Make changes to the securebits flags. - *
- */ - SETPCAP, - /** - *
    - *
  • Make arbitrary manipulations of process UIDs (setuid(2), - * setreuid(2), setresuid(2), setfsuid(2)). - *
  • Make forged UID when passing socket credentials via UNIX domain - * sockets. - *
- */ - SETUID, - /** - *
    - *
  • Perform a range of system administration operations including: - * quotactl(2), mount(2), umount(2), swapon(2), swapoff(2), sethostname(2), - * and setdomainname(2). - *
  • Perform privileged syslog(2) operations (since Linux 2.6.37, - * CAP_SYSLOG should be used to permit such operations). - *
  • Perform VM86_REQUEST_IRQ vm86(2) command. - *
  • Perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects. - *
  • Perform operations on trusted and security Extended Attributes - * (see attr(5)). - *
  • Use lookup_dcookie(2) - *
  • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) - * IOPRIO_CLASS_IDLE I/O scheduling classes. - *
  • Forge UID when passing socket credentials. - *
  • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of - * open files, in system calls that open files (e.g., accept(2), execve(2), - * open(2), pipe(2)). - *
  • Employ CLONE_* flags that create new namespaces with clone(2) and - * unshare(2). - *
  • Call perf_event_open(2). - *
  • Access privileged perf event information. - *
  • Call setns(2). - *
  • Call fanotify_init(2). - *
  • Perform KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations. - *
  • Perform madvise(2) MADV_HWPOISON operation. - *
  • Employ the TIOCSTI ioctl(2) to insert characters into the input queue - * of a terminal other than the caller's controlling terminal. - *
  • Employ the obsolete nfsservctl(2) system call. - *
  • Employ the obsolete bdflush(2) system call. - *
  • Perform various privileged block-device ioctl(2) operations. - *
  • Perform various privileged file-system ioctl(2) operations. - *
  • Perform administrative operations on many device drivers. - *
- */ - SYS_ADMIN, - /** - * Use reboot(2) and kexec_load(2). - */ - SYS_BOOT, - /** - * Use chroot(2). - */ - SYS_CHROOT, - /** - *
    - *
  • Perform privileged syslog(2) operations. See syslog(2) for information - * on which operations require privilege. - *
  • View kernel addresses exposed via /proc and other interfaces when - * /proc/sys/kernel/kptr_restrict has the value 1. (See the discussion of the - * kptr_restrict in proc(5).) - *
- */ - SYSLOG, - /** - *
    - *
  • Load and unload kernel modules (see init_module(2) and delete_module(2)) - *
  • In kernels before 2.6.25: drop capabilities from the system-wide - * capability bounding set. - *
- */ - SYS_MODULE, - /** - *
    - *
  • Raise process nice value (nice(2), setpriority(2)) and change the nice - * value for arbitrary processes. - *
  • Set real-time scheduling policies for calling process, and set scheduling - * policies and priorities for arbitrary processes (sched_setscheduler(2), - * sched_setparam(2)). - *
  • Set CPU affinity for arbitrary processes (sched_setaffinity(2)). - *
  • Set I/O scheduling class and priority for arbitrary processes - * (ioprio_set(2)). - *
  • Apply migrate_pages(2) to arbitrary processes and allow processes to be - * migrated to arbitrary nodes. - *
  • Apply move_pages(2) to arbitrary processes. - *
  • Use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2). - *
- */ - SYS_NICE, - /** - * Use acct(2). - */ - SYS_PACCT, - /** - *
    - *
  • Trace arbitrary processes using ptrace(2). - *
  • Apply get_robust_list(2) to arbitrary processes. - *
  • Inspect processes using kcmp(2). - *
- */ - SYS_PTRACE, - /** - *
    - *
  • Perform I/O port operations (iopl(2) and ioperm(2)). - *
  • Access /proc/kcore. - *
  • Employ the FIBMAP ioctl(2) operation. - *
  • Open devices for accessing x86 model-specific registers (MSRs, see - * msr(4)). - *
  • Update /proc/sys/vm/mmap_min_addr. - *
  • Create memory mappings at addresses below the value specified by - * /proc/sys/vm/mmap_min_addr. - *
  • Map files in /proc/pci/bus. - *
  • Open /dev/mem and /dev/kmem. - *
  • Perform various SCSI device commands. - *
  • Perform certain operations on hpsa(4) and cciss(4) devices. - *
  • Perform a range of device-specific operations on other devices. - *
- */ - SYS_RAWIO, - /** - *
    - *
  • Use reserved space on ext2 file systems. - *
  • Make ioctl(2) calls controlling ext3 journaling. - *
  • Override disk quota limits. - *
  • Increase resource limits (see setrlimit(2)). - *
  • Override RLIMIT_NPROC resource limit. - *
  • Override maximum number of consoles on console allocation. - *
  • Override maximum number of keymaps. - *
  • Allow more than 64hz interrupts from the real-time clock. - *
  • Raise msg_qbytes limit for a System V message queue above the limit - * in /proc/sys/kernel/msgmnb (see msgop(2) and msgctl(2)). - *
  • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity - * of a pipe using the F_SETPIPE_SZ fcntl(2) command. - *
  • Use F_SETPIPE_SZ to increase the capacity of a pipe above the limit - * specified by /proc/sys/fs/pipe-max-size. - *
  • Override /proc/sys/fs/mqueue/queues_max limit when creating POSIX - * message queues (see mq_overview(7)). - *
  • Employ prctl(2) PR_SET_MM operation. - *
  • Set /proc/PID/oom_score_adj to a value lower than the value last set - * by a process with CAP_SYS_RESOURCE. - *
- */ - SYS_RESOURCE, - /** - *
    - *
  • Set system clock (settimeofday(2), stime(2), adjtimex(2)). - *
  • Set real-time (hardware) clock. - *
- */ - SYS_TIME, - /** - *
    - *
  • Use vhangup(2). - *
  • Employ various privileged ioctl(2) operations on virtual terminals. - *
- */ - SYS_TTY_CONFIG, - /** - * Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and - * CLOCK_BOOTTIME_ALARM timers). - */ - WAKE_ALARM + /** + * This meta capability includes all Linux capabilities. + */ + ALL, + /** + *
    + *
  • Enable and disable kernel auditing. + *
  • Change auditing filter rules. + *
  • Retrieve auditing status and filtering rules. + *
+ */ + AUDIT_CONTROL, + /** + * Write records to kernel auditing log. + */ + AUDIT_WRITE, + /** + * Employ features that can block system suspend. + */ + BLOCK_SUSPEND, + /** + * Make arbitrary changes to file UIDs and GIDs (see chown(2)). + */ + CHOWN, + /** + * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of + * "discretionary access control".) + */ + DAC_OVERRIDE, + /** + * Bypass file read permission checks and directory read and execute permission checks. + */ + DAC_READ_SEARCH, + /** + *
    + *
  • Bypass permission checks on operations that normally require the file system UID of the process to match the + * UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and + * {@link #DAC_READ_SEARCH}. + *
  • Set extended file attributes (see chattr(1)) on arbitrary files. + *
  • Set Access Control Lists (ACLs) on arbitrary files. + *
  • Ignore directory sticky bit on file deletion. + *
  • Specify O_NOATIME for arbitrary files in open(2)and fcntl(2). + *
+ */ + FOWNER, + /** + *
    + *
  • Don't clear set-user-ID and set-group-ID permission bits when a file is modified. + *
  • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs + * of the calling process. + *
+ */ + FSETID, + /** + * Permit memory locking (mlock(2), mlockall(2), mmap(2), shmctl(2)). + */ + IPC_LOCK, + /** + * Bypass permission checks for operations on System V IPC objects. + */ + IPC_OWNER, + /** + * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT + * operation. + */ + KILL, + /** + * Establish leases on arbitrary files (see fcntl(2)). + */ + LEASE, + /** + * Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags (see chattr(1)). + */ + LINUX_IMMUTABLE, + /** + * Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). + */ + MAC_ADMIN, + /** + * Allow MAC configuration or state changes. Implemented for the Smack LSM. + */ + MAC_OVERRIDE, + /** + * Create special files using mknod(2). + */ + MKNOD, + /** + * Perform various network-related operations: + *
    + *
  • Interface configuration. + *
  • Administration of IP firewall, masquerading, and accounting. + *
  • Modify routing tables. + *
  • Bind to any address for transparent proxying. + *
  • Set type-of-service (TOS). + *
  • Clear driver statistics. + *
  • Set promiscuous mode. + *
  • Enabling multicasting. + *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside + * the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE. + *
+ */ + NET_ADMIN, + /** + * Bind a socket to Internet domain privileged ports (port numbers less than 1024). + */ + NET_BIND_SERVICE, + /** + * (Unused) Make socket broadcasts, and listen to multicasts. + */ + NET_BROADCAST, + /** + *
    + *
  • Use RAW and PACKET sockets. + *
  • Bind to any address for transparent proxying. + *
+ */ + NET_RAW, + /** + * Set file capabilities. + */ + SETFCAP, + /** + *
    + *
  • Make arbitrary manipulations of process GIDs and supplementary GID list. + *
  • Forge GID when passing socket credentials via UNIX domain sockets. + *
+ */ + SETGID, + /** + * If file capabilities are not supported: + *
    + *
  • grant or remove any capability in the caller's permitted capability set to or from any other process. (This + * property of CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since + * CAP_SETPCAP has entirely different semantics for such kernels.) + *
+ *

+ * If file capabilities are supported: + *

    + *
  • Add any capability from the calling thread's bounding set to its inheritable set. + *
  • Drop capabilities from the bounding set (via prctl(2) PR_CAPBSET_DROP). + *
  • Make changes to the securebits flags. + *
+ */ + SETPCAP, + /** + *
    + *
  • Make arbitrary manipulations of process UIDs (setuid(2), setreuid(2), setresuid(2), setfsuid(2)). + *
  • Make forged UID when passing socket credentials via UNIX domain sockets. + *
+ */ + SETUID, + /** + *
    + *
  • Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), swapon(2), + * swapoff(2), sethostname(2), and setdomainname(2). + *
  • Perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to permit such + * operations). + *
  • Perform VM86_REQUEST_IRQ vm86(2) command. + *
  • Perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects. + *
  • Perform operations on trusted and security Extended Attributes (see attr(5)). + *
  • Use lookup_dcookie(2) + *
  • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling + * classes. + *
  • Forge UID when passing socket credentials. + *
  • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system calls that open + * files (e.g., accept(2), execve(2), open(2), pipe(2)). + *
  • Employ CLONE_* flags that create new namespaces with clone(2) and unshare(2). + *
  • Call perf_event_open(2). + *
  • Access privileged perf event information. + *
  • Call setns(2). + *
  • Call fanotify_init(2). + *
  • Perform KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations. + *
  • Perform madvise(2) MADV_HWPOISON operation. + *
  • Employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other than the caller's + * controlling terminal. + *
  • Employ the obsolete nfsservctl(2) system call. + *
  • Employ the obsolete bdflush(2) system call. + *
  • Perform various privileged block-device ioctl(2) operations. + *
  • Perform various privileged file-system ioctl(2) operations. + *
  • Perform administrative operations on many device drivers. + *
+ */ + SYS_ADMIN, + /** + * Use reboot(2) and kexec_load(2). + */ + SYS_BOOT, + /** + * Use chroot(2). + */ + SYS_CHROOT, + /** + *
    + *
  • Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege. + *
  • View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the + * value 1. (See the discussion of the kptr_restrict in proc(5).) + *
+ */ + SYSLOG, + /** + *
    + *
  • Load and unload kernel modules (see init_module(2) and delete_module(2)) + *
  • In kernels before 2.6.25: drop capabilities from the system-wide capability bounding set. + *
+ */ + SYS_MODULE, + /** + *
    + *
  • Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. + *
  • Set real-time scheduling policies for calling process, and set scheduling policies and priorities for + * arbitrary processes (sched_setscheduler(2), sched_setparam(2)). + *
  • Set CPU affinity for arbitrary processes (sched_setaffinity(2)). + *
  • Set I/O scheduling class and priority for arbitrary processes (ioprio_set(2)). + *
  • Apply migrate_pages(2) to arbitrary processes and allow processes to be migrated to arbitrary nodes. + *
  • Apply move_pages(2) to arbitrary processes. + *
  • Use the MPOL_MF_MOVE_ALL flag with mbind(2) and move_pages(2). + *
+ */ + SYS_NICE, + /** + * Use acct(2). + */ + SYS_PACCT, + /** + *
    + *
  • Trace arbitrary processes using ptrace(2). + *
  • Apply get_robust_list(2) to arbitrary processes. + *
  • Inspect processes using kcmp(2). + *
+ */ + SYS_PTRACE, + /** + *
    + *
  • Perform I/O port operations (iopl(2) and ioperm(2)). + *
  • Access /proc/kcore. + *
  • Employ the FIBMAP ioctl(2) operation. + *
  • Open devices for accessing x86 model-specific registers (MSRs, see msr(4)). + *
  • Update /proc/sys/vm/mmap_min_addr. + *
  • Create memory mappings at addresses below the value specified by /proc/sys/vm/mmap_min_addr. + *
  • Map files in /proc/pci/bus. + *
  • Open /dev/mem and /dev/kmem. + *
  • Perform various SCSI device commands. + *
  • Perform certain operations on hpsa(4) and cciss(4) devices. + *
  • Perform a range of device-specific operations on other devices. + *
+ */ + SYS_RAWIO, + /** + *
    + *
  • Use reserved space on ext2 file systems. + *
  • Make ioctl(2) calls controlling ext3 journaling. + *
  • Override disk quota limits. + *
  • Increase resource limits (see setrlimit(2)). + *
  • Override RLIMIT_NPROC resource limit. + *
  • Override maximum number of consoles on console allocation. + *
  • Override maximum number of keymaps. + *
  • Allow more than 64hz interrupts from the real-time clock. + *
  • Raise msg_qbytes limit for a System V message queue above the limit in /proc/sys/kernel/msgmnb (see msgop(2) + * and msgctl(2)). + *
  • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the F_SETPIPE_SZ + * fcntl(2) command. + *
  • Use F_SETPIPE_SZ to increase the capacity of a pipe above the limit specified by /proc/sys/fs/pipe-max-size. + *
  • Override /proc/sys/fs/mqueue/queues_max limit when creating POSIX message queues (see mq_overview(7)). + *
  • Employ prctl(2) PR_SET_MM operation. + *
  • Set /proc/PID/oom_score_adj to a value lower than the value last set by a process with CAP_SYS_RESOURCE. + *
+ */ + SYS_RESOURCE, + /** + *
    + *
  • Set system clock (settimeofday(2), stime(2), adjtimex(2)). + *
  • Set real-time (hardware) clock. + *
+ */ + SYS_TIME, + /** + *
    + *
  • Use vhangup(2). + *
  • Employ various privileged ioctl(2) operations on virtual terminals. + *
+ */ + SYS_TTY_CONFIG, + /** + * Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers). + */ + WAKE_ALARM } diff --git a/src/main/java/com/github/dockerjava/api/model/Container.java b/src/main/java/com/github/dockerjava/api/model/Container.java index 5b38ce48c..6a97e20b9 100644 --- a/src/main/java/com/github/dockerjava/api/model/Container.java +++ b/src/main/java/com/github/dockerjava/api/model/Container.java @@ -10,16 +10,16 @@ * @author Konstantin Pelykh (kpelykh@gmail.com) * */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class Container { - @JsonProperty("Command") - private String command; + @JsonProperty("Command") + private String command; - @JsonProperty("Created") - private long created; + @JsonProperty("Created") + private long created; - @JsonProperty("Id") + @JsonProperty("Id") private String id; @JsonProperty("Image") @@ -62,7 +62,6 @@ public String[] getNames() { return names; } - @Override public String toString() { return ToStringBuilder.reflectionToString(this); @@ -84,20 +83,20 @@ public static class Port { private String type; public String getIp() { - return ip; - } + return ip; + } public Integer getPrivatePort() { - return privatePort; - } + return privatePort; + } public Integer getPublicPort() { - return publicPort; - } + return publicPort; + } public String getType() { - return type; - } + return type; + } @Override public String toString() { 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 ce8c6b88f..8ea673a36 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -15,177 +15,177 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerConfig { - @JsonProperty("AttachStderr") - private boolean attachStderr = false; + @JsonProperty("AttachStderr") + private boolean attachStderr = false; - @JsonProperty("AttachStdin") - private boolean attachStdin = false; + @JsonProperty("AttachStdin") + private boolean attachStdin = false; - @JsonProperty("AttachStdout") - private boolean attachStdout = false; + @JsonProperty("AttachStdout") + private boolean attachStdout = false; - @JsonProperty("Cmd") - private String[] cmd; + @JsonProperty("Cmd") + private String[] cmd; - @JsonProperty("CpuShares") - private int cpuShares = 0; + @JsonProperty("CpuShares") + private int cpuShares = 0; - @JsonProperty("Cpuset") - private String cpuset = ""; + @JsonProperty("Cpuset") + private String cpuset = ""; - @JsonProperty("Domainname") - private String domainName = ""; + @JsonProperty("Domainname") + private String domainName = ""; - @JsonProperty("Entrypoint") - private String[] entrypoint = new String[] {}; + @JsonProperty("Entrypoint") + private String[] entrypoint = new String[] {}; - @JsonProperty("Env") - private String[] env; + @JsonProperty("Env") + private String[] env; - @JsonProperty("ExposedPorts") - private ExposedPorts exposedPorts; + @JsonProperty("ExposedPorts") + private ExposedPorts exposedPorts; - @JsonProperty("Hostname") - private String hostName = ""; + @JsonProperty("Hostname") + private String hostName = ""; - @JsonProperty("Image") - private String image; + @JsonProperty("Image") + private String image; - @JsonProperty("MacAddress") - private String macAddress; - - @JsonProperty("Memory") - private long memoryLimit = 0; + @JsonProperty("MacAddress") + private String macAddress; - @JsonProperty("MemorySwap") - private long memorySwap = 0; + @JsonProperty("Memory") + private long memoryLimit = 0; - @JsonProperty("NetworkDisabled") - private boolean networkDisabled = false; + @JsonProperty("MemorySwap") + private long memorySwap = 0; - @JsonProperty("OnBuild") - private String[] onBuild; + @JsonProperty("NetworkDisabled") + private boolean networkDisabled = false; - @JsonProperty("OpenStdin") - private boolean stdinOpen = false; + @JsonProperty("OnBuild") + private String[] onBuild; - @JsonProperty("PortSpecs") - private String[] portSpecs; + @JsonProperty("OpenStdin") + private boolean stdinOpen = false; - @JsonProperty("StdinOnce") - private boolean stdInOnce = false; + @JsonProperty("PortSpecs") + private String[] portSpecs; - @JsonProperty("Tty") - private boolean tty = false; + @JsonProperty("StdinOnce") + private boolean stdInOnce = false; - @JsonProperty("User") - private String user = ""; + @JsonProperty("Tty") + private boolean tty = false; - @JsonProperty("Volumes") - private Map volumes; + @JsonProperty("User") + private String user = ""; - @JsonProperty("WorkingDir") - private String workingDir = ""; + @JsonProperty("Volumes") + private Map volumes; - @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); - } + @JsonProperty("WorkingDir") + private String workingDir = ""; - public boolean isNetworkDisabled() { - return networkDisabled; - } + @JsonIgnore + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); + } - public String getDomainName() { - return domainName; - } + public boolean isNetworkDisabled() { + return networkDisabled; + } - public String getWorkingDir() { - return workingDir; - } + public String getDomainName() { + return domainName; + } - public String getHostName() { - return hostName; - } + public String getWorkingDir() { + return workingDir; + } - public String[] getPortSpecs() { - return portSpecs; - } + public String getHostName() { + return hostName; + } - public String getUser() { - return user; - } + public String[] getPortSpecs() { + return portSpecs; + } - public boolean isTty() { - return tty; - } + public String getUser() { + return user; + } - public boolean isStdinOpen() { - return stdinOpen; - } + public boolean isTty() { + return tty; + } - public boolean isStdInOnce() { - return stdInOnce; - } - - public String getMacAddress() { - return macAddress; - } + public boolean isStdinOpen() { + return stdinOpen; + } - public long getMemoryLimit() { - return memoryLimit; - } + public boolean isStdInOnce() { + return stdInOnce; + } - public long getMemorySwap() { - return memorySwap; - } + public String getMacAddress() { + return macAddress; + } - public int getCpuShares() { - return cpuShares; - } + public long getMemoryLimit() { + return memoryLimit; + } - public String getCpuset() { - return cpuset; - } + public long getMemorySwap() { + return memorySwap; + } - public boolean isAttachStdin() { - return attachStdin; - } + public int getCpuShares() { + return cpuShares; + } - public boolean isAttachStdout() { - return attachStdout; - } + public String getCpuset() { + return cpuset; + } - public boolean isAttachStderr() { - return attachStderr; - } + public boolean isAttachStdin() { + return attachStdin; + } - public String[] getEnv() { - return env; - } + public boolean isAttachStdout() { + return attachStdout; + } - public String[] getCmd() { - return cmd; - } + public boolean isAttachStderr() { + return attachStderr; + } - public String getImage() { - return image; - } + public String[] getEnv() { + return env; + } - public Map getVolumes() { - return volumes; - } - - public String[] getEntrypoint() { - return entrypoint; - } - - public String[] getOnBuild() { - return onBuild; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } + public String[] getCmd() { + return cmd; + } + + public String getImage() { + return image; + } + + public Map getVolumes() { + return volumes; + } + + public String[] getEntrypoint() { + return entrypoint; + } + + public String[] getOnBuild() { + return onBuild; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java index 574d1ad56..713c0d61a 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -9,57 +9,53 @@ public class Device { - @JsonProperty("CgroupPermissions") - private String cGroupPermissions = ""; - - @JsonProperty("PathOnHost") - private String pathOnHost = null; - - @JsonProperty("PathInContainer") - private String pathInContainer = null; - - public Device() { - } - - public Device(String cGroupPermissions, String pathInContainer, - String pathOnHost) { - checkNotNull(cGroupPermissions, - "cGroupPermissions is null"); - checkNotNull(pathInContainer, "pathInContainer is null"); - checkNotNull(pathOnHost, "pathOnHost is null"); - this.cGroupPermissions = cGroupPermissions; - this.pathInContainer = pathInContainer; - this.pathOnHost = pathOnHost; - } - - public String getcGroupPermissions() { - return cGroupPermissions; - } - - public String getPathInContainer() { - return pathInContainer; - } - - public String getPathOnHost() { - return pathOnHost; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Device) { - Device other = (Device) obj; - return new EqualsBuilder() - .append(cGroupPermissions, other.getcGroupPermissions()) - .append(pathInContainer, other.getPathInContainer()) - .append(pathOnHost, other.getPathOnHost()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(cGroupPermissions) - .append(pathInContainer).append(pathOnHost).toHashCode(); - } + @JsonProperty("CgroupPermissions") + private String cGroupPermissions = ""; + + @JsonProperty("PathOnHost") + private String pathOnHost = null; + + @JsonProperty("PathInContainer") + private String pathInContainer = null; + + public Device() { + } + + public Device(String cGroupPermissions, String pathInContainer, String pathOnHost) { + checkNotNull(cGroupPermissions, "cGroupPermissions is null"); + checkNotNull(pathInContainer, "pathInContainer is null"); + checkNotNull(pathOnHost, "pathOnHost is null"); + this.cGroupPermissions = cGroupPermissions; + this.pathInContainer = pathInContainer; + this.pathOnHost = pathOnHost; + } + + public String getcGroupPermissions() { + return cGroupPermissions; + } + + public String getPathInContainer() { + return pathInContainer; + } + + public String getPathOnHost() { + return pathOnHost; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Device) { + Device other = (Device) obj; + return new EqualsBuilder().append(cGroupPermissions, other.getcGroupPermissions()) + .append(pathInContainer, other.getPathInContainer()).append(pathOnHost, other.getPathOnHost()) + .isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(cGroupPermissions).append(pathInContainer).append(pathOnHost).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java index 87d9b0d7f..d589a31d1 100644 --- a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java +++ b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java @@ -5,6 +5,7 @@ public class ErrorResponse { @JsonProperty private ErrorDetail errorDetail; + @JsonProperty private String error; diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java index cb961f97d..27eb22216 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -22,12 +22,17 @@ 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 + * + * @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) { @@ -36,10 +41,12 @@ public Event(String status, String id, String from, long time) { this.from = from; this.time = time; } - + /** - * Status of docker image or container. - * List of statuses is available in Docker API v.1.16 + * Status of docker image or container. List of statuses is available in Docker API + * v.1.16 + * * @return Status string */ public String getStatus() { @@ -48,6 +55,7 @@ public String getStatus() { /** * Get ID of docker container. + * * @return Container ID */ public String getId() { @@ -56,6 +64,7 @@ public String getId() { /** * Get source image of the container. + * * @return Name of the parent container */ public String getFrom() { @@ -63,8 +72,8 @@ public String getFrom() { } /** - * Get the event time. - * The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT + * 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() { diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 010ed9af7..9c7489812 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -1,7 +1,5 @@ package com.github.dockerjava.api.model; - - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -12,12 +10,12 @@ /** * Represents an event stream */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class EventStreamItem implements Serializable { - private static final long serialVersionUID = 638778515773898651L; + private static final long serialVersionUID = 638778515773898651L; - @JsonProperty("stream") + @JsonProperty("stream") private String stream; // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} @@ -39,28 +37,23 @@ public ErrorDetail getErrorDetail() { return errorDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ErrorDetail implements Serializable { @JsonProperty("code") String code; + @JsonProperty("message") String message; @Override public String toString() { - return Objects.toStringHelper(this) - .add("code", code) - .add("message", message) - .toString(); + return Objects.toStringHelper(this).add("code", code).add("message", message).toString(); } } @Override public String toString() { - return Objects.toStringHelper(this) - .add("stream", stream) - .add("error", error) - .add("errorDetail", errorDetail) + return Objects.toStringHelper(this).add("stream", stream).add("error", error).add("errorDetail", errorDetail) .toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java index 30f7ce384..23510e50a 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -24,168 +24,168 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * Represents a container port that Docker exposes to external clients. - * The port is defined by its {@link #getPort() port number} and an - * {@link InternetProtocol}. - * It can be published by Docker by {@link Ports#bind(ExposedPort, Binding) binding} - * it to a host port, represented by a {@link Binding}. + * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPort() + * port number} and an {@link InternetProtocol}. It can be published by Docker by + * {@link Ports#bind(ExposedPort, Binding) binding} it to a host port, represented by a {@link Binding}. */ @JsonDeserialize(using = ExposedPort.Deserializer.class) @JsonSerialize(using = ExposedPort.Serializer.class) public class ExposedPort { - private final InternetProtocol protocol; - private final int port; - - /** - * Creates an {@link ExposedPort} for the given parameters. - * - * @param port the {@link #getPort() port number} - * @param protocol the {@link InternetProtocol} - */ - public ExposedPort(int port, InternetProtocol protocol) { - this.port = port; - this.protocol = protocol; - } - - /** - * Creates an {@link ExposedPort} for the given - * {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}. - * - * @param port the {@link #getPort() port number} - */ - public ExposedPort(int port) { - this(port, InternetProtocol.DEFAULT); - } - - /** - * Creates an {@link ExposedPort} for the given parameters. - * - * @param scheme the {@link #getScheme() scheme}, tcp or - * udp - * @param port the {@link #getPort() port number} - * @deprecated use {@link #ExposedPort(int, InternetProtocol)} - */ - @Deprecated - public ExposedPort(String scheme, int port) { - this(port, InternetProtocol.valueOf(scheme)); - } - - /** @return the {@link InternetProtocol} of the {@link #getPort() port} - * that the container exposes */ - public InternetProtocol getProtocol() { - return protocol; - } - - /** - * @return the scheme (internet protocol), tcp or udp - * @deprecated use {@link #getProtocol()} - */ - @Deprecated - public String getScheme() { - return protocol.toString(); - } - - /** @return the port number that the container exposes */ - public int getPort() { - return port; - } - - /** - * Creates an {@link ExposedPort} for {@link InternetProtocol#TCP}. - * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#TCP}) - */ - public static ExposedPort tcp(int port) { - return new ExposedPort(port, TCP); - } - - /** - * Creates an {@link ExposedPort} for {@link InternetProtocol#UDP}. - * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#UDP}) - */ - public static ExposedPort udp(int port) { - return new ExposedPort(port, UDP); - } - - /** - * Parses a textual port specification (as used by the Docker CLI) to an - * {@link ExposedPort}. - * - * @param serialized the specification, e.g. 80/tcp - * @return an {@link ExposedPort} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static ExposedPort parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = serialized.split("/"); - switch (parts.length) { - case 1: - return new ExposedPort(Integer.valueOf(parts[0])); - case 2: - return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); - default: - throw new IllegalArgumentException(); - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'"); - } - } - - /** - * Returns a string representation of this {@link ExposedPort} suitable - * for inclusion in a JSON message. - * The format is port/protocol, like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link ExposedPort} - */ - @Override - public String toString() { - return port + "/" + protocol.toString(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ExposedPort) { - ExposedPort other = (ExposedPort) obj; - return new EqualsBuilder().append(protocol, other.getProtocol()) - .append(port, other.getPort()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(protocol).append(port).toHashCode(); - } - - public static class Deserializer extends JsonDeserializer { - @Override - public ExposedPort 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 ExposedPort.parse(field.getKey()); - } else { - return null; - } - } - } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeEndObject(); - } - - } + private final InternetProtocol protocol; + + private final int port; + + /** + * Creates an {@link ExposedPort} for the given parameters. + * + * @param port + * the {@link #getPort() port number} + * @param protocol + * the {@link InternetProtocol} + */ + public ExposedPort(int port, InternetProtocol protocol) { + this.port = port; + this.protocol = protocol; + } + + /** + * Creates an {@link ExposedPort} for the given {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}. + * + * @param port + * the {@link #getPort() port number} + */ + public ExposedPort(int port) { + this(port, InternetProtocol.DEFAULT); + } + + /** + * Creates an {@link ExposedPort} for the given parameters. + * + * @param scheme + * the {@link #getScheme() scheme}, tcp or udp + * @param port + * the {@link #getPort() port number} + * @deprecated use {@link #ExposedPort(int, InternetProtocol)} + */ + @Deprecated + public ExposedPort(String scheme, int port) { + this(port, InternetProtocol.valueOf(scheme)); + } + + /** + * @return the {@link InternetProtocol} of the {@link #getPort() port} that the container exposes + */ + public InternetProtocol getProtocol() { + return protocol; + } + + /** + * @return the scheme (internet protocol), tcp or udp + * @deprecated use {@link #getProtocol()} + */ + @Deprecated + public String getScheme() { + return protocol.toString(); + } + + /** @return the port number that the container exposes */ + public int getPort() { + return port; + } + + /** + * Creates an {@link ExposedPort} for {@link InternetProtocol#TCP}. This is a shortcut for + * new ExposedPort(port, {@link InternetProtocol#TCP}) + */ + public static ExposedPort tcp(int port) { + return new ExposedPort(port, TCP); + } + + /** + * Creates an {@link ExposedPort} for {@link InternetProtocol#UDP}. This is a shortcut for + * new ExposedPort(port, {@link InternetProtocol#UDP}) + */ + public static ExposedPort udp(int port) { + return new ExposedPort(port, UDP); + } + + /** + * Parses a textual port specification (as used by the Docker CLI) to an {@link ExposedPort}. + * + * @param serialized + * the specification, e.g. 80/tcp + * @return an {@link ExposedPort} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static ExposedPort parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split("/"); + switch (parts.length) { + case 1: + return new ExposedPort(Integer.valueOf(parts[0])); + case 2: + return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); + default: + throw new IllegalArgumentException(); + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link ExposedPort} suitable for inclusion in a JSON message. The format + * is port/protocol, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link ExposedPort} + */ + @Override + public String toString() { + return port + "/" + protocol.toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ExposedPort) { + ExposedPort other = (ExposedPort) obj; + return new EqualsBuilder().append(protocol, other.getProtocol()).append(port, other.getPort()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(protocol).append(port).toHashCode(); + } + + public static class Deserializer extends JsonDeserializer { + @Override + public ExposedPort 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 ExposedPort.parse(field.getKey()); + } else { + return null; + } + } + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + jsonGen.writeFieldName(exposedPort.toString()); + jsonGen.writeEndObject(); + } + + } } diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java index 983ad3c36..0ecb879b6 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java @@ -19,55 +19,54 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = ExposedPorts.Serializer.class) @JsonDeserialize(using = ExposedPorts.Deserializer.class) public class ExposedPorts { - private ExposedPort[] exposedPorts; + private ExposedPort[] exposedPorts; + + public ExposedPorts(ExposedPort... exposedPorts) { + this.exposedPorts = exposedPorts; + } - public ExposedPorts(ExposedPort... exposedPorts) { - this.exposedPorts = exposedPorts; - } - - public ExposedPorts(List exposedPorts) { - this.exposedPorts = exposedPorts.toArray(new ExposedPort[exposedPorts.size()]); - } + public ExposedPorts(List exposedPorts) { + this.exposedPorts = exposedPorts.toArray(new ExposedPort[exposedPorts.size()]); + } - public ExposedPort[] getExposedPorts() { - return exposedPorts; - } + public ExposedPort[] getExposedPorts() { + return exposedPorts; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) { - jsonGen.writeFieldName(exposedPort.toString()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - } - jsonGen.writeEndObject(); - } + @Override + public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) { + jsonGen.writeFieldName(exposedPort.toString()); + jsonGen.writeStartObject(); + jsonGen.writeEndObject(); + } + jsonGen.writeEndObject(); + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List exposedPorts = new ArrayList(); + List exposedPorts = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - exposedPorts.add(ExposedPort.parse(field.getKey())); + exposedPorts.add(ExposedPort.parse(field.getKey())); } } return new ExposedPorts(exposedPorts.toArray(new ExposedPort[0])); 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 175b56830..1be92f9b6 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -7,6 +7,7 @@ */ public class Frame { private final StreamType streamType; + private final byte[] payload; public Frame(StreamType streamType, byte[] payload) { @@ -29,8 +30,10 @@ public String toString() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; Frame frame = (Frame) o; 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 6b8cdcd45..19da56517 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -5,243 +5,241 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang.builder.ToStringBuilder; - @JsonIgnoreProperties(ignoreUnknown = true) public class HostConfig { - @JsonProperty("Binds") - private Binds binds; - - @JsonProperty("Links") - private Links links; - - @JsonProperty("LxcConf") - private LxcConf[] lxcConf; + @JsonProperty("Binds") + private Binds binds; - @JsonProperty("PortBindings") - private Ports portBindings; + @JsonProperty("Links") + private Links links; - @JsonProperty("PublishAllPorts") - private boolean publishAllPorts; + @JsonProperty("LxcConf") + private LxcConf[] lxcConf; - @JsonProperty("Privileged") - private boolean privileged; + @JsonProperty("PortBindings") + private Ports portBindings; - @JsonProperty("ReadonlyRootfs") - private boolean readonlyRootfs; + @JsonProperty("PublishAllPorts") + private boolean publishAllPorts; - @JsonProperty("Dns") - private String[] dns; + @JsonProperty("Privileged") + private boolean privileged; - @JsonProperty("DnsSearch") - private String[] dnsSearch; + @JsonProperty("ReadonlyRootfs") + private boolean readonlyRootfs; - @JsonProperty("VolumesFrom") - private VolumesFrom[] volumesFrom; + @JsonProperty("Dns") + private String[] dns; - @JsonProperty("ContainerIDFile") - private String containerIDFile; + @JsonProperty("DnsSearch") + private String[] dnsSearch; - @JsonProperty("CapAdd") - private Capability[] capAdd; + @JsonProperty("VolumesFrom") + private VolumesFrom[] volumesFrom; - @JsonProperty("CapDrop") - private Capability[] capDrop; + @JsonProperty("ContainerIDFile") + private String containerIDFile; - @JsonProperty("RestartPolicy") - private RestartPolicy restartPolicy; + @JsonProperty("CapAdd") + private Capability[] capAdd; - @JsonProperty("NetworkMode") - private String networkMode; + @JsonProperty("CapDrop") + private Capability[] capDrop; - @JsonProperty("Devices") - private Device[] devices; + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; - @JsonProperty("ExtraHosts") - private String[] extraHosts; + @JsonProperty("NetworkMode") + private String networkMode; - @JsonProperty("Ulimits") - private Ulimit[] ulimits; + @JsonProperty("Devices") + private Device[] devices; - public HostConfig() { - } + @JsonProperty("ExtraHosts") + private String[] extraHosts; - public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, - 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); - this.links = new Links(links); - this.lxcConf = lxcConf; - this.portBindings = portBindings; - this.publishAllPorts = publishAllPorts; - this.privileged = privileged; - this.readonlyRootfs = readonlyRootfs; - this.dns = dns; - this.dnsSearch = dnsSearch; - this.volumesFrom = volumesFrom; - this.containerIDFile = containerIDFile; - this.capAdd = capAdd; - this.capDrop = capDrop; - this.restartPolicy = restartPolicy; - this.networkMode = networkMode; - this.devices = devices; - this.extraHosts = extraHosts; - this.ulimits = ulimits; - } + @JsonProperty("Ulimits") + private Ulimit[] ulimits; + public HostConfig() { + } - @JsonIgnore - public Bind[] getBinds() { - return (binds == null) ? new Bind[0] : binds.getBinds(); - } + public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts, + 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); + this.links = new Links(links); + this.lxcConf = lxcConf; + this.portBindings = portBindings; + this.publishAllPorts = publishAllPorts; + this.privileged = privileged; + this.readonlyRootfs = readonlyRootfs; + this.dns = dns; + this.dnsSearch = dnsSearch; + this.volumesFrom = volumesFrom; + this.containerIDFile = containerIDFile; + this.capAdd = capAdd; + this.capDrop = capDrop; + this.restartPolicy = restartPolicy; + this.networkMode = networkMode; + this.devices = devices; + this.extraHosts = extraHosts; + this.ulimits = ulimits; + } - public LxcConf[] getLxcConf() { - return lxcConf; - } + @JsonIgnore + public Bind[] getBinds() { + return (binds == null) ? new Bind[0] : binds.getBinds(); + } - public Ports getPortBindings() { - return portBindings; - } + public LxcConf[] getLxcConf() { + return lxcConf; + } - public boolean isPublishAllPorts() { - return publishAllPorts; - } + public Ports getPortBindings() { + return portBindings; + } - public boolean isPrivileged() { - return privileged; - } + public boolean isPublishAllPorts() { + return publishAllPorts; + } - public boolean isReadonlyRootfs() { - return readonlyRootfs; - } - - public String[] getDns() { - return dns; - } - - public VolumesFrom[] getVolumesFrom() { - return volumesFrom; - } - - public String getContainerIDFile() { - return containerIDFile; - } - - public String[] getDnsSearch() { - return dnsSearch; - } - - @JsonIgnore - public Link[] getLinks() { - return (links == null) ? new Link[0] : links.getLinks(); - } - - public String getNetworkMode() { - return networkMode; - } - - public Device[] getDevices() { - return devices; - } - - public String[] getExtraHosts() { - return extraHosts; - } - - public RestartPolicy getRestartPolicy() { - return restartPolicy; - } - - public Capability[] getCapAdd() { - return capAdd; - } - - public Capability[] getCapDrop() { - return capDrop; - } - - public Ulimit[] getUlimits() { - return ulimits; - } - - @JsonIgnore - public void setBinds(Bind... binds) { - this.binds = new Binds(binds); - } - - @JsonIgnore - public void setLinks(Link... links) { - this.links = new Links(links); - } - - public void setLxcConf(LxcConf[] lxcConf) { - this.lxcConf = lxcConf; - } - - public void setPortBindings(Ports portBindings) { - this.portBindings = portBindings; - } - - public void setPublishAllPorts(boolean publishAllPorts) { - this.publishAllPorts = publishAllPorts; - } - - public void setPrivileged(boolean privileged) { - this.privileged = privileged; - } - - public void setReadonlyRootfs(boolean readonlyRootfs) { - this.readonlyRootfs = readonlyRootfs; - } - - public void setDns(String[] dns) { - this.dns = dns; - } - - public void setDnsSearch(String[] dnsSearch) { - this.dnsSearch = dnsSearch; - } - - public void setVolumesFrom(VolumesFrom[] volumesFrom) { - this.volumesFrom = volumesFrom; - } - - public void setContainerIDFile(String containerIDFile) { - this.containerIDFile = containerIDFile; - } - - public void setCapAdd(Capability[] capAdd) { - this.capAdd = capAdd; - } - - public void setCapDrop(Capability[] capDrop) { - this.capDrop = capDrop; - } - - public void setRestartPolicy(RestartPolicy restartPolicy) { - this.restartPolicy = restartPolicy; - } - - public void setNetworkMode(String networkMode) { - this.networkMode = networkMode; - } - - public void setDevices(Device[] devices) { - this.devices = devices; - } - - public void setExtraHosts(String[] extraHosts) { - this.extraHosts = extraHosts; - } - - public void setUlimits(Ulimit[] ulimits) { - this.ulimits = ulimits; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } + public boolean isPrivileged() { + return privileged; + } + + public boolean isReadonlyRootfs() { + return readonlyRootfs; + } + + public String[] getDns() { + return dns; + } + + public VolumesFrom[] getVolumesFrom() { + return volumesFrom; + } + + public String getContainerIDFile() { + return containerIDFile; + } + + public String[] getDnsSearch() { + return dnsSearch; + } + + @JsonIgnore + public Link[] getLinks() { + return (links == null) ? new Link[0] : links.getLinks(); + } + + public String getNetworkMode() { + return networkMode; + } + + public Device[] getDevices() { + return devices; + } + + public String[] getExtraHosts() { + return extraHosts; + } + + public RestartPolicy getRestartPolicy() { + return restartPolicy; + } + + public Capability[] getCapAdd() { + return capAdd; + } + + public Capability[] getCapDrop() { + return capDrop; + } + + public Ulimit[] getUlimits() { + return ulimits; + } + + @JsonIgnore + public void setBinds(Bind... binds) { + this.binds = new Binds(binds); + } + + @JsonIgnore + public void setLinks(Link... links) { + this.links = new Links(links); + } + + public void setLxcConf(LxcConf[] lxcConf) { + this.lxcConf = lxcConf; + } + + public void setPortBindings(Ports portBindings) { + this.portBindings = portBindings; + } + + public void setPublishAllPorts(boolean publishAllPorts) { + this.publishAllPorts = publishAllPorts; + } + + public void setPrivileged(boolean privileged) { + this.privileged = privileged; + } + + public void setReadonlyRootfs(boolean readonlyRootfs) { + this.readonlyRootfs = readonlyRootfs; + } + + public void setDns(String[] dns) { + this.dns = dns; + } + + public void setDnsSearch(String[] dnsSearch) { + this.dnsSearch = dnsSearch; + } + + public void setVolumesFrom(VolumesFrom[] volumesFrom) { + this.volumesFrom = volumesFrom; + } + + public void setContainerIDFile(String containerIDFile) { + this.containerIDFile = containerIDFile; + } + + public void setCapAdd(Capability[] capAdd) { + this.capAdd = capAdd; + } + + public void setCapDrop(Capability[] capDrop) { + this.capDrop = capDrop; + } + + public void setRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; + } + + public void setNetworkMode(String networkMode) { + this.networkMode = networkMode; + } + + public void setDevices(Device[] devices) { + this.devices = devices; + } + + 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/Identifier.java b/src/main/java/com/github/dockerjava/api/model/Identifier.java index 498104e29..96daab11a 100644 --- a/src/main/java/com/github/dockerjava/api/model/Identifier.java +++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.model; - import com.google.common.base.Objects; import com.google.common.base.Optional; @@ -9,51 +8,46 @@ */ public class Identifier { public final Repository repository; + public final Optional tag; public Identifier(Repository repository, String tag) { this.repository = repository; - if( tag == null ) + if (tag == null) this.tag = Optional.absent(); else this.tag = Optional.of(tag); } - /** - * Return an identifier that correctly splits up the repository and tag. - * There can be > 1 ":" - * fred/jim --> fred/jim, [] - * fred/jim:123 --> fred/jim, 123 - * fred:123/jim:123 --> fred:123/jim, 123 + * Return an identifier that correctly splits up the repository and tag. There can be > 1 ":" fred/jim --> + * fred/jim, [] fred/jim:123 --> fred/jim, 123 fred:123/jim:123 --> fred:123/jim, 123 * * - * @param identifier as a string + * @param identifier + * as a string * @return parsed identifier. */ public static Identifier fromCompoundString(String identifier) { String[] parts = identifier.split("/"); - if( parts.length != 2 ) { + if (parts.length != 2) { String[] rhs = identifier.split(":"); - if( rhs.length != 2 ) - return new Identifier( new Repository(identifier), null); + if (rhs.length != 2) + return new Identifier(new Repository(identifier), null); else - return new Identifier( new Repository(rhs[0]), rhs[1]); + return new Identifier(new Repository(rhs[0]), rhs[1]); } String[] rhs = parts[1].split(":"); - if( rhs.length != 2 ) - return new Identifier( new Repository(identifier), null); + if (rhs.length != 2) + return new Identifier(new Repository(identifier), null); - return new Identifier( new Repository(parts[0] + "/" + rhs[0]), rhs[1]); + return new Identifier(new Repository(parts[0] + "/" + rhs[0]), rhs[1]); } @Override public String toString() { - return Objects.toStringHelper(this) - .add("repository", repository) - .add("tag", tag) - .toString(); + return Objects.toStringHelper(this).add("repository", repository).add("tag", tag).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/Image.java b/src/main/java/com/github/dockerjava/api/model/Image.java index 8c694daba..9df8aacef 100644 --- a/src/main/java/com/github/dockerjava/api/model/Image.java +++ b/src/main/java/com/github/dockerjava/api/model/Image.java @@ -13,16 +13,16 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Image { - @JsonProperty("Created") - private long created; + @JsonProperty("Created") + private long created; - @JsonProperty("Id") + @JsonProperty("Id") private String id; - @JsonProperty("ParentId") - private String parentId; + @JsonProperty("ParentId") + private String parentId; - @JsonProperty("RepoTags") + @JsonProperty("RepoTags") private String[] repoTags; @JsonProperty("Size") 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 bf96b9fc1..5ff53a597 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -20,173 +20,173 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Info { - @JsonProperty("Containers") - private int containers; - - @JsonProperty("Debug") - private boolean debug; - - @JsonProperty("DockerRootDir") - private String DockerRootDir; - - @JsonProperty("Driver") - private String driver; - - @JsonProperty("DriverStatus") - private List driverStatuses; - - @JsonProperty("ExecutionDriver") - private String executionDriver; - - @JsonProperty("ID") - private String ID; - - @JsonProperty("IPv4Forwarding") - private boolean IPv4Forwarding; - - @JsonProperty("Images") - private int images; - - @JsonProperty("IndexServerAddress") - private String IndexServerAddress; - - @JsonProperty("InitPath") - private String initPath; - - @JsonProperty("InitSha1") - private String initSha1; - - @JsonProperty("KernelVersion") - private String kernelVersion; - - @JsonProperty("Labels") - private String[] Labels; - - @JsonProperty("MemoryLimit") - private boolean memoryLimit; - - @JsonProperty("MemTotal") - private long memTotal; - - @JsonProperty("Name") - private String name; - - @JsonProperty("NCPU") - private int NCPU; - - @JsonProperty("NEventsListener") - private long nEventListener; - - @JsonProperty("NFd") - private int NFd; - - @JsonProperty("NGoroutines") - private int NGoroutines; - - @JsonProperty("OperatingSystem") - private String OperatingSystem; - - @JsonProperty("Sockets") - private String[] sockets; - - @JsonProperty("SwapLimit") - private boolean swapLimit; - - public boolean isDebug() { - return debug; - } - - public int getContainers() { - return containers; - } - - public String getDockerRootDir() { - return DockerRootDir; - } - - public String getDriver() { - return driver; - } - - public List getDriverStatuses() { - return driverStatuses; - } - - public int getImages() { - return images; - } - - public String getID() { - return ID; - } - - public boolean getIPv4Forwarding() { - return IPv4Forwarding; - } - - public String getIndexServerAddress() { - return IndexServerAddress; - } - - public String getInitPath() { - return initPath; - } - - public String getInitSha1() { - return initSha1; - } - - public String getKernelVersion() { - return kernelVersion; - } - - public String[] getLabels() { - return Labels; - } - - public String[] getSockets() { - return sockets; - } - - public boolean isMemoryLimit() { - return memoryLimit; - } - - public long getnEventListener() { - return nEventListener; - } - - public long getMemTotal() { - return memTotal; - } - - public String getName() { - return name; - } - - public int getNCPU() { - return NCPU; - } - - public int getNFd() { - return NFd; - } - - public int getNGoroutines() { - return NGoroutines; - } - - public String getOperatingSystem() { - return OperatingSystem; - } - - public boolean getSwapLimit() { - return swapLimit; - } - - public String getExecutionDriver() { - return executionDriver; - } + @JsonProperty("Containers") + private int containers; + + @JsonProperty("Debug") + private boolean debug; + + @JsonProperty("DockerRootDir") + private String DockerRootDir; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("DriverStatus") + private List driverStatuses; + + @JsonProperty("ExecutionDriver") + private String executionDriver; + + @JsonProperty("ID") + private String ID; + + @JsonProperty("IPv4Forwarding") + private boolean IPv4Forwarding; + + @JsonProperty("Images") + private int images; + + @JsonProperty("IndexServerAddress") + private String IndexServerAddress; + + @JsonProperty("InitPath") + private String initPath; + + @JsonProperty("InitSha1") + private String initSha1; + + @JsonProperty("KernelVersion") + private String kernelVersion; + + @JsonProperty("Labels") + private String[] Labels; + + @JsonProperty("MemoryLimit") + private boolean memoryLimit; + + @JsonProperty("MemTotal") + private long memTotal; + + @JsonProperty("Name") + private String name; + + @JsonProperty("NCPU") + private int NCPU; + + @JsonProperty("NEventsListener") + private long nEventListener; + + @JsonProperty("NFd") + private int NFd; + + @JsonProperty("NGoroutines") + private int NGoroutines; + + @JsonProperty("OperatingSystem") + private String OperatingSystem; + + @JsonProperty("Sockets") + private String[] sockets; + + @JsonProperty("SwapLimit") + private boolean swapLimit; + + public boolean isDebug() { + return debug; + } + + public int getContainers() { + return containers; + } + + public String getDockerRootDir() { + return DockerRootDir; + } + + public String getDriver() { + return driver; + } + + public List getDriverStatuses() { + return driverStatuses; + } + + public int getImages() { + return images; + } + + public String getID() { + return ID; + } + + public boolean getIPv4Forwarding() { + return IPv4Forwarding; + } + + public String getIndexServerAddress() { + return IndexServerAddress; + } + + public String getInitPath() { + return initPath; + } + + public String getInitSha1() { + return initSha1; + } + + public String getKernelVersion() { + return kernelVersion; + } + + public String[] getLabels() { + return Labels; + } + + public String[] getSockets() { + return sockets; + } + + public boolean isMemoryLimit() { + return memoryLimit; + } + + public long getnEventListener() { + return nEventListener; + } + + public long getMemTotal() { + return memTotal; + } + + public String getName() { + return name; + } + + public int getNCPU() { + return NCPU; + } + + public int getNFd() { + return NFd; + } + + public int getNGoroutines() { + return NGoroutines; + } + + public String getOperatingSystem() { + return OperatingSystem; + } + + public boolean getSwapLimit() { + return swapLimit; + } + + public String getExecutionDriver() { + return executionDriver; + } @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java index 96c215245..65df8cf6f 100644 --- a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java +++ b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.model; - /** * The IP protocols supported by Docker. * @@ -8,42 +7,43 @@ * @see #UDP */ public enum InternetProtocol { - /** The Transmission Control Protocol */ - TCP, + /** The Transmission Control Protocol */ + TCP, + + /** The User Datagram Protocol */ + UDP; - /** The User Datagram Protocol */ - UDP; - - /** - * The default {@link InternetProtocol}: {@link #TCP} - */ - public static final InternetProtocol DEFAULT = TCP; + /** + * The default {@link InternetProtocol}: {@link #TCP} + */ + public static final InternetProtocol DEFAULT = TCP; - /** - * Returns a string representation of this {@link InternetProtocol} suitable - * for inclusion in a JSON message. - * The output is the lowercased name of the Protocol, e.g. tcp. - * - * @return a string representation of this {@link InternetProtocol} - */ - @Override - public String toString() { - return super.toString().toLowerCase(); - } + /** + * Returns a string representation of this {@link InternetProtocol} suitable for inclusion in a JSON message. The + * output is the lowercased name of the Protocol, e.g. tcp. + * + * @return a string representation of this {@link InternetProtocol} + */ + @Override + public String toString() { + return super.toString().toLowerCase(); + } - /** - * Parses a string to an {@link InternetProtocol}. - * - * @param serialized the protocol, e.g. tcp or TCP - * @return an {@link InternetProtocol} described by the string - * @throws IllegalArgumentException if the argument cannot be parsed - */ - public static InternetProtocol parse(String serialized) throws IllegalArgumentException { - try { - return valueOf(serialized.toUpperCase()); - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Protocol '" + serialized + "'"); - } - } + /** + * Parses a string to an {@link InternetProtocol}. + * + * @param serialized + * the protocol, e.g. tcp or TCP + * @return an {@link InternetProtocol} described by the string + * @throws IllegalArgumentException + * if the argument cannot be parsed + */ + public static InternetProtocol parse(String serialized) throws IllegalArgumentException { + try { + return valueOf(serialized.toUpperCase()); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Protocol '" + serialized + "'"); + } + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Link.java b/src/main/java/com/github/dockerjava/api/model/Link.java index ab8485a36..0b2c828f3 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -4,104 +4,94 @@ import org.apache.commons.lang.builder.HashCodeBuilder; /** - * Represents a network link between two Docker containers. - * The container with the name {@link #getName()} is made available in the - * target container with the aliased name {@link #getAlias()}. - * This involves creating an entry in /etc/hosts and some environment - * variables in the target container as well as creating a network bridge between - * both containers. + * Represents a network link between two Docker containers. The container with the name {@link #getName()} is made + * available in the target container with the aliased name {@link #getAlias()}. This involves creating an entry in + * /etc/hosts and some environment variables in the target container as well as creating a network bridge + * between both containers. */ -public class Link -{ +public class Link { - private final String name; + private final String name; - private final String alias; + private final String alias; - /** - * Creates a {@link Link} for the container with the given name and an aliased - * name for use in the target container. - * - * @param name the name of the container that you want to link into the target - * container - * @param alias the aliased name under which the linked container will be available - * in the target container - */ - public Link(final String name, final String alias) - { - this.name = name; - this.alias = alias; - } + /** + * Creates a {@link Link} for the container with the given name and an aliased name for use in the target container. + * + * @param name + * the name of the container that you want to link into the target container + * @param alias + * the aliased name under which the linked container will be available in the target container + */ + public Link(final String name, final String alias) { + this.name = name; + this.alias = alias; + } - /** - * @return the name of the container that is linked into the target container - */ - public String getName() - { - return name; - } + /** + * @return the name of the container that is linked into the target container + */ + public String getName() { + return name; + } - /** - * @return the aliased name under which the linked container will be available - * in the target container - */ - public String getAlias() - { - return alias; - } + /** + * @return the aliased name under which the linked container will be available in the target container + */ + public String getAlias() { + return alias; + } - /** - * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. - * - * @param serialized the specification, e.g. name:alias or /name1:/name2/alias - * @return a {@link Link} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static Link parse(final String serialized) throws IllegalArgumentException - { - try { - final String[] parts = serialized.split(":"); - switch (parts.length) { - case 2: { - String[] nameSplit = parts[0].split("/"); - String[] aliasSplit = parts[1].split("/"); - return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); - } - default: { - throw new IllegalArgumentException(); - } - } - } catch (final Exception e) { - throw new IllegalArgumentException("Error parsing Link '" + serialized + "'"); - } - } + /** + * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. + * + * @param serialized + * the specification, e.g. name:alias or /name1:/name2/alias + * @return a {@link Link} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static Link parse(final String serialized) throws IllegalArgumentException { + try { + final String[] parts = serialized.split(":"); + switch (parts.length) { + case 2: { + String[] nameSplit = parts[0].split("/"); + String[] aliasSplit = parts[1].split("/"); + return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); + } + default: { + throw new IllegalArgumentException(); + } + } + } catch (final Exception e) { + throw new IllegalArgumentException("Error parsing Link '" + serialized + "'"); + } + } - @Override - public boolean equals(final Object obj) - { - if (obj instanceof Link) { - final Link other = (Link) obj; - return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); - } else - return super.equals(obj); - } + @Override + public boolean equals(final Object obj) { + if (obj instanceof Link) { + final Link other = (Link) obj; + return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); + } else + return super.equals(obj); + } - @Override - public int hashCode() - { - return new HashCodeBuilder().append(name).append(alias).toHashCode(); - } + @Override + public int hashCode() { + return new HashCodeBuilder().append(name).append(alias).toHashCode(); + } - /** - * Returns a string representation of this {@link Link} suitable - * for inclusion in a JSON message. - * The format is name:alias, like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link Link} - */ - @Override - public String toString() { - return name + ":" + alias; - } + /** + * Returns a string representation of this {@link Link} suitable for inclusion in a JSON message. The format is + * name:alias, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link Link} + */ + @Override + public String toString() { + return name + ":" + alias; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java index 888c0aa2c..2d678b3a3 100644 --- a/src/main/java/com/github/dockerjava/api/model/Links.java +++ b/src/main/java/com/github/dockerjava/api/model/Links.java @@ -1,4 +1,3 @@ - package com.github.dockerjava.api.model; import java.io.IOException; @@ -21,58 +20,53 @@ @JsonSerialize(using = Links.Serializer.class) @JsonDeserialize(using = Links.Deserializer.class) -public class Links -{ +public class Links { - private final Link[] links; + private final Link[] links; - public Links(final Link... links) - { - this.links = links; - } + public Links(final Link... links) { + this.links = links; + } - public Links(final List links) { - this.links = links.toArray(new Link[links.size()]); - } + public Links(final List links) { + this.links = links.toArray(new Link[links.size()]); + } - public Link[] getLinks() - { - return links; - } + public Link[] getLinks() { + return links; + } - public static class Serializer extends JsonSerializer - { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) throws IOException, JsonProcessingException - { - jsonGen.writeStartArray(); - for (final Link link : links.getLinks()) { - jsonGen.writeString(link.toString()); - } - jsonGen.writeEndArray(); - } + @Override + public void serialize(final Links links, final JsonGenerator jsonGen, final SerializerProvider serProvider) + throws IOException, JsonProcessingException { + jsonGen.writeStartArray(); + for (final Link link : links.getLinks()) { + jsonGen.writeString(link.toString()); + } + jsonGen.writeEndArray(); + } - } + } - public static class Deserializer extends JsonDeserializer - { + public static class Deserializer extends JsonDeserializer { - @Override - public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException - { - final List binds = new ArrayList(); - final ObjectCodec oc = jsonParser.getCodec(); - final JsonNode node = oc.readTree(jsonParser); - for (final Iterator it = node.elements(); it.hasNext();) { + @Override + public Links deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + final List binds = new ArrayList(); + final ObjectCodec oc = jsonParser.getCodec(); + final JsonNode node = oc.readTree(jsonParser); + for (final Iterator it = node.elements(); it.hasNext();) { - final JsonNode element = it.next(); - if (!element.equals(NullNode.getInstance())) { - binds.add(Link.parse(element.asText())); - } - } - return new Links(binds.toArray(new Link[0])); - } - } + final JsonNode element = it.next(); + if (!element.equals(NullNode.getInstance())) { + binds.add(Link.parse(element.asText())); + } + } + return new Links(binds.toArray(new Link[0])); + } + } } diff --git a/src/main/java/com/github/dockerjava/api/model/LxcConf.java b/src/main/java/com/github/dockerjava/api/model/LxcConf.java index 67ce00cac..f97588308 100644 --- a/src/main/java/com/github/dockerjava/api/model/LxcConf.java +++ b/src/main/java/com/github/dockerjava/api/model/LxcConf.java @@ -3,36 +3,36 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class LxcConf { - @JsonProperty("Key") - public String key; + @JsonProperty("Key") + public String key; - @JsonProperty("Value") - public String value; + @JsonProperty("Value") + public String value; - public LxcConf(String key, String value) { - this.key = key; - this.value = value; - } + public LxcConf(String key, String value) { + this.key = key; + this.value = value; + } - public LxcConf() { - } + public LxcConf() { + } - public String getKey() { - return key; - } + public String getKey() { + return key; + } - public LxcConf setKey(String key) { - this.key = key; - return this; - } + public LxcConf setKey(String key) { + this.key = key; + return this; + } - public String getValue() { - return value; - } + public String getValue() { + return value; + } - public LxcConf setValue(String value) { - this.value = value; - return this; - } + public LxcConf setValue(String value) { + this.value = value; + return this; + } } diff --git a/src/main/java/com/github/dockerjava/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java index 13c91bdb1..355e83aa3 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -8,75 +8,70 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * In a {@link PortBinding}, a network socket on the Docker host, expressed - * as a {@link Binding}, is bound to an {@link ExposedPort} of a container. - * A {@link PortBinding} corresponds to the --publish - * (-p) option of the docker run (and similar) - * CLI command for adding port bindings to a container. + * In a {@link PortBinding}, a network socket on the Docker host, expressed as a {@link Binding}, is bound to an + * {@link ExposedPort} of a container. A {@link PortBinding} corresponds to the --publish (-p) + * option of the docker run (and similar) CLI command for adding port bindings to a container. *

- * Note: This is an abstraction used for creating new port bindings. - * It is not to be confused with the abstraction used for querying existing - * port bindings from a container configuration in - * {@link NetworkSettings#getPorts()} and {@link HostConfig#getPortBindings()}. - * In that context, a Map<ExposedPort, Binding[]> is used. + * Note: This is an abstraction used for creating new port bindings. It is not to be confused with the abstraction + * used for querying existing port bindings from a container configuration in {@link NetworkSettings#getPorts()} and + * {@link HostConfig#getPortBindings()}. In that context, a Map<ExposedPort, Binding[]> is used. */ public class PortBinding { - private final Binding binding; - private final ExposedPort exposedPort; + private final Binding binding; - public PortBinding(Binding binding, ExposedPort exposedPort) { - this.binding = binding; - this.exposedPort = exposedPort; - } + private final ExposedPort exposedPort; - public Binding getBinding() { - return binding; - } + public PortBinding(Binding binding, ExposedPort exposedPort) { + this.binding = binding; + this.exposedPort = exposedPort; + } - public ExposedPort getExposedPort() { - return exposedPort; - } + public Binding getBinding() { + return binding; + } - public static PortBinding parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = StringUtils.splitByWholeSeparator(serialized, ":"); - switch (parts.length) { - case 3: - // 127.0.0.1:80:8080/tcp - return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); - case 2: - // 80:8080 // 127.0.0.1::8080 - return createFromSubstrings(parts[0], parts[1]); - case 1: - // 8080 - return createFromSubstrings("", parts[0]); - default: - throw new IllegalArgumentException(); - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing PortBinding '" - + serialized + "'", e); - } - } + public ExposedPort getExposedPort() { + return exposedPort; + } - private static PortBinding createFromSubstrings(String binding, String exposedPort) - throws IllegalArgumentException { - return new PortBinding(Binding.parse(binding), ExposedPort.parse(exposedPort)); - } + public static PortBinding parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = StringUtils.splitByWholeSeparator(serialized, ":"); + switch (parts.length) { + case 3: + // 127.0.0.1:80:8080/tcp + return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); + case 2: + // 80:8080 // 127.0.0.1::8080 + return createFromSubstrings(parts[0], parts[1]); + case 1: + // 8080 + return createFromSubstrings("", parts[0]); + default: + throw new IllegalArgumentException(); + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing PortBinding '" + serialized + "'", e); + } + } - @Override - public boolean equals(Object obj) { - if (obj instanceof PortBinding) { - PortBinding other = (PortBinding) obj; - return new EqualsBuilder().append(binding, other.getBinding()) - .append(exposedPort, other.getExposedPort()).isEquals(); - } else - return super.equals(obj); - } + private static PortBinding createFromSubstrings(String binding, String exposedPort) throws IllegalArgumentException { + return new PortBinding(Binding.parse(binding), ExposedPort.parse(exposedPort)); + } - @Override - public int hashCode() { - return new HashCodeBuilder().append(binding).append(exposedPort).toHashCode(); - } + @Override + public boolean equals(Object obj) { + if (obj instanceof PortBinding) { + PortBinding other = (PortBinding) obj; + return new EqualsBuilder().append(binding, other.getBinding()).append(exposedPort, other.getExposedPort()) + .isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(binding).append(exposedPort).toHashCode(); + } } 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 0c2df94ad..13c6ff649 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -28,13 +28,10 @@ import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; /** - * A container for port bindings, made available as a {@link Map} via its - * {@link #getBindings()} method. - *

- * Note: This is an abstraction used for querying existing port bindings from - * a container configuration. - * It is not to be confused with the {@link PortBinding} abstraction used for - * adding new port bindings to a container. + * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. + *

+ * Note: This is an abstraction used for querying existing port bindings from a container configuration. It is not to + * be confused with the {@link PortBinding} abstraction used for adding new port bindings to a container. * * @see HostConfig#getPortBindings() * @see NetworkSettings#getPorts() @@ -46,29 +43,27 @@ public class Ports { private final Map ports = new HashMap(); /** - * Creates a {@link Ports} object with no {@link PortBinding}s. - * Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} - * to add {@link PortBinding}s. + * Creates a {@link Ports} object with no {@link PortBinding}s. Use {@link #bind(ExposedPort, Binding)} or + * {@link #add(PortBinding...)} to add {@link PortBinding}s. */ - public Ports() { } + public Ports() { + } /** - * Creates a {@link Ports} object with an initial {@link PortBinding} for - * the specified {@link ExposedPort} and {@link Binding}. - * Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} - * to add more {@link PortBinding}s. + * Creates a {@link Ports} object with an initial {@link PortBinding} for the specified {@link ExposedPort} and + * {@link Binding}. Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} to add more + * {@link PortBinding}s. */ public Ports(ExposedPort exposedPort, Binding host) { - bind(exposedPort, host); + bind(exposedPort, host); } - + public Ports(PortBinding... portBindings) { - add(portBindings); + add(portBindings); } /** - * Adds a new {@link PortBinding} for the specified {@link ExposedPort} and - * {@link Binding} to the current bindings. + * Adds a new {@link PortBinding} for the specified {@link ExposedPort} and {@link Binding} to the current bindings. */ public void bind(ExposedPort exposedPort, Binding binding) { if (ports.containsKey(exposedPort)) { @@ -78,13 +73,13 @@ public void bind(ExposedPort exposedPort, Binding binding) { if (binding == null) { ports.put(exposedPort, null); } else { - ports.put(exposedPort, new Binding[]{binding}); + ports.put(exposedPort, new Binding[] { binding }); } } } /** - * Adds the specified {@link PortBinding}(s) to the list of {@link PortBinding}s. + * Adds the specified {@link PortBinding}(s) to the list of {@link PortBinding}s. */ public void add(PortBinding... portBindings) { for (PortBinding binding : portBindings) { @@ -93,54 +88,48 @@ public void add(PortBinding... portBindings) { } @Override - public String toString(){ + public String toString() { return ports.toString(); } /** - * Returns the port bindings in the format used by the Docker remote API, - * i.e. the {@link Binding}s grouped by {@link ExposedPort}. + * Returns the port bindings in the format used by the Docker remote API, i.e. the {@link Binding}s grouped by + * {@link ExposedPort}. * - * @return the port bindings as a {@link Map} that contains one or more - * {@link Binding}s per {@link ExposedPort}. + * @return the port bindings as a {@link Map} that contains one or more {@link Binding}s per {@link ExposedPort}. */ - public Map getBindings(){ + public Map getBindings() { return ports; } - -// public PortBinding[] getBindingsAsArray() { -// List bindings = new ArrayList<>(); -// for(Map.Entry entry: ports.entrySet()) { -// for(Ports.Binding binding : entry.getValue()) { -// bindings.add(new PortBinding(binding, entry.getKey())); -// } -// } -// return bindings.toArray(new PortBinding[bindings.size()]); -// } + + // public PortBinding[] getBindingsAsArray() { + // List bindings = new ArrayList<>(); + // for(Map.Entry entry: ports.entrySet()) { + // for(Ports.Binding binding : entry.getValue()) { + // bindings.add(new PortBinding(binding, entry.getKey())); + // } + // } + // return bindings.toArray(new PortBinding[bindings.size()]); + // } /** * Creates a {@link Binding} for the given IP address and port number. */ public static Binding Binding(String hostIp, Integer hostPort) { - return new Binding(hostIp, hostPort); + return new Binding(hostIp, hostPort); } /** - * Creates a {@link Binding} for the given port number, leaving the - * IP address undefined. + * Creates a {@link Binding} for the given port number, leaving the IP address undefined. */ public static Binding Binding(Integer hostPort) { - return new Binding(hostPort); + return new Binding(hostPort); } - /** - * A {@link Binding} represents a socket on the Docker host that is - * used in a {@link PortBinding}. - * It is characterized by an {@link #getHostIp() IP address} and a - * {@link #getHostPort() port number}. - * Both properties may be null in order to let Docker assign - * them dynamically/using defaults. + * A {@link Binding} represents a socket on the Docker host that is used in a {@link PortBinding}. It is + * characterized by an {@link #getHostIp() IP address} and a {@link #getHostPort() port number}. Both properties may + * be null in order to let Docker assign them dynamically/using defaults. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -152,8 +141,8 @@ public static class Binding { private final Integer hostPort; /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address} - * and {@link #getHostPort() port number}. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address} and {@link #getHostPort() port + * number}. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -164,8 +153,8 @@ public Binding(String hostIp, Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostPort() port number}, - * leaving the {@link #getHostIp() IP address} undefined. + * Creates a {@link Binding} for the given {@link #getHostPort() port number}, leaving the {@link #getHostIp() + * IP address} undefined. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -175,33 +164,31 @@ public Binding(Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, - * leaving the {@link #getHostPort() port number} undefined. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, leaving the {@link #getHostPort() + * port number} undefined. */ public Binding(String hostIp) { this(hostIp, null); } /** - * Creates a {@link Binding} with both {@link #getHostIp() IP address} and - * {@link #getHostPort() port number} undefined. + * Creates a {@link Binding} with both {@link #getHostIp() IP address} and {@link #getHostPort() port number} + * undefined. */ public Binding() { this(null, null); } /** - * @return the IP address on the Docker host. - * May be null, in which case Docker will bind the - * port to all interfaces (0.0.0.0). + * @return the IP address on the Docker host. May be null, in which case Docker will bind the port + * to all interfaces (0.0.0.0). */ public String getHostIp() { return hostIp; } /** - * @return the port number on the Docker host. - * May be null, in which case Docker will dynamically + * @return the port number on the Docker host. May be null, in which case Docker will dynamically * assign a port. */ public Integer getHostPort() { @@ -209,15 +196,15 @@ public Integer getHostPort() { } /** - * Parses a textual host and port specification (as used by the Docker CLI) - * to a {@link Binding}. + * Parses a textual host and port specification (as used by the Docker CLI) to a {@link Binding}. *

* Legal syntax: IP|IP:port|port * - * @param serialized serialized the specification, e.g. - * 127.0.0.1:80 + * @param serialized + * serialized the specification, e.g. 127.0.0.1:80 * @return a {@link Binding} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed + * @throws IllegalArgumentException + * if the specification cannot be parsed */ public static Binding parse(String serialized) throws IllegalArgumentException { try { @@ -231,23 +218,20 @@ public static Binding parse(String serialized) throws IllegalArgumentException { return new Binding(parts[0], Integer.valueOf(parts[1])); } case 1: { - return parts[0].contains(".") ? new Binding(parts[0]) - : new Binding(Integer.valueOf(parts[0])); + return parts[0].contains(".") ? new Binding(parts[0]) : new Binding(Integer.valueOf(parts[0])); } default: { throw new IllegalArgumentException(); } } } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Binding '" - + serialized + "'"); + throw new IllegalArgumentException("Error parsing Binding '" + serialized + "'"); } } /** - * Returns a string representation of this {@link Binding} suitable - * for inclusion in a JSON message. - * The format is [IP:]Port, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link Binding} suitable for inclusion in a JSON message. The format + * is [IP:]Port, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link Binding} */ @@ -256,7 +240,7 @@ public String toString() { if (isEmpty(hostIp)) { return Integer.toString(hostPort); } else if (hostPort == null) { - return hostIp; + return hostIp; } else { return hostIp + ":" + hostPort; } @@ -264,20 +248,19 @@ public String toString() { @Override public boolean equals(Object obj) { - if(obj instanceof Binding) { - Binding other = (Binding) obj; - return new EqualsBuilder() - .append(hostIp, other.getHostIp()) - .append(hostPort, other.getHostPort()).isEquals(); - } else - return super.equals(obj); + if (obj instanceof Binding) { + Binding other = (Binding) obj; + return new EqualsBuilder().append(hostIp, other.getHostIp()).append(hostPort, other.getHostPort()) + .isEquals(); + } else + return super.equals(obj); } } - public static class Deserializer extends JsonDeserializer { @Override - public Ports deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Ports deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { Ports out = new Ports(); ObjectCodec oc = jsonParser.getCodec(); @@ -306,18 +289,19 @@ public Ports deserialize(JsonParser jsonParser, DeserializationContext deseriali public static class Serializer extends JsonSerializer { @Override - public void serialize(Ports portBindings, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, JsonProcessingException { + public void serialize(Ports portBindings, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { jsonGen.writeStartObject(); - for(Entry entry : portBindings.getBindings().entrySet()){ + for (Entry entry : portBindings.getBindings().entrySet()) { jsonGen.writeFieldName(entry.getKey().toString()); 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.writeStringField("HostPort", binding.getHostPort() == null ? "" : binding.getHostPort() + .toString()); jsonGen.writeEndObject(); } jsonGen.writeEndArray(); diff --git a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java index 4a3a0b507..cd49e846e 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullEventStreamItem.java @@ -9,12 +9,12 @@ /** * Represents an item returned from pull */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class PullEventStreamItem implements Serializable { - private static final long serialVersionUID = -5187169652557467828L; + private static final long serialVersionUID = -5187169652557467828L; - @JsonProperty("status") + @JsonProperty("status") private String status; @JsonProperty("progress") @@ -23,7 +23,6 @@ public class PullEventStreamItem implements Serializable { @JsonProperty("progressDetail") private ProgressDetail progressDetail; - public String getStatus() { return status; } @@ -36,12 +35,11 @@ public ProgressDetail getProgressDetail() { return progressDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ProgressDetail implements Serializable { @JsonProperty("current") int current; - @Override public String toString() { return "current " + current; @@ -50,10 +48,7 @@ public String toString() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("status", status) - .add("progress", progress) - .add("progressDetail", progressDetail) - .toString(); + return Objects.toStringHelper(this).add("status", status).add("progress", progress) + .add("progressDetail", progressDetail).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index c8aac4c9c..e022f0c1a 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -10,12 +10,12 @@ /** * Represents an item returned from push */ -@JsonIgnoreProperties(ignoreUnknown=true) +@JsonIgnoreProperties(ignoreUnknown = true) public class PushEventStreamItem implements Serializable { - private static final long serialVersionUID = -5187169652557467828L; + private static final long serialVersionUID = -5187169652557467828L; - @JsonProperty("status") + @JsonProperty("status") private String status; @JsonProperty("progress") @@ -24,7 +24,6 @@ public class PushEventStreamItem implements Serializable { @JsonProperty("progressDetail") private ProgressDetail progressDetail; - public String getStatus() { return status; } @@ -37,12 +36,11 @@ public ProgressDetail getProgressDetail() { return progressDetail; } - @JsonIgnoreProperties(ignoreUnknown=true) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ProgressDetail implements Serializable { @JsonProperty("current") int current; - @Override public String toString() { return "current " + current; @@ -51,10 +49,7 @@ public String toString() { @Override public String toString() { - return Objects.toStringHelper(this) - .add("status", status) - .add("progress", progress) - .add("progressDetail", progressDetail) - .toString(); + return Objects.toStringHelper(this).add("status", status).add("progress", progress) + .add("progressDetail", progressDetail).toString(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/Repository.java b/src/main/java/com/github/dockerjava/api/model/Repository.java index 673eabee2..cdfead739 100644 --- a/src/main/java/com/github/dockerjava/api/model/Repository.java +++ b/src/main/java/com/github/dockerjava/api/model/Repository.java @@ -13,15 +13,17 @@ public class Repository { /** * Name may be eg. 'busybox' or '10.0.0.1:5000/fred' - * @param name Repository name + * + * @param name + * Repository name */ public Repository(String name) { this.name = name; } /** - * Return the URL portion (repository). - * Note that this might not actually BE a repository location. + * Return the URL portion (repository). Note that this might not actually BE a repository location. + * * @return * @throws java.net.MalformedURLException */ @@ -31,16 +33,13 @@ public URL getURL() throws MalformedURLException { @Override public String toString() { - return Objects.toStringHelper(this) - .add("name", name) - .toString(); + return Objects.toStringHelper(this).add("name", name).toString(); } - public String getPath() { - if( !name.contains("/") ) + if (!name.contains("/")) return name; - return name.substring(name.indexOf("/") + 1 ); + return name.substring(name.indexOf("/") + 1); } } diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index bb933f18a..e96821cf1 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -11,15 +11,17 @@ * Container restart policy * *

- *
no
- *
Do not restart the container if it dies. (default)
- * - *
on-failure
- *
Restart the container if it exits with a non-zero exit code. - * Can also accept an optional maximum restart count (e.g. on-failure:5).
- * - *
always
- *
Always restart the container no matter what exit code is returned.
+ *
no
+ *
Do not restart the container if it dies. (default)
+ * + *
on-failure
+ *
Restart the container if it exits with a non-zero exit code. Can also accept an optional maximum restart count + * (e.g. on-failure:5). + *
+ * + *
always
+ *
Always restart the container no matter what exit code is returned. + *
*
* * @author marcus @@ -27,110 +29,108 @@ */ public class RestartPolicy { - @JsonProperty("MaximumRetryCount") - private int maximumRetryCount = 0; - - @JsonProperty("Name") - private String name = ""; - - public RestartPolicy() { - } - - private RestartPolicy(int maximumRetryCount, String name) { - checkNotNull(name, "name is null"); - this.maximumRetryCount = maximumRetryCount; - this.name = name; - } - - /** - * Do not restart the container if it dies. (default) - */ - public static RestartPolicy noRestart() { - return new RestartPolicy(); - } - - /** - * Always restart the container no matter what exit code is returned. - */ - public static RestartPolicy alwaysRestart() { - return new RestartPolicy(0, "always"); - } - - /** - * Restart the container if it exits with a non-zero exit code. - * - * @param maximumRetryCount the maximum number of restarts. - * Set to 0 for unlimited retries. - */ - public static RestartPolicy onFailureRestart(int maximumRetryCount) { - return new RestartPolicy(maximumRetryCount, "on-failure"); - } - - public int getMaximumRetryCount() { - return maximumRetryCount; - } - - public String getName() { - return name; - } - - /** - * Parses a textual restart polixy specification (as used by the Docker CLI) - * to a {@link RestartPolicy}. - * - * @param serialized the specification, e.g. on-failure:2 - * @return a {@link RestartPolicy} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static RestartPolicy parse(String serialized) throws IllegalArgumentException { - try { - String[] parts = serialized.split(":"); - String name = parts[0]; - if ("no".equals(name)) - return noRestart(); - if ("always".equals(name)) - return alwaysRestart(); - if ("on-failure".equals(name)) { - int count = 0; - if (parts.length == 2) { - count = Integer.parseInt(parts[1]); - } - return onFailureRestart(count); - } - throw new IllegalArgumentException(); - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); - } - } - - /** - * Returns a string representation of this {@link RestartPolicy}. - * The format is name[:count], like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link RestartPolicy} - */ - @Override - public String toString() { - String result = name.isEmpty() ? "no" : name; - return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof RestartPolicy) { - RestartPolicy other = (RestartPolicy) obj; - return new EqualsBuilder() - .append(maximumRetryCount, other.getMaximumRetryCount()) - .append(name, other.getName()) - .isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(maximumRetryCount) - .append(name).toHashCode(); - } + @JsonProperty("MaximumRetryCount") + private int maximumRetryCount = 0; + + @JsonProperty("Name") + private String name = ""; + + public RestartPolicy() { + } + + private RestartPolicy(int maximumRetryCount, String name) { + checkNotNull(name, "name is null"); + this.maximumRetryCount = maximumRetryCount; + this.name = name; + } + + /** + * Do not restart the container if it dies. (default) + */ + public static RestartPolicy noRestart() { + return new RestartPolicy(); + } + + /** + * Always restart the container no matter what exit code is returned. + */ + public static RestartPolicy alwaysRestart() { + return new RestartPolicy(0, "always"); + } + + /** + * Restart the container if it exits with a non-zero exit code. + * + * @param maximumRetryCount + * the maximum number of restarts. Set to 0 for unlimited retries. + */ + public static RestartPolicy onFailureRestart(int maximumRetryCount) { + return new RestartPolicy(maximumRetryCount, "on-failure"); + } + + public int getMaximumRetryCount() { + return maximumRetryCount; + } + + public String getName() { + return name; + } + + /** + * Parses a textual restart polixy specification (as used by the Docker CLI) to a {@link RestartPolicy}. + * + * @param serialized + * the specification, e.g. on-failure:2 + * @return a {@link RestartPolicy} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static RestartPolicy parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split(":"); + String name = parts[0]; + if ("no".equals(name)) + return noRestart(); + if ("always".equals(name)) + return alwaysRestart(); + if ("on-failure".equals(name)) { + int count = 0; + if (parts.length == 2) { + count = Integer.parseInt(parts[1]); + } + return onFailureRestart(count); + } + throw new IllegalArgumentException(); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link RestartPolicy}. The format is name[:count], like the + * argument in {@link #parse(String)}. + * + * @return a string representation of this {@link RestartPolicy} + */ + @Override + public String toString() { + String result = name.isEmpty() ? "no" : name; + return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof RestartPolicy) { + RestartPolicy other = (RestartPolicy) obj; + return new EqualsBuilder().append(maximumRetryCount, other.getMaximumRetryCount()) + .append(name, other.getName()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(maximumRetryCount).append(name).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java index ff1d6dc95..f6acf16ee 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -12,38 +12,38 @@ */ @JsonIgnoreProperties(ignoreUnknown = true) public class Statistics { - + @JsonProperty("read") private String read; - + @JsonProperty("network") - private Map networkStats; + private Map networkStats; @JsonProperty("memory_stats") - private Map memoryStats; - + private Map memoryStats; + @JsonProperty("blkio_stats") - private Map blkioStats; - + private Map blkioStats; + @JsonProperty("cpu_stats") - private Map cpuStats; + private Map cpuStats; - public Map getNetworkStats() { + public Map getNetworkStats() { return networkStats; } - - public Map getCpuStats() { + + public Map getCpuStats() { return cpuStats; } - - public Map getMemoryStats() { + + public Map getMemoryStats() { return memoryStats; } - - public Map getBlkioStats() { + + public Map getBlkioStats() { return blkioStats; } - + @Override public String toString() { return ToStringBuilder.reflectionToString(this); 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 0040c1bc8..5dd648109 100644 --- a/src/main/java/com/github/dockerjava/api/model/StreamType.java +++ b/src/main/java/com/github/dockerjava/api/model/StreamType.java @@ -1,8 +1,5 @@ package com.github.dockerjava.api.model; public enum StreamType { - STDIN, - STDOUT, - STDERR, - RAW + STDIN, STDOUT, STDERR, RAW } diff --git a/src/main/java/com/github/dockerjava/api/model/Ulimit.java b/src/main/java/com/github/dockerjava/api/model/Ulimit.java index d5fac09c1..3d8fc432f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -12,7 +12,7 @@ public class Ulimit { @JsonProperty("Name") - private String name ; + private String name; @JsonProperty("Soft") private int soft; @@ -48,9 +48,7 @@ public int getHard() { public boolean equals(Object obj) { if (obj instanceof Ulimit) { Ulimit other = (Ulimit) obj; - return new EqualsBuilder() - .append(name, other.getName()) - .append(soft, other.getSoft()) + return new EqualsBuilder().append(name, other.getName()).append(soft, other.getSoft()) .append(hard, other.getHard()).isEquals(); } else return super.equals(obj); diff --git a/src/main/java/com/github/dockerjava/api/model/Version.java b/src/main/java/com/github/dockerjava/api/model/Version.java index 4e02e2c05..3318fc5b1 100644 --- a/src/main/java/com/github/dockerjava/api/model/Version.java +++ b/src/main/java/com/github/dockerjava/api/model/Version.java @@ -12,25 +12,25 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Version { - @JsonProperty("ApiVersion") - private String apiVersion; + @JsonProperty("ApiVersion") + private String apiVersion; - @JsonProperty("Arch") - private String arch; + @JsonProperty("Arch") + private String arch; - @JsonProperty("GitCommit") - private String gitCommit; + @JsonProperty("GitCommit") + private String gitCommit; - @JsonProperty("GoVersion") - private String goVersion; + @JsonProperty("GoVersion") + private String goVersion; - @JsonProperty("KernelVersion") - private String kernelVersion; + @JsonProperty("KernelVersion") + private String kernelVersion; - @JsonProperty("Os") - private String operatingSystem; + @JsonProperty("Os") + private String operatingSystem; - @JsonProperty("Version") + @JsonProperty("Version") private String version; public String getVersion() { @@ -53,13 +53,13 @@ public String getArch() { return arch; } - public String getOperatingSystem() { + public String getOperatingSystem() { return operatingSystem; } public String getApiVersion() { - return apiVersion; - } + return apiVersion; + } @Override public String 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 131a9a56f..8bc7f2fba 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -26,33 +26,33 @@ */ public class Volume { - private String path; - - public Volume(String path) { - this.path = path; - } - - public String getPath() { - return path; - } - - @Override - public String toString() { - return getPath(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Volume) { - Volume other = (Volume) obj; - return new EqualsBuilder().append(path, other.getPath()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(path).toHashCode(); - } + private String path; + + public Volume(String path) { + this.path = path; + } + + public String getPath() { + return path; + } + + @Override + public String toString() { + return getPath(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Volume) { + Volume other = (Volume) obj; + return new EqualsBuilder().append(path, other.getPath()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(path).toHashCode(); + } } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java index 41028b6dc..cf9c077ab 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java @@ -2,9 +2,10 @@ public class VolumeBind { private final String hostPath; + private final String containerPath; - public VolumeBind(String hostPath, String containerPath){ + public VolumeBind(String hostPath, String containerPath) { this.hostPath = hostPath; this.containerPath = containerPath; } 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 e23ddc9e8..3d2abee45 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java @@ -36,18 +36,20 @@ public VolumeBind[] getBinds() { public static final class Serializer extends JsonSerializer { @Override - public void serialize(VolumeBinds value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + 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 { + public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { List binds = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); @@ -56,10 +58,11 @@ public VolumeBinds deserialize(JsonParser jsonParser, DeserializationContext des Map.Entry field = it.next(); JsonNode value = field.getValue(); if (!value.equals(NullNode.getInstance())) { - if (!value.isTextual()){ - throw deserializationContext.mappingException("Expected path for '"+field.getKey()+"'in host but got '"+ value+"'."); + if (!value.isTextual()) { + throw deserializationContext.mappingException("Expected path for '" + field.getKey() + + "'in host but got '" + value + "'."); } - VolumeBind bind = new VolumeBind(value.asText(),field.getKey()); + VolumeBind bind = new VolumeBind(value.asText(), field.getKey()); binds.add(bind); } } diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java index 717385d9e..09a2d8d6a 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -28,88 +28,82 @@ @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; - } - } - } - - + 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 b85536e10..434a0edad 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -19,58 +19,57 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; - @JsonSerialize(using = Volumes.Serializer.class) @JsonDeserialize(using = Volumes.Deserializer.class) public class Volumes { - private Volume[] volumes; + private Volume[] volumes; + + public Volumes(Volume... volumes) { + this.volumes = volumes; + } - public Volumes(Volume... volumes) { - this.volumes = volumes; - } - - public Volumes(List volumes) { - this.volumes = volumes.toArray(new Volume[volumes.size()]); - } + public Volumes(List volumes) { + this.volumes = volumes.toArray(new Volume[volumes.size()]); + } - public Volume[] getVolumes() { - return volumes; - } + public Volume[] getVolumes() { + return volumes; + } - public static class Serializer extends JsonSerializer { + public static class Serializer extends JsonSerializer { - @Override - public void serialize(Volumes volumes, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeStartObject(); - for (Volume volume : volumes.getVolumes()) { - jsonGen.writeFieldName(volume.getPath()); - jsonGen.writeStartObject(); - jsonGen.writeEndObject(); - //jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); - } - jsonGen.writeEndObject(); - } + @Override + public void serialize(Volumes volumes, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeStartObject(); + for (Volume volume : volumes.getVolumes()) { + jsonGen.writeFieldName(volume.getPath()); + jsonGen.writeStartObject(); + jsonGen.writeEndObject(); + // jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); + } + jsonGen.writeEndObject(); + } + + } - } - - public static class Deserializer extends JsonDeserializer { + public static class Deserializer extends JsonDeserializer { @Override - public Volumes deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public Volumes deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { - List volumes = new ArrayList(); + List volumes = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); for (Iterator> it = node.fields(); it.hasNext();) { Map.Entry field = it.next(); if (!field.getValue().equals(NullNode.getInstance())) { - String path = field.getKey(); - Volume volume = new Volume(path); - volumes.add(volume); + String path = field.getKey(); + Volume volume = new Volume(path); + volumes.add(volume); } } return new Volumes(volumes.toArray(new Volume[0])); diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java index 9aae9f30b..c884a633e 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -21,109 +21,104 @@ @JsonDeserialize(using = VolumesFrom.Deserializer.class) public class VolumesFrom { - private String container; - - private AccessMode accessMode; - - public VolumesFrom(String container) { - this(container, AccessMode.DEFAULT); - } - - public VolumesFrom(String container, AccessMode accessMode) { - this.container = container; - this.accessMode = accessMode; - } - - public String getContainer() { - return container; - } - - public AccessMode getAccessMode() { - return accessMode; - } - - - /** - * Parses a volume from specification to a {@link VolumesFrom}. - * - * @param serialized the specification, e.g. container:ro - * @return a {@link VolumesFrom} matching the specification - * @throws IllegalArgumentException if the specification cannot be parsed - */ - public static VolumesFrom parse(String serialized) { - try { - String[] parts = serialized.split(":"); - switch (parts.length) { - case 1: { - return new VolumesFrom(parts[0]); - } - case 2: { - return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); - } - - default: { - throw new IllegalArgumentException(); - } - } - } catch (Exception e) { - throw new IllegalArgumentException("Error parsing Bind '" + serialized - + "'"); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof VolumesFrom) { - VolumesFrom other = (VolumesFrom) obj; - return new EqualsBuilder().append(container, other.getContainer()) - .append(accessMode, other.getAccessMode()).isEquals(); - } else - return super.equals(obj); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(container) - .append(accessMode).toHashCode(); - } - - /** - * Returns a string representation of this {@link VolumesFrom} suitable - * for inclusion in a JSON message. - * The format is <container>:<access mode>, - * like the argument in {@link #parse(String)}. - * - * @return a string representation of this {@link VolumesFrom} - */ - @Override - public String toString() { - return container + ":" + accessMode.toString(); - } - - public static class Serializer extends JsonSerializer { - - @Override - public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, - SerializerProvider serProvider) throws IOException, - JsonProcessingException { - - jsonGen.writeString(volumeFrom.toString()); - - } - - } - - public static class Deserializer extends JsonDeserializer { - @Override - public VolumesFrom deserialize(JsonParser jsonParser, - DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - return VolumesFrom.parse(node.asText()); - - } - } + private String container; + + private AccessMode accessMode; + + public VolumesFrom(String container) { + this(container, AccessMode.DEFAULT); + } + + public VolumesFrom(String container, AccessMode accessMode) { + this.container = container; + this.accessMode = accessMode; + } + + public String getContainer() { + return container; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + /** + * Parses a volume from specification to a {@link VolumesFrom}. + * + * @param serialized + * the specification, e.g. container:ro + * @return a {@link VolumesFrom} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static VolumesFrom parse(String serialized) { + try { + String[] parts = serialized.split(":"); + switch (parts.length) { + case 1: { + return new VolumesFrom(parts[0]); + } + case 2: { + return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); + } + + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof VolumesFrom) { + VolumesFrom other = (VolumesFrom) obj; + return new EqualsBuilder().append(container, other.getContainer()) + .append(accessMode, other.getAccessMode()).isEquals(); + } else + return super.equals(obj); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(container).append(accessMode).toHashCode(); + } + + /** + * Returns a string representation of this {@link VolumesFrom} suitable for inclusion in a JSON message. The format + * is <container>:<access mode>, like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link VolumesFrom} + */ + @Override + public String toString() { + return container + ":" + accessMode.toString(); + } + + public static class Serializer extends JsonSerializer { + + @Override + public void serialize(VolumesFrom volumeFrom, JsonGenerator jsonGen, SerializerProvider serProvider) + throws IOException, JsonProcessingException { + + jsonGen.writeString(volumeFrom.toString()); + + } + + } + + public static class Deserializer extends JsonDeserializer { + @Override + public VolumesFrom deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { + + ObjectCodec oc = jsonParser.getCodec(); + JsonNode node = oc.readTree(jsonParser); + return VolumesFrom.parse(node.asText()); + + } + } } 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 a898ed57f..4a017d162 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java @@ -36,34 +36,36 @@ public VolumeRW[] getVolumesRW() { public static final class Serializer extends JsonSerializer { @Override - public void serialize(VolumesRW value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { + 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 { + 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+"'."); + 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); } diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java index 862259a8e..6b5bdb055 100644 --- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java @@ -18,7 +18,10 @@ public class AuthConfigFile { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final TypeReference> CONFIG_MAP_TYPE = new TypeReference>() {}; + + private static final TypeReference> CONFIG_MAP_TYPE = new TypeReference>() { + }; + private final Map authConfigMap; public AuthConfigFile() { @@ -53,7 +56,7 @@ public AuthConfig resolveAuthConfig(String hostname) { public AuthConfigurations getAuthConfigurations() { final AuthConfigurations authConfigurations = new AuthConfigurations(); - for(Map.Entry authConfigEntry : authConfigMap.entrySet()) { + for (Map.Entry authConfigEntry : authConfigMap.entrySet()) { authConfigurations.addConfig(authConfigEntry.getValue()); } @@ -90,7 +93,6 @@ public String toString() { return "AuthConfigFile [authConfigMap=" + authConfigMap + "]"; } - public static AuthConfigFile loadConfig(File confFile) throws IOException { AuthConfigFile configFile = new AuthConfigFile(); if (!confFile.exists()) { diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 6b19a201f..5abb82bd7 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -25,117 +25,118 @@ import org.bouncycastle.openssl.PEMParser; public class CertificateUtils { - + public static boolean verifyCertificatesExist(String dockerCertPath) { - String[] files = {"ca.pem", "cert.pem", "key.pem"}; + String[] files = { "ca.pem", "cert.pem", "key.pem" }; for (String file : files) { File path = new File(dockerCertPath, file); boolean exists = path.exists(); - if(!exists) { + if (!exists) { return false; } } - + return true; } - - public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, CertificateException, KeyStoreException { + + public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException, + InvalidKeySpecException, IOException, CertificateException, KeyStoreException { KeyPair keyPair = loadPrivateKey(dockerCertPath); Certificate privateCertificate = loadCertificate(dockerCertPath); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(null); - keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), new Certificate[]{privateCertificate}); + keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), + new Certificate[] { privateCertificate }); return keyStore; } - - public static KeyStore createTrustStore(final String dockerCertPath) throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException { + + public static KeyStore createTrustStore(final String dockerCertPath) throws IOException, CertificateException, + KeyStoreException, NoSuchAlgorithmException { File caPath = new File(dockerCertPath, "ca.pem"); BufferedReader reader = new BufferedReader(new FileReader(caPath)); PEMParser pemParser = null; - + try { pemParser = new PEMParser(reader); X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); - Certificate caCertificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); - + Certificate caCertificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate( + certificateHolder); + KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(null); trustStore.setCertificateEntry("ca", caCertificate); return trustStore; - - } - finally { - if(pemParser != null) { + + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - if(reader != null) { + if (reader != null) { IOUtils.closeQuietly(reader); } } - + } - + private static Certificate loadCertificate(final String dockerCertPath) throws IOException, CertificateException { File certificate = new File(dockerCertPath, "cert.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; - + try { - pemParser = new PEMParser(reader); - X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); - return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); - } - finally { - if(pemParser != null) { + pemParser = new PEMParser(reader); + X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); + return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - - if(reader != null) { + + if (reader != null) { IOUtils.closeQuietly(reader); } } - + } - - private static KeyPair loadPrivateKey(final String dockerCertPath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { + + private static KeyPair loadPrivateKey(final String dockerCertPath) throws IOException, NoSuchAlgorithmException, + InvalidKeySpecException { File certificate = new File(dockerCertPath, "key.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; - + try { - pemParser = new PEMParser(reader); - - PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject(); - - byte[] pemPrivateKeyEncoded = pemKeyPair.getPrivateKeyInfo().getEncoded(); - byte[] pemPublicKeyEncoded = pemKeyPair.getPublicKeyInfo().getEncoded(); + pemParser = new PEMParser(reader); - KeyFactory factory = KeyFactory.getInstance("RSA"); + PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject(); - X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pemPublicKeyEncoded); - PublicKey publicKey = factory.generatePublic(publicKeySpec); + byte[] pemPrivateKeyEncoded = pemKeyPair.getPrivateKeyInfo().getEncoded(); + byte[] pemPublicKeyEncoded = pemKeyPair.getPublicKeyInfo().getEncoded(); - PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pemPrivateKeyEncoded); - PrivateKey privateKey = factory.generatePrivate(privateKeySpec); + KeyFactory factory = KeyFactory.getInstance("RSA"); - return new KeyPair(publicKey, privateKey); - - } - finally { - if(pemParser != null) { + X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pemPublicKeyEncoded); + PublicKey publicKey = factory.generatePublic(publicKeySpec); + + PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pemPrivateKeyEncoded); + PrivateKey privateKey = factory.generatePrivate(privateKeySpec); + + return new KeyPair(publicKey, privateKey); + + } finally { + if (pemParser != null) { IOUtils.closeQuietly(pemParser); } - - if(reader != null) { + + if (reader != null) { IOUtils.closeQuietly(reader); } } - } } diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 0afd5171d..b40294487 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -10,7 +10,8 @@ public class CompressArchiveUtil { - public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { + 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)); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 4aa7d5ac7..f906f43d5 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -7,65 +7,62 @@ import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; public class DockerClientBuilder { - - private static ServiceLoader serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class); - - private DockerClientImpl dockerClient = null; - private DockerCmdExecFactory dockerCmdExecFactory = null; - - private DockerClientBuilder(DockerClientImpl dockerClient) { - this.dockerClient = dockerClient; - } - - public static DockerClientBuilder getInstance() { - return new DockerClientBuilder(DockerClientImpl.getInstance()); - } - - public static DockerClientBuilder getInstance(DockerClientConfigBuilder dockerClientConfigBuilder) { - return getInstance(dockerClientConfigBuilder.build()); - } - - public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { - return new DockerClientBuilder(DockerClientImpl - .getInstance(dockerClientConfig)); - } - - public static DockerClientBuilder getInstance(String serverUrl) { - return new DockerClientBuilder(DockerClientImpl - .getInstance(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."); - } - - return serviceLoader.iterator().next(); - } - - public DockerClientBuilder withDockerCmdExecFactory( - DockerCmdExecFactory dockerCmdExecFactory) { - this.dockerCmdExecFactory = dockerCmdExecFactory; - return this; - } - - public DockerClientBuilder withServiceLoaderClassLoader(ClassLoader classLoader) - { - serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class, classLoader); - return this; - } - - public DockerClient build() { - if(dockerCmdExecFactory != null) { - dockerClient.withDockerCmdExecFactory(dockerCmdExecFactory); - } - else { - dockerClient.withDockerCmdExecFactory(getDefaultDockerCmdExecFactory()); - } - - return dockerClient; - } + + private static ServiceLoader serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class); + + private DockerClientImpl dockerClient = null; + + private DockerCmdExecFactory dockerCmdExecFactory = null; + + private DockerClientBuilder(DockerClientImpl dockerClient) { + this.dockerClient = dockerClient; + } + + public static DockerClientBuilder getInstance() { + return new DockerClientBuilder(DockerClientImpl.getInstance()); + } + + public static DockerClientBuilder getInstance(DockerClientConfigBuilder dockerClientConfigBuilder) { + return getInstance(dockerClientConfigBuilder.build()); + } + + public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { + return new DockerClientBuilder(DockerClientImpl.getInstance(dockerClientConfig)); + } + + public static DockerClientBuilder getInstance(String serverUrl) { + return new DockerClientBuilder(DockerClientImpl.getInstance(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."); + } + + return serviceLoader.iterator().next(); + } + + public DockerClientBuilder withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) { + this.dockerCmdExecFactory = dockerCmdExecFactory; + return this; + } + + public DockerClientBuilder withServiceLoaderClassLoader(ClassLoader classLoader) { + serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class, classLoader); + return this; + } + + public DockerClient build() { + if (dockerCmdExecFactory != null) { + dockerClient.withDockerCmdExecFactory(dockerCmdExecFactory); + } else { + dockerClient.withDockerCmdExecFactory(getDefaultDockerCmdExecFactory()); + } + + return dockerClient; + } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 7e0b57b0e..a96f61556 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -20,26 +20,42 @@ public class DockerClientConfig implements Serializable { - private static final long serialVersionUID = -4307357472441531489L; - - private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + private static final long serialVersionUID = -4307357472441531489L; + + private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; + private static final String DOCKER_VERIFY_TLS_PROPERTY = "DOCKER_TLS_VERIFY"; + private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; + private static final String DOCKER_IO_VERSION_PROPERTY = "docker.io.version"; + private static final String DOCKER_IO_USERNAME_PROPERTY = "docker.io.username"; + private static final String DOCKER_IO_PASSWORD_PROPERTY = "docker.io.password"; + private static final String DOCKER_IO_EMAIL_PROPERTY = "docker.io.email"; + private static final String DOCKER_IO_SERVER_ADDRESS_PROPERTY = "docker.io.serverAddress"; + private static final String DOCKER_IO_READ_TIMEOUT_PROPERTY = "docker.io.readTimeout"; + // this is really confusing, as there are two ways to spell it private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; + private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilter"; + private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; + private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; + // connection pooling properties private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; + private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; + /** * A map from the environment name to the interval name. */ @@ -62,19 +78,26 @@ public class DockerClientConfig implements Serializable { } private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; + private URI uri; + private final String version, username, password, email, serverAddress, dockerCfgPath; + private final Integer readTimeout; + private final boolean loggingFilterEnabled; + private final boolean followRedirectsFilterEnabled; + private final SSLConfig sslConfig; - + private final Integer maxTotalConnections; + private final Integer maxPerRouteConnections; DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, boolean followRedirectsFilterEnabled, - SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { + String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, + boolean followRedirectsFilterEnabled, SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -121,14 +144,16 @@ private static String replaceProperties(String s, Properties replacements) { /** * Creates a new Properties object containing values overridden from ${user.home}/.docker.io.properties * - * @param p The original set of properties to override + * @param p + * The original set of properties to override * @return A copy of the original Properties with overridden values */ private static Properties overrideDockerPropertiesWithSettingsFromUserHome(Properties p, Properties systemProperties) { Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - final File usersDockerPropertiesFile = new File(systemProperties.getProperty("user.home"), "." + DOCKER_IO_PROPERTIES_PROPERTY); + final File usersDockerPropertiesFile = new File(systemProperties.getProperty("user.home"), "." + + DOCKER_IO_PROPERTIES_PROPERTY); if (usersDockerPropertiesFile.isFile()) { try { final FileInputStream in = new FileInputStream(usersDockerPropertiesFile); @@ -150,7 +175,8 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, // special case which is a sensible default if (env.containsKey(DOCKER_HOST_PROPERTY)) { - overriddenProperties.setProperty(DOCKER_IO_URL_PROPERTY, env.get(DOCKER_HOST_PROPERTY).replace("tcp", protocol(env))); + overriddenProperties.setProperty(DOCKER_IO_URL_PROPERTY, + env.get(DOCKER_HOST_PROPERTY).replace("tcp", protocol(env))); } for (Map.Entry envEntry : env.entrySet()) { @@ -165,32 +191,26 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, private static String protocol(Map env) { // if this is set, we assume we need SSL - return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" : "http"; + return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" + : "http"; } /** * Creates a new Properties object containing values overridden from the System properties * - * @param p The original set of properties to override + * @param p + * The original set of properties to override * @return A copy of the original Properties with overridden values */ private static Properties overrideDockerPropertiesWithSystemProperties(Properties p, Properties systemProperties) { Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - for (String key : new String[]{ - DOCKER_IO_URL_PROPERTY, - DOCKER_IO_VERSION_PROPERTY, - DOCKER_IO_USERNAME_PROPERTY, - DOCKER_IO_PASSWORD_PROPERTY, - DOCKER_IO_EMAIL_PROPERTY, - DOCKER_IO_SERVER_ADDRESS_PROPERTY, - DOCKER_IO_READ_TIMEOUT_PROPERTY, - DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, - DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, - DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, - DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, - }) { + for (String key : new String[] { DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, + DOCKER_IO_USERNAME_PROPERTY, DOCKER_IO_PASSWORD_PROPERTY, DOCKER_IO_EMAIL_PROPERTY, + DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_READ_TIMEOUT_PROPERTY, + DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, + DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); } @@ -218,8 +238,8 @@ public URI getUri() { } public void setUri(URI uri) { - this.uri = uri; - } + this.uri = uri; + } public String getVersion() { return version; @@ -254,73 +274,67 @@ public boolean followRedirectsFilterEnabled() { } public SSLConfig getSslConfig() { - return sslConfig; + return sslConfig; } public String getDockerCfgPath() { return dockerCfgPath; } - + public Integer getMaxTotalConnections() { - return maxTotalConnections; + return maxTotalConnections; } public Integer getMaxPerRoutConnections() { - return maxPerRouteConnections; + return maxPerRouteConnections; } - + private AuthConfig getAuthConfig() { - AuthConfig authConfig = null; - if (getUsername() != null && getPassword() != null && getEmail() != null - && getServerAddress() != null) { - authConfig = new AuthConfig(); - authConfig.setUsername(getUsername()); - authConfig.setPassword(getPassword()); - authConfig.setEmail(getEmail()); - authConfig.setServerAddress(getServerAddress()); - } - return authConfig; - } - + AuthConfig authConfig = null; + if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { + authConfig = new AuthConfig(); + authConfig.setUsername(getUsername()); + authConfig.setPassword(getPassword()); + authConfig.setEmail(getEmail()); + authConfig.setServerAddress(getServerAddress()); + } + return authConfig; + } + public AuthConfig effectiveAuthConfig(String imageName) { - AuthConfig authConfig = null; - - String dockerCfgFile = getDockerCfgPath(); - - if (dockerCfgFile != null && imageName != null) { - AuthConfigFile authConfigFile; - try { - authConfigFile = AuthConfigFile.loadConfig(new File( - dockerCfgFile)); - } catch (IOException e) { - throw new DockerClientException( - "Failed to parse dockerCfgFile", e); - } - ReposTag reposTag = NameParser.parseRepositoryTag(imageName); - HostnameReposName hostnameReposName = NameParser - .resolveRepositoryName(reposTag.repos); - - authConfig = authConfigFile - .resolveAuthConfig(hostnameReposName.hostname); - } - - AuthConfig _authConfig = getAuthConfig(); - - if(_authConfig != null) authConfig = _authConfig; - - return authConfig; - } + AuthConfig authConfig = null; + + String dockerCfgFile = getDockerCfgPath(); + + if (dockerCfgFile != null && imageName != null) { + AuthConfigFile authConfigFile; + try { + authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); + } catch (IOException e) { + throw new DockerClientException("Failed to parse dockerCfgFile", e); + } + ReposTag reposTag = NameParser.parseRepositoryTag(imageName); + HostnameReposName hostnameReposName = NameParser.resolveRepositoryName(reposTag.repos); + + authConfig = authConfigFile.resolveAuthConfig(hostnameReposName.hostname); + } + + AuthConfig _authConfig = getAuthConfig(); + + if (_authConfig != null) + authConfig = _authConfig; + + return authConfig; + } public AuthConfigurations getAuthConfigurations() { String dockerCfgFile = getDockerCfgPath(); if (dockerCfgFile != null) { AuthConfigFile authConfigFile; try { - authConfigFile = AuthConfigFile.loadConfig(new File( - dockerCfgFile)); + authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); } catch (IOException e) { - throw new DockerClientException( - "Failed to parse dockerCfgFile", e); + throw new DockerClientException("Failed to parse dockerCfgFile", e); } return authConfigFile.getAuthConfigurations(); @@ -329,26 +343,35 @@ public AuthConfigurations getAuthConfigurations() { return new AuthConfigurations(); } - @Override + @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; DockerClientConfig that = (DockerClientConfig) o; - if (loggingFilterEnabled != that.loggingFilterEnabled) return false; + if (loggingFilterEnabled != that.loggingFilterEnabled) + return false; if (sslConfig != null ? !sslConfig.equals(that.sslConfig) : that.sslConfig != null) return false; if (dockerCfgPath != null ? !dockerCfgPath.equals(that.dockerCfgPath) : that.dockerCfgPath != null) return false; - if (email != null ? !email.equals(that.email) : that.email != null) return false; - if (password != null ? !password.equals(that.password) : that.password != null) return false; - if (readTimeout != null ? !readTimeout.equals(that.readTimeout) : that.readTimeout != null) return false; + if (email != null ? !email.equals(that.email) : that.email != null) + return false; + if (password != null ? !password.equals(that.password) : that.password != null) + return false; + if (readTimeout != null ? !readTimeout.equals(that.readTimeout) : that.readTimeout != null) + return false; if (serverAddress != null ? !serverAddress.equals(that.serverAddress) : that.serverAddress != null) return false; - if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; - if (username != null ? !username.equals(that.username) : that.username != null) return false; - if (version != null ? !version.equals(that.version) : that.version != null) return false; + if (uri != null ? !uri.equals(that.uri) : that.uri != null) + return false; + if (username != null ? !username.equals(that.username) : that.username != null) + return false; + if (version != null ? !version.equals(that.version) : that.version != null) + return false; return true; } @@ -370,33 +393,29 @@ public int hashCode() { @Override public String toString() { - return "DockerClientConfig{" + - "uri=" + uri + - ", version='" + version + '\'' + - ", username='" + username + '\'' + - ", password='" + password + '\'' + - ", email='" + email + '\'' + - ", serverAddress='" + serverAddress + '\'' + - ", dockerCfgPath='" + dockerCfgPath + '\'' + - ", sslConfig='" + sslConfig + '\'' + - ", readTimeout=" + readTimeout + - ", loggingFilterEnabled=" + loggingFilterEnabled + - ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + - '}'; + return "DockerClientConfig{" + "uri=" + uri + ", version='" + version + '\'' + ", username='" + username + '\'' + + ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress + + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' + + ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + '}'; } public static class DockerClientConfigBuilder { private URI uri; + private String version, username, password, email, serverAddress, dockerCfgPath; + private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; + private boolean loggingFilterEnabled, followRedirectsFilterEnabled; + private SSLConfig sslConfig; /** * This will set all fields in the builder to those contained in the Properties object. The Properties object * should contain the following docker.io.* keys: url, version, username, password, email, dockerCertPath, and * dockerCfgPath. If docker.io.readTimeout or docker.io.enableLoggingFilter are not contained, they will be set - * to 1000 and true, respectively. + * to 1000 and true, respectively. */ public DockerClientConfigBuilder withProperties(Properties p) { return withUri(p.getProperty(DOCKER_IO_URL_PROPERTY)) @@ -407,18 +426,19 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) - .withFollowRedirectsFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) + .withFollowRedirectsFilter( + Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); } - + private Integer integerValue(String value) { - if(value != null) - return Integer.valueOf(value); - else - return null; + if (value != null) + return Integer.valueOf(value); + else + return null; } public final DockerClientConfigBuilder withUri(String uri) { @@ -456,12 +476,12 @@ public final DockerClientConfigBuilder withReadTimeout(Integer readTimeout) { this.readTimeout = readTimeout; return this; } - + public final DockerClientConfigBuilder withMaxTotalConnections(Integer maxTotalConnections) { this.maxTotalConnections = maxTotalConnections; return this; } - + public final DockerClientConfigBuilder withMaxPerRouteConnections(Integer maxPerRouteConnections) { this.maxPerRouteConnections = maxPerRouteConnections; return this; @@ -478,9 +498,9 @@ public final DockerClientConfigBuilder withFollowRedirectsFilter(boolean followR } public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { - if(dockerCertPath != null) { - this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); - } + if (dockerCertPath != null) { + this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); + } return this; } @@ -489,30 +509,17 @@ public final DockerClientConfigBuilder withDockerCfgPath(String dockerCfgPath) { return this; } - public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { this.sslConfig = config; return this; } public DockerClientConfig build() { - return new DockerClientConfig( - uri, - version, - username, - password, - email, - serverAddress, - dockerCfgPath, - readTimeout, - loggingFilterEnabled, - followRedirectsFilterEnabled, - sslConfig, - maxTotalConnections, - maxPerRouteConnections - ); + return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, + readTimeout, loggingFilterEnabled, followRedirectsFilterEnabled, sslConfig, maxTotalConnections, + maxPerRouteConnections); } } -// + // } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index b9bdb7edc..810910393 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -285,7 +285,8 @@ public WaitContainerCmd waitContainerCmd(String containerId) { @Override public AttachContainerCmd attachContainerCmd(String containerId, ResultCallback resultCallback) { - return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId, resultCallback); + return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId, + resultCallback); } @Override @@ -300,7 +301,8 @@ public InspectExecCmd inspectExecCmd(String execId) { @Override public LogContainerCmd logContainerCmd(String containerId, ResultCallback resultCallback) { - return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId, resultCallback); + return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId, + resultCallback); } @Override diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java index 3fc910217..317a55ed6 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -6,9 +6,12 @@ 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. 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) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index a84bce5bb..469beb40b 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -23,16 +23,16 @@ * character class (must be non-empty) * c matches character c (c != '*', '?', '\\', '[') * '\\' c matches character c - * + * * character-range: * c matches character c (c != '\\', '-', ']') * '\\' c matches character c * lo '-' hi matches character c for lo <= c <= hi - * + * * Match requires pattern to match all of name, not just a substring. * The only possible returned error is ErrBadPattern, when pattern * is malformed. - * + * * On Windows, escaping is disabled. Instead, '\\' is treated as * path separator. * @@ -234,7 +234,9 @@ static GetEscResult getEsc(String chunk, int chunkOffset, int chunkLength) { private static final class ScanResult { public boolean star; + public String chunk; + public String pattern; public ScanResult(boolean star, String chunk, String pattern) { @@ -246,6 +248,7 @@ public ScanResult(boolean star, String chunk, String pattern) { private static final class GetEscResult { public char lo; + public int chunkOffset; public GetEscResult(char lo, int chunkOffset) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index 33e0f2a47..c8d8e1044 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -10,10 +10,9 @@ public class GoLangMatchFileFilter extends AbstractFileFilter { - private final File base; - - private final List patterns; + private final File base; + private final List patterns; public GoLangMatchFileFilter(File base, List patterns) { super(); @@ -24,10 +23,9 @@ public GoLangMatchFileFilter(File base, List patterns) { @Override public boolean accept(File file) { String relativePath = FilePathUtil.relativize(base, file); - + boolean match = GoLangFileMatch.match(patterns, relativePath); return !match; } - } diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index ec5a2ba8a..d7a17cfab 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -25,110 +25,109 @@ */ public class KeystoreSSLConfig implements SSLConfig, Serializable { - private final KeyStore keystore; - private final String keystorePassword; - - /** - * @param keystore a KeyStore - * @param keystorePassword key password - */ - public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { - this.keystorePassword = keystorePassword; - checkNotNull(keystore); - this.keystore = keystore; - } - - /** - * - * @param pfxFile a PKCS12 file - * @param password Password for the keystore - * @throws KeyStoreException - * @throws IOException - * @throws CertificateException - * @throws NoSuchAlgorithmException - */ - public KeystoreSSLConfig(File pfxFile, String password) - throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - checkNotNull(pfxFile); - checkNotNull(password); - keystore = KeyStore.getInstance("pkcs12"); - keystore.load(new FileInputStream(pfxFile), password.toCharArray()); - keystorePassword = password; - } - - - /** - * Get the SSL Context out of the keystore. - * @return java SSLContext - * @throws KeyManagementException - * @throws UnrecoverableKeyException - * @throws NoSuchAlgorithmException - * @throws KeyStoreException - */ - @Override - public SSLContext getSSLContext() - throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, - KeyStoreException { - - final SSLContext context = SSLContext.getInstance("TLS"); - - String httpProtocols = System.getProperty("https.protocols"); - System.setProperty("https.protocols", "TLSv1"); - - if (httpProtocols != null) - System.setProperty("https.protocols", httpProtocols); - - final KeyManagerFactory - keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyManagerFactory.init(keystore, keystorePassword.toCharArray()); - context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{ - new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[]{}; - } - - @Override - public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { - - } - - @Override - public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { - - } - } - }, new SecureRandom()); - - return context; - } + private final KeyStore keystore; + + private final String keystorePassword; + + /** + * @param keystore + * a KeyStore + * @param keystorePassword + * key password + */ + public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { + this.keystorePassword = keystorePassword; + checkNotNull(keystore); + this.keystore = keystore; + } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + /** + * + * @param pfxFile + * a PKCS12 file + * @param password + * Password for the keystore + * @throws KeyStoreException + * @throws IOException + * @throws CertificateException + * @throws NoSuchAlgorithmException + */ + public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException, IOException, + CertificateException, NoSuchAlgorithmException { + checkNotNull(pfxFile); + checkNotNull(password); + keystore = KeyStore.getInstance("pkcs12"); + keystore.load(new FileInputStream(pfxFile), password.toCharArray()); + keystorePassword = password; } - if (o == null || getClass() != o.getClass()) { - return false; + + /** + * Get the SSL Context out of the keystore. + * + * @return java SSLContext + * @throws KeyManagementException + * @throws UnrecoverableKeyException + * @throws NoSuchAlgorithmException + * @throws KeyStoreException + */ + @Override + public SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, + NoSuchAlgorithmException, KeyStoreException { + + final SSLContext context = SSLContext.getInstance("TLS"); + + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + + if (httpProtocols != null) + System.setProperty("https.protocols", httpProtocols); + + final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory + .getDefaultAlgorithm()); + keyManagerFactory.init(keystore, keystorePassword.toCharArray()); + context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } + + @Override + public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { + + } + + @Override + public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { + + } + } }, new SecureRandom()); + + return context; } - KeystoreSSLConfig that = (KeystoreSSLConfig) o; + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - return keystore.equals(that.keystore); + KeystoreSSLConfig that = (KeystoreSSLConfig) o; - } + return keystore.equals(that.keystore); - @Override - public int hashCode() { - return keystore.hashCode(); - } + } + + @Override + public int hashCode() { + return keystore.hashCode(); + } - @Override - public String toString() { - return new StringBuilder() - .append(this.getClass().getSimpleName()).append("{") - .append("keystore=").append(keystore) - .append("}") - .toString(); - } + @Override + public String toString() { + return new StringBuilder().append(this.getClass().getSimpleName()).append("{").append("keystore=") + .append(keystore).append("}").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index bafe62212..44310e9ce 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -12,88 +12,83 @@ import com.github.dockerjava.api.DockerClientException; - /** * SSL Config from local files. */ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { - private final String dockerCertPath; + private final String dockerCertPath; - public LocalDirectorySSLConfig(String dockerCertPath) { - checkNotNull(dockerCertPath); - this.dockerCertPath = dockerCertPath; - } + public LocalDirectorySSLConfig(String dockerCertPath) { + checkNotNull(dockerCertPath); + this.dockerCertPath = dockerCertPath; + } - public String getDockerCertPath() { - return dockerCertPath; - } + public String getDockerCertPath() { + return dockerCertPath; + } - @Override - public SSLContext getSSLContext() { + @Override + public SSLContext getSSLContext() { - boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); + boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); - if (certificatesExist) { + if (certificatesExist) { - try { + try { - Security.addProvider(new BouncyCastleProvider()); + Security.addProvider(new BouncyCastleProvider()); - // properties acrobatics not needed for java > 1.6 - String httpProtocols = System.getProperty("https.protocols"); - System.setProperty("https.protocols", "TLSv1"); - SslConfigurator sslConfig = SslConfigurator.newInstance(true); - if (httpProtocols != null) { - System.setProperty("https.protocols", httpProtocols); - } + // properties acrobatics not needed for java > 1.6 + String httpProtocols = System.getProperty("https.protocols"); + System.setProperty("https.protocols", "TLSv1"); + SslConfigurator sslConfig = SslConfigurator.newInstance(true); + if (httpProtocols != null) { + System.setProperty("https.protocols", httpProtocols); + } - sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath)); - sslConfig.keyStorePassword("docker"); - sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath)); + sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath)); + sslConfig.keyStorePassword("docker"); + sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath)); - return sslConfig.createSSLContext(); + return sslConfig.createSSLContext(); + } catch (Exception e) { + throw new DockerClientException(e.getMessage(), e); + } - } catch (Exception e) { - throw new DockerClientException(e.getMessage(), e); - } + } + + return null; } - return null; + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } - } + LocalDirectorySSLConfig that = (LocalDirectorySSLConfig) o; - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } + if (!dockerCertPath.equals(that.dockerCertPath)) { + return false; + } - LocalDirectorySSLConfig that = (LocalDirectorySSLConfig) o; + return true; + } - if (!dockerCertPath.equals(that.dockerCertPath)) { - return false; + @Override + public int hashCode() { + return dockerCertPath.hashCode(); } - return true; - } - - @Override - public int hashCode() { - return dockerCertPath.hashCode(); - } - - @Override - public String toString() { - return new StringBuilder() - .append(this.getClass().getSimpleName()).append("{") - .append("dockerCertPath=").append(dockerCertPath) - .append("}") - .toString(); - } + @Override + public String toString() { + return new StringBuilder().append(this.getClass().getSimpleName()).append("{").append("dockerCertPath=") + .append(dockerCertPath).append("}").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 6b1654081..2bd99bf31 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -10,7 +10,9 @@ public class NameParser { private static final Pattern VALID_HEX_PATTERN = Pattern.compile("^([a-f0-9]{64})$"); + private static final Pattern VALID_NAMESPACE_PATTERN = Pattern.compile("^([a-z0-9_]{4,30})$"); + private static final Pattern VALID_REPO_PATTERN = Pattern.compile("^([a-z0-9-_.]+)$"); public static ReposTag parseRepositoryTag(String name) { @@ -27,6 +29,7 @@ public static ReposTag parseRepositoryTag(String name) { public static class ReposTag { public final String repos; + public final String tag; public ReposTag(String repos, String tag) { @@ -44,18 +47,15 @@ public static void validateRepositoryName(String repositoryName) { name = nameParts[0]; if (VALID_HEX_PATTERN.matcher(name).matches()) { throw new InvalidRepositoryNameException(String.format( - "Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", - name)); + "Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", name)); } } else { namespace = nameParts[0]; name = nameParts[1]; } if (!VALID_NAMESPACE_PATTERN.matcher(namespace).matches()) { - throw new InvalidRepositoryNameException( - String.format( - "Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", - namespace)); + throw new InvalidRepositoryNameException(String.format( + "Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", namespace)); } if (!VALID_REPO_PATTERN.matcher(name).matches()) { throw new InvalidRepositoryNameException(String.format( @@ -71,16 +71,15 @@ public static HostnameReposName resolveRepositoryName(String reposName) { String[] nameParts = reposName.split("/", 2); if (nameParts.length == 1 - || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0] - .equals("localhost"))) { + || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) { return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName); } String hostname = nameParts[0]; reposName = nameParts[1]; if (hostname.contains("index.docker.io")) { - throw new InvalidRepositoryNameException(String.format( - "Invalid repository name, try \"%s\" instead", reposName)); + throw new InvalidRepositoryNameException(String.format("Invalid repository name, try \"%s\" instead", + reposName)); } validateRepositoryName(reposName); @@ -89,6 +88,7 @@ public static HostnameReposName resolveRepositoryName(String reposName) { public static class HostnameReposName { public final String hostname; + public final String reposName; public HostnameReposName(String hostname, String reposName) { diff --git a/src/main/java/com/github/dockerjava/core/SSLConfig.java b/src/main/java/com/github/dockerjava/core/SSLConfig.java index ab6394890..247e21b1f 100644 --- a/src/main/java/com/github/dockerjava/core/SSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/SSLConfig.java @@ -9,11 +9,11 @@ */ public interface SSLConfig { - /** - * Get the SSL Context, from wherever it comes (file, keystore). - * @return an SSL context. - */ - SSLContext getSSLContext() - throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, - KeyStoreException; + /** + * Get the SSL Context, from wherever it comes (file, keystore). + * + * @return an SSL context. + */ + SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, + KeyStoreException; } diff --git a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java index c88575889..879a8c305 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java @@ -14,7 +14,6 @@ */ public interface ResponseStreamProcessor { - void processResponseStream(InputStream response, - ResultCallback resultCallback); + 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 index f56db8db4..d9a408c35 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -55,7 +55,7 @@ public void onComplete() { @Override public void close() throws IOException { - if(stream != null) + if (stream != null) stream.close(); finished.countDown(); } diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 31259f1f0..7e9957cbf 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -11,41 +11,40 @@ import com.github.dockerjava.api.command.DockerCmdExec; import com.github.dockerjava.api.model.AuthConfig; -public abstract class AbstrAuthCfgDockerCmd, RES_T> extends - AbstrDockerCmd { - - public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { - super(execution); - withOptionalAuthConfig(authConfig); - } - - public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { - super(execution); - } - - private AuthConfig authConfig; - - public AuthConfig getAuthConfig() { - return authConfig; - } - - public T withAuthConfig(AuthConfig authConfig) { - checkNotNull(authConfig, "authConfig was not specified"); - return withOptionalAuthConfig(authConfig); - } - - @SuppressWarnings("unchecked") - private T withOptionalAuthConfig(AuthConfig authConfig) { - this.authConfig = authConfig; - return (T)this; - } - - protected String registryAuth() { - try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } +public abstract class AbstrAuthCfgDockerCmd, RES_T> extends AbstrDockerCmd { + + public AbstrAuthCfgDockerCmd(DockerCmdExec execution, AuthConfig authConfig) { + super(execution); + withOptionalAuthConfig(authConfig); + } + + public AbstrAuthCfgDockerCmd(DockerCmdExec execution) { + super(execution); + } + + private AuthConfig authConfig; + + public AuthConfig getAuthConfig() { + return authConfig; + } + + public T withAuthConfig(AuthConfig authConfig) { + checkNotNull(authConfig, "authConfig was not specified"); + return withOptionalAuthConfig(authConfig); + } + + @SuppressWarnings("unchecked") + private T withOptionalAuthConfig(AuthConfig authConfig) { + this.authConfig = authConfig; + return (T) this; + } + + protected String registryAuth() { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 751b02cb6..069fba09e 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -12,23 +12,24 @@ import com.github.dockerjava.api.command.DockerCmdExec; public abstract class AbstrDockerCmd, RES_T> implements DockerCmd { - + private final static Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); - protected DockerCmdExec execution; - - public AbstrDockerCmd(DockerCmdExec execution) { - checkNotNull(execution, "execution was not specified"); - this.execution = execution; - } + protected DockerCmdExec execution; + + public AbstrDockerCmd(DockerCmdExec execution) { + checkNotNull(execution, "execution was not specified"); + this.execution = execution; + } @Override @SuppressWarnings("unchecked") - public RES_T exec() throws DockerException { - LOGGER.debug("Cmd: {}", this); - return execution.exec((CMD_T)this); - } + public RES_T exec() throws DockerException { + LOGGER.debug("Cmd: {}", this); + return execution.exec((CMD_T) this); + } @Override - public void close() throws IOException {} + public void close() throws IOException { + } } 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 749f61500..eabbb8488 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -20,24 +20,23 @@ * @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 class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { +public class AttachContainerCmdImpl extends AbstrDockerCmd implements AttachContainerCmd { private ResultCallback resultCallback; - private String containerId; + private String containerId; - private boolean logs, followStream, timestamps, stdout, stderr; + private boolean logs, followStream, timestamps, stdout, stderr; - public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { - super(exec); - withContainerId(containerId); - withResultCallback(resultCallback); - } + public AttachContainerCmdImpl(AttachContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { + super(exec); + withContainerId(containerId); + withResultCallback(resultCallback); + } - public ResultCallback getResultCallback() { + public ResultCallback getResultCallback() { return resultCallback; } @@ -48,98 +47,99 @@ public AttachContainerCmd withResultCallback(ResultCallback resultCallbac return this; } - @Override - public String getContainerId() { - return containerId; - } - - @Override - public boolean hasLogsEnabled() { - return logs; - } - - @Override - public boolean hasFollowStreamEnabled() { - return followStream; - } - - @Override - public boolean hasTimestampsEnabled() { - return timestamps; - } - - @Override - public boolean hasStdoutEnabled() { - return stdout; - } - - @Override - public boolean hasStderrEnabled() { - return stderr; - } - - @Override - public AttachContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public AttachContainerCmd withFollowStream() { - return withFollowStream(true); - } - - @Override - public AttachContainerCmd withFollowStream(boolean followStream) { - this.followStream = followStream; - return this; - } - - @Override - public AttachContainerCmd withTimestamps(boolean timestamps) { - this.timestamps = timestamps; - return this; - } - - @Override - public AttachContainerCmd withStdOut() { - return withStdOut(true); - } - - @Override - public AttachContainerCmd withStdOut(boolean stdout) { - this.stdout = stdout; - return this; - } - - @Override - public AttachContainerCmd withStdErr() { - return withStdErr(true); - } - - @Override - public AttachContainerCmd withStdErr(boolean stderr) { - this.stderr = stderr; - return this; - } - - @Override - public AttachContainerCmd withLogs(boolean logs) { - this.logs = logs; - return this; - } - - @Override - public AttachContainerCmd withLogs() { - return withLogs(true); - } - - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } + @Override + public String getContainerId() { + return containerId; + } + + @Override + public boolean hasLogsEnabled() { + return logs; + } + + @Override + public boolean hasFollowStreamEnabled() { + return followStream; + } + + @Override + public boolean hasTimestampsEnabled() { + return timestamps; + } + + @Override + public boolean hasStdoutEnabled() { + return stdout; + } + + @Override + public boolean hasStderrEnabled() { + return stderr; + } + + @Override + public AttachContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public AttachContainerCmd withFollowStream() { + return withFollowStream(true); + } + + @Override + public AttachContainerCmd withFollowStream(boolean followStream) { + this.followStream = followStream; + return this; + } + + @Override + public AttachContainerCmd withTimestamps(boolean timestamps) { + this.timestamps = timestamps; + return this; + } + + @Override + public AttachContainerCmd withStdOut() { + return withStdOut(true); + } + + @Override + public AttachContainerCmd withStdOut(boolean stdout) { + this.stdout = stdout; + return this; + } + + @Override + public AttachContainerCmd withStdErr() { + return withStdErr(true); + } + + @Override + public AttachContainerCmd withStdErr(boolean stderr) { + this.stderr = stderr; + return this; + } + + @Override + public AttachContainerCmd withLogs(boolean logs) { + this.logs = logs; + return this; + } + + @Override + public AttachContainerCmd withLogs() { + return withLogs(true); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java index 0da0da3c3..73c716c14 100644 --- a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java @@ -12,18 +12,18 @@ */ public class AuthCmdImpl extends AbstrAuthCfgDockerCmd implements AuthCmd { - public AuthCmdImpl(AuthCmd.Exec exec, AuthConfig authConfig) { - super(exec); - withAuthConfig(authConfig); - } + public AuthCmdImpl(AuthCmd.Exec exec, AuthConfig authConfig) { + super(exec); + withAuthConfig(authConfig); + } - @Override - public AuthResponse exec() throws UnauthorizedException { - return super.exec(); - } + @Override + public AuthResponse exec() throws UnauthorizedException { + return super.exec(); + } - @Override - public String toString() { - return "authenticate using " + this.getAuthConfig(); - } + @Override + public String toString() { + return "authenticate using " + this.getAuthConfig(); + } } 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 ef0242857..f61d3b7ac 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -18,16 +18,22 @@ */ public class BuildImageCmdImpl extends AbstrDockerCmd implements BuildImageCmd { + private InputStream tarInputStream = null; + + private String tag; + + private boolean noCache; + + private boolean remove = true; + + private boolean quiet; + + private boolean pull; + + private AuthConfigurations buildAuthConfigs; - private InputStream tarInputStream = null; - private String tag; - private boolean noCache; - private boolean remove = true; - private boolean quiet; - private boolean pull; - - private AuthConfigurations buildAuthConfigs; private File dockerFile; + private File baseDirectory; public BuildImageCmdImpl(BuildImageCmd.Exec exec) { @@ -35,48 +41,43 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec) { } public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFileOrFolder) { - super(exec); - checkNotNull(dockerFileOrFolder, "dockerFolder is null"); + super(exec); + checkNotNull(dockerFileOrFolder, "dockerFolder is null"); - if( dockerFileOrFolder.isDirectory() ) { + if (dockerFileOrFolder.isDirectory()) { withBaseDirectory(dockerFileOrFolder); withDockerfile(new File(dockerFileOrFolder, "Dockerfile")); - } - else { + } else { withDockerfile(dockerFileOrFolder); } - } + } - public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { - super(exec); - checkNotNull(tarInputStream, "tarInputStream is null"); - withTarInputStream(tarInputStream); - } + public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { + super(exec); + checkNotNull(tarInputStream, "tarInputStream is null"); + withTarInputStream(tarInputStream); + } - @Override - public InputStream getTarInputStream() { - return tarInputStream; - } + @Override + public InputStream getTarInputStream() { + return tarInputStream; + } @Override public BuildImageCmdImpl withDockerfile(File dockerfile) { checkNotNull(dockerfile); - if( !dockerfile.exists() ) + if (!dockerfile.exists()) throw new IllegalArgumentException("Dockerfile does not exist"); - if( !dockerfile.isFile() ) + if (!dockerfile.isFile()) throw new IllegalArgumentException("Not a directory"); - if( baseDirectory == null ) + if (baseDirectory == null) withBaseDirectory(dockerfile.getParentFile()); - this.dockerFile = dockerfile; try { - withTarInputStream( - new Dockerfile(dockerfile) - .parse() - .buildDockerFolderTar(baseDirectory) ); + withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); } catch (IOException e) { // we just created the file this should never happen. throw new RuntimeException(e); @@ -84,44 +85,44 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) { return this; } - @Override - public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - checkNotNull(tarInputStream, "tarInputStream is null"); - this.tarInputStream = tarInputStream; - return this; - } - - @Override - public BuildImageCmdImpl withTag(String tag) { - checkNotNull(tag, "Tag is null"); - this.tag = tag; - return this; - } - - @Override - public String getTag() { - return tag; - } - - @Override - public boolean hasNoCacheEnabled() { - return noCache; - } - - @Override - public boolean hasRemoveEnabled() { - return remove; - } - - @Override - public boolean isQuiet() { - return quiet; - } - - @Override - public boolean hasPullEnabled() { - return pull; - } + @Override + public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { + checkNotNull(tarInputStream, "tarInputStream is null"); + this.tarInputStream = tarInputStream; + return this; + } + + @Override + public BuildImageCmdImpl withTag(String tag) { + checkNotNull(tag, "Tag is null"); + this.tag = tag; + return this; + } + + @Override + public String getTag() { + return tag; + } + + @Override + public boolean hasNoCacheEnabled() { + return noCache; + } + + @Override + public boolean hasRemoveEnabled() { + return remove; + } + + @Override + public boolean isQuiet() { + return quiet; + } + + @Override + public boolean hasPullEnabled() { + return pull; + } @Override public String getPathToDockerfile() { @@ -133,9 +134,9 @@ public String getPathToDockerfile() { } @Override - public AuthConfigurations getBuildAuthConfigs() { - return buildAuthConfigs; - } + public AuthConfigurations getBuildAuthConfigs() { + return buildAuthConfigs; + } @Override public BuildImageCmd withBaseDirectory(File baseDirectory) { @@ -144,71 +145,68 @@ public BuildImageCmd withBaseDirectory(File baseDirectory) { } @Override - public BuildImageCmdImpl withNoCache() { - return withNoCache(true); - } - - @Override - public BuildImageCmdImpl withNoCache(boolean noCache) { - this.noCache = noCache; - return this; - } - - @Override - public BuildImageCmdImpl withRemove() { - return withRemove(true); - } - - @Override - public BuildImageCmdImpl withRemove(boolean rm) { - this.remove = rm; - return this; - } - - @Override - public BuildImageCmdImpl withQuiet() { - return withQuiet(true); - } - - @Override - public BuildImageCmdImpl withQuiet(boolean quiet) { - this.quiet = quiet; - return this; - } - - @Override - public BuildImageCmdImpl withPull() { - return withPull(true); - } - - @Override - public BuildImageCmdImpl withPull(boolean pull) { - this.pull = pull; - return this; - } - - @Override - public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { - checkNotNull(authConfigs, "authConfig is null"); - this.buildAuthConfigs = authConfigs; - return this; - } - - @Override - public void close() throws IOException { - super.close(); - - tarInputStream.close(); - } - - @Override - public String toString() { - return new StringBuilder("build ") - .append(tag != null ? "-t " + tag + " " : "") - .append(noCache ? "--nocache=true " : "") - .append(quiet ? "--quiet=true " : "") - .append(!remove ? "--rm=false " : "").toString(); - } + public BuildImageCmdImpl withNoCache() { + return withNoCache(true); + } + + @Override + public BuildImageCmdImpl withNoCache(boolean noCache) { + this.noCache = noCache; + return this; + } + + @Override + public BuildImageCmdImpl withRemove() { + return withRemove(true); + } + @Override + public BuildImageCmdImpl withRemove(boolean rm) { + this.remove = rm; + return this; + } + + @Override + public BuildImageCmdImpl withQuiet() { + return withQuiet(true); + } + + @Override + public BuildImageCmdImpl withQuiet(boolean quiet) { + this.quiet = quiet; + return this; + } + + @Override + public BuildImageCmdImpl withPull() { + return withPull(true); + } + + @Override + public BuildImageCmdImpl withPull(boolean pull) { + this.pull = pull; + return this; + } + + @Override + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { + checkNotNull(authConfigs, "authConfig is null"); + this.buildAuthConfigs = authConfigs; + return this; + } + + @Override + public void close() throws IOException { + super.close(); + + tarInputStream.close(); + } + + @Override + public String toString() { + return new StringBuilder("build ").append(tag != null ? "-t " + tag + " " : "") + .append(noCache ? "--nocache=true " : "").append(quiet ? "--quiet=true " : "") + .append(!remove ? "--rm=false " : "").toString(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index 55fe5e2e2..497d08c3f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -10,7 +10,6 @@ import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; - /** * * Create a new image from a container's changes. Returns the new image ID. @@ -18,11 +17,11 @@ */ public class CommitCmdImpl extends AbstrDockerCmd implements CommitCmd { - private String containerId, repository, tag, message, author; + private String containerId, repository, tag, message, author; - private boolean pause = true; + private boolean pause = true; - @JsonProperty("AttachStdin") + @JsonProperty("AttachStdin") private boolean attachStdin; @JsonProperty("AttachStdout") @@ -73,299 +72,293 @@ public class CommitCmdImpl extends AbstrDockerCmd implements @JsonProperty("WorkingDir") private String workingDir; - - public CommitCmdImpl(CommitCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public CommitCmdImpl(CommitCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public CommitCmdImpl withContainerId(String containerId) { + public CommitCmdImpl withContainerId(String containerId) { checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - + this.containerId = containerId; + return this; + } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } @Override - public String getMessage() { + public String getMessage() { return message; } @Override - public String getAuthor() { + public String getAuthor() { return author; } @Override - public boolean hasPauseEnabled() { + public boolean hasPauseEnabled() { return pause; } - @Override - public CommitCmdImpl withAttachStderr(boolean attachStderr) { - this.attachStderr = attachStderr; - return this; - } - - @Override - public CommitCmdImpl withAttachStderr() { - return withAttachStderr(true); - } - - @Override - public CommitCmdImpl withAttachStdin(boolean attachStdin) { - this.attachStdin = attachStdin; - return this; - } - - @Override - public CommitCmdImpl withAttachStdin() { - return withAttachStdin(true); - } - - @Override - public CommitCmdImpl withAttachStdout(boolean attachStdout) { - this.attachStdout = attachStdout; - return this; - } - - @Override - public CommitCmdImpl withAttachStdout() { - return withAttachStdout(true); - } - - @Override - public CommitCmdImpl withCmd(String... cmd) { + @Override + public CommitCmdImpl withAttachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + @Override + public CommitCmdImpl withAttachStderr() { + return withAttachStderr(true); + } + + @Override + public CommitCmdImpl withAttachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + @Override + public CommitCmdImpl withAttachStdin() { + return withAttachStdin(true); + } + + @Override + public CommitCmdImpl withAttachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + @Override + public CommitCmdImpl withAttachStdout() { + return withAttachStdout(true); + } + + @Override + public CommitCmdImpl withCmd(String... cmd) { checkNotNull(cmd, "cmd was not specified"); - this.cmd = cmd; - return this; - } - - @Override - public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { - this.disableNetwork = disableNetwork; - return this; - } - - @Override - public CommitCmdImpl withAuthor(String author) { + this.cmd = cmd; + return this; + } + + @Override + public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { + this.disableNetwork = disableNetwork; + return this; + } + + @Override + public CommitCmdImpl withAuthor(String author) { checkNotNull(author, "author was not specified"); - this.author = author; - return this; - } + this.author = author; + return this; + } - @Override - public CommitCmdImpl withMessage(String message) { + @Override + public CommitCmdImpl withMessage(String message) { checkNotNull(message, "message was not specified"); - this.message = message; - return this; - } + this.message = message; + return this; + } - @Override - public CommitCmdImpl withTag(String tag) { + @Override + public CommitCmdImpl withTag(String tag) { checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } + this.tag = tag; + return this; + } - @Override - public CommitCmdImpl withRepository(String repository) { + @Override + public CommitCmdImpl withRepository(String repository) { checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } - - @Override - public CommitCmdImpl withPause(boolean pause) { - this.pause = pause; - return this; - } - - @Override - public String[] getEnv() { + this.repository = repository; + return this; + } + + @Override + public CommitCmdImpl withPause(boolean pause) { + this.pause = pause; + return this; + } + + @Override + public String[] getEnv() { return env; } @Override - public CommitCmdImpl withEnv(String... env) { + public CommitCmdImpl withEnv(String... env) { checkNotNull(env, "env was not specified"); this.env = env; return this; } @Override - public ExposedPorts getExposedPorts() { + public ExposedPorts getExposedPorts() { return exposedPorts; } @Override - public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { + public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { checkNotNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = exposedPorts; return this; } @Override - public String getHostname() { + public String getHostname() { return hostname; } @Override - public CommitCmdImpl withHostname(String hostname) { + public CommitCmdImpl withHostname(String hostname) { checkNotNull(hostname, "hostname was not specified"); this.hostname = hostname; return this; } @Override - public Integer getMemory() { + public Integer getMemory() { return memory; } @Override - public CommitCmdImpl withMemory(Integer memory) { + public CommitCmdImpl withMemory(Integer memory) { checkNotNull(memory, "memory was not specified"); this.memory = memory; return this; } @Override - public Integer getMemorySwap() { + public Integer getMemorySwap() { return memorySwap; } @Override - public CommitCmdImpl withMemorySwap(Integer memorySwap) { + public CommitCmdImpl withMemorySwap(Integer memorySwap) { checkNotNull(memorySwap, "memorySwap was not specified"); this.memorySwap = memorySwap; return this; } @Override - public boolean isOpenStdin() { + public boolean isOpenStdin() { return openStdin; } @Override - public CommitCmdImpl withOpenStdin(boolean openStdin) { - checkNotNull(openStdin, "openStdin was not specified"); + public CommitCmdImpl withOpenStdin(boolean openStdin) { + checkNotNull(openStdin, "openStdin was not specified"); this.openStdin = openStdin; return this; } - + @Override - public String[] getPortSpecs() { + public String[] getPortSpecs() { return portSpecs; } @Override - public CommitCmdImpl withPortSpecs(String... portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); + public CommitCmdImpl withPortSpecs(String... portSpecs) { + checkNotNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } @Override - public boolean isStdinOnce() { + public boolean isStdinOnce() { return stdinOnce; } @Override - public CommitCmdImpl withStdinOnce(boolean stdinOnce) { + public CommitCmdImpl withStdinOnce(boolean stdinOnce) { this.stdinOnce = stdinOnce; return this; } - + @Override - public CommitCmdImpl withStdinOnce() { - return withStdinOnce(true); + public CommitCmdImpl withStdinOnce() { + return withStdinOnce(true); } @Override - public boolean isTty() { + public boolean isTty() { return tty; } @Override - public CommitCmdImpl withTty(boolean tty) { + public CommitCmdImpl withTty(boolean tty) { this.tty = tty; return this; } - + @Override - public CommitCmdImpl withTty() { - return withTty(true); + public CommitCmdImpl withTty() { + return withTty(true); } @Override - public String getUser() { + public String getUser() { return user; } @Override - public CommitCmdImpl withUser(String user) { - checkNotNull(user, "user was not specified"); + public CommitCmdImpl withUser(String user) { + checkNotNull(user, "user was not specified"); this.user = user; return this; } @Override - public Volumes getVolumes() { + public Volumes getVolumes() { return volumes; } @Override - public CommitCmdImpl withVolumes(Volumes volumes) { - checkNotNull(volumes, "volumes was not specified"); + public CommitCmdImpl withVolumes(Volumes volumes) { + checkNotNull(volumes, "volumes was not specified"); this.volumes = volumes; return this; } @Override - public String getWorkingDir() { + public String getWorkingDir() { return workingDir; } @Override - public CommitCmdImpl withWorkingDir(String workingDir) { - checkNotNull(workingDir, "workingDir was not specified"); + public CommitCmdImpl withWorkingDir(String workingDir) { + checkNotNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; } + @Override + public String toString() { + return new ToStringBuilder(this).append("commit ").append(author != null ? "--author " + author + " " : "") + .append(message != null ? "--message " + message + " " : "").append(containerId) + .append(repository != null ? " " + repository + ":" : " ").append(tag != null ? tag : "").toString(); + } - @Override - public String toString() { - return new ToStringBuilder(this).append("commit ") - .append(author != null ? "--author " + author + " " : "") - .append(message != null ? "--message " + message + " " : "") - .append(containerId) - .append(repository != null ? " " + repository + ":" : " ") - .append(tag != null ? tag : "") - .toString(); - } - - /** - * @throws NotFoundException No such container + /** + * @throws NotFoundException + * No such container */ - @Override - public String exec() throws NotFoundException { - return super.exec(); - } + @Override + public String exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index 36286423c..a394c535c 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -13,42 +13,46 @@ /** * Inspect changes on a container's filesystem * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class ContainerDiffCmdImpl extends AbstrDockerCmd> implements ContainerDiffCmd { - private String containerId; + private String containerId; - public ContainerDiffCmdImpl(ContainerDiffCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public ContainerDiffCmdImpl(ContainerDiffCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public ContainerDiffCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public ContainerDiffCmdImpl withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { return new StringBuilder("diff ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container - * @throws InternalServerErrorException server error - * @throws DockerException unexpected http status code + * @throws NotFoundException + * No such container + * @throws InternalServerErrorException + * server error + * @throws DockerException + * unexpected http status code */ - @Override + @Override public List exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index f4f2ae548..ef5f86a7a 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -10,78 +10,75 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; - /** * * Copy files or folders from a container. * */ -public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements CopyFileFromContainerCmd { +public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements + CopyFileFromContainerCmd { + + private String containerId; - private String containerId; - - @JsonProperty("HostPath") + @JsonProperty("HostPath") private String hostPath = "."; @JsonProperty("Resource") private String resource; - public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { - super(exec); - withContainerId(containerId); - withResource(resource); - } + public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { + super(exec); + withContainerId(containerId); + withResource(resource); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getResource() { + public String getResource() { return resource; } @Override - public CopyFileFromContainerCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public CopyFileFromContainerCmdImpl withResource(String resource) { - checkNotNull(resource, "resource was not specified"); - this.resource = resource; - return this; - } - - @Override - public String getHostPath() { - return hostPath; - } - - @Override - public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { - checkNotNull(hostPath, "hostPath was not specified"); - this.hostPath = hostPath; - return this; - } - - @Override + public CopyFileFromContainerCmdImpl withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public CopyFileFromContainerCmdImpl withResource(String resource) { + checkNotNull(resource, "resource was not specified"); + this.resource = resource; + return this; + } + + @Override + public String getHostPath() { + return hostPath; + } + + @Override + public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { + checkNotNull(hostPath, "hostPath was not specified"); + this.hostPath = hostPath; + return this; + } + + @Override public String toString() { - return new ToStringBuilder(this).append("cp ") - .append(containerId) - .append(":") - .append(resource) - .toString(); + return new ToStringBuilder(this).append("cp ").append(containerId).append(":").append(resource).toString(); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public InputStream exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index daa883f94..3ed2f912e 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -12,72 +12,75 @@ /** * Create an image by importing the given stream of a tar file. */ -public class CreateImageCmdImpl extends AbstrDockerCmd implements CreateImageCmd { +public class CreateImageCmdImpl extends AbstrDockerCmd implements CreateImageCmd { - private String repository, tag; - - private InputStream imageStream; + private String repository, tag; - /** - * @param repository the repository to import to - * @param imageStream the InputStream of the tar file - */ - public CreateImageCmdImpl(CreateImageCmd.Exec exec, String repository, InputStream imageStream) { - super(exec); - withRepository(repository); - withImageStream(imageStream); - } + private InputStream imageStream; + + /** + * @param repository + * the repository to import to + * @param imageStream + * the InputStream of the tar file + */ + public CreateImageCmdImpl(CreateImageCmd.Exec exec, String repository, InputStream imageStream) { + super(exec); + withRepository(repository); + withImageStream(imageStream); + } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } - + @Override public InputStream getImageStream() { - return imageStream; + return imageStream; } /** - * @param repository the repository to import to - */ - @Override - public CreateImageCmdImpl withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } + * @param repository + * the repository to import to + */ + @Override + public CreateImageCmdImpl withRepository(String repository) { + checkNotNull(repository, "repository was not specified"); + this.repository = repository; + return this; + } - /** - * @param imageStream the InputStream of the tar file - */ - @Override - public CreateImageCmdImpl withImageStream(InputStream imageStream) { - checkNotNull(imageStream, "imageStream was not specified"); - this.imageStream = imageStream; - return this; - } + /** + * @param imageStream + * the InputStream of the tar file + */ + @Override + public CreateImageCmdImpl withImageStream(InputStream imageStream) { + checkNotNull(imageStream, "imageStream was not specified"); + this.imageStream = imageStream; + return this; + } - /** - * @param tag any tag for this image - */ - @Override - public CreateImageCmdImpl withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } + /** + * @param tag + * any tag for this image + */ + @Override + public CreateImageCmdImpl withTag(String tag) { + checkNotNull(tag, "tag was not specified"); + this.tag = tag; + return this; + } - @Override + @Override public String toString() { - return new ToStringBuilder(this).append("import - ") - .append(repository != null ? repository + ":" : "") - .append(tag != null ? tag : "") - .toString(); + return new ToStringBuilder(this).append("import - ").append(repository != null ? repository + ":" : "") + .append(tag != null ? tag : "").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 index b8975224f..ffa71d6c9 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java +++ b/src/main/java/com/github/dockerjava/core/command/EventStreamReader.java @@ -8,7 +8,9 @@ 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) { diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index 65b86ed9a..3b00d22c5 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -30,10 +30,10 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); } - + @Override public ExecCreateCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); + checkNotNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -43,7 +43,7 @@ public ExecCreateCmd withAttachStdin(boolean attachStdin) { this.attachStdin = attachStdin; return this; } - + @Override public ExecCreateCmd withAttachStdin() { return withAttachStdin(true); @@ -54,7 +54,7 @@ public ExecCreateCmd withAttachStdout(boolean attachStdout) { this.attachStdout = attachStdout; return this; } - + @Override public ExecCreateCmd withAttachStdout() { return withAttachStdout(true); @@ -65,18 +65,18 @@ public ExecCreateCmd withAttachStderr(boolean attachStderr) { this.attachStderr = attachStderr; return this; } - + @Override public ExecCreateCmd withAttachStderr() { return withAttachStderr(true); } - + @Override public ExecCreateCmd withTty(boolean tty) { this.tty = tty; return this; } - + @Override public ExecCreateCmd withTty() { return withTty(true); @@ -92,34 +92,34 @@ public ExecCreateCmd withCmd(String... cmd) { public String getContainerId() { return containerId; } - + @Override - public boolean hasAttachStdinEnabled() { - return attachStdin; - } + public boolean hasAttachStdinEnabled() { + return attachStdin; + } - @Override - public boolean hasAttachStdoutEnabled() { - return attachStdout; - } + @Override + public boolean hasAttachStdoutEnabled() { + return attachStdout; + } - @Override - public boolean hasAttachStderrEnabled() { - return attachStderr; - } + @Override + public boolean hasAttachStderrEnabled() { + return attachStderr; + } - @Override - public boolean hasTtyEnabled() { - return tty; - } + @Override + public boolean hasTtyEnabled() { + return tty; + } /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ @Override public ExecCreateCmdResponse exec() throws NotFoundException { return super.exec(); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 193a2cb69..a479a91f2 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -22,13 +22,13 @@ public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { public String getExecId() { return execId; } - + @Override - public ExecStartCmd withExecId(String execId) { - checkNotNull(execId, "execId was not specified"); - this.execId = execId; - return this; - } + public ExecStartCmd withExecId(String execId) { + checkNotNull(execId, "execId was not specified"); + this.execId = execId; + return this; + } @Override public boolean hasDetachEnabled() { @@ -41,33 +41,34 @@ public boolean hasTtyEnabled() { } @Override - public ExecStartCmd withDetach(boolean detach) { - this.detach = detach; - return this; - } - - @Override - public ExecStartCmd withTty(boolean tty) { - this.tty = tty; - return this; - } - - @Override - public ExecStartCmd withDetach() { - return withDetach(true); - } - - @Override - public ExecStartCmd withTty() { - return withTty(true); - } - + public ExecStartCmd withDetach(boolean detach) { + this.detach = detach; + return this; + } + + @Override + public ExecStartCmd withTty(boolean tty) { + this.tty = tty; + return this; + } + + @Override + public ExecStartCmd withDetach() { + return withDetach(true); + } + + @Override + public ExecStartCmd withTty() { + return withTty(true); + } + /** - * @throws com.github.dockerjava.api.NotFoundException No such exec instance + * @throws com.github.dockerjava.api.NotFoundException + * No such exec instance */ @Override public InputStream exec() throws NotFoundException { return super.exec(); } - + } 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 69114dae8..3f8aad9e8 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -83,6 +83,4 @@ public void close() throws IOException { inputStream.close(); } - - } diff --git a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java index 767da2049..f2dd3ca82 100644 --- a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java @@ -6,13 +6,13 @@ /** * Return Docker server info */ -public class InfoCmdImpl extends AbstrDockerCmd implements InfoCmd { +public class InfoCmdImpl extends AbstrDockerCmd implements InfoCmd { - public InfoCmdImpl(InfoCmd.Exec exec) { - super(exec); - } - - @Override + public InfoCmdImpl(InfoCmd.Exec exec) { + super(exec); + } + + @Override public String toString() { return "info"; } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index 9215f233a..c3fe5f6d5 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -9,37 +9,39 @@ /** * Inspect the details of a container. */ -public class InspectContainerCmdImpl extends AbstrDockerCmd implements InspectContainerCmd { +public class InspectContainerCmdImpl extends AbstrDockerCmd implements + InspectContainerCmd { - private String containerId; + private String containerId; - public InspectContainerCmdImpl(InspectContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public InspectContainerCmdImpl(InspectContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public InspectContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public InspectContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } @Override public String toString() { return "inspect " + containerId; } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public InspectContainerResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 1fd728622..55fad8c9c 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -32,7 +32,8 @@ public String toString() { } /** - * @throws NotFoundException No such exec + * @throws NotFoundException + * No such exec */ @Override public InspectExecResponse exec() throws NotFoundException { diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 0b477e80e..3e28bd488 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -6,41 +6,42 @@ import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; - /** * Inspect the details of an image. */ -public class InspectImageCmdImpl extends AbstrDockerCmd implements InspectImageCmd { +public class InspectImageCmdImpl extends AbstrDockerCmd implements + InspectImageCmd { - private String imageId; + private String imageId; - public InspectImageCmdImpl(InspectImageCmd.Exec exec, String imageId) { - super(exec); - withImageId(imageId); - } + public InspectImageCmdImpl(InspectImageCmd.Exec exec, String imageId) { + super(exec); + withImageId(imageId); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public InspectImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } + public InspectImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } @Override public String toString() { return "inspect " + imageId; } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ - @Override + @Override public InspectImageResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index c6175a8a6..05e709f37 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -5,53 +5,53 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; - /** * Kill a running container. */ public class KillContainerCmdImpl extends AbstrDockerCmd implements KillContainerCmd { - private String containerId, signal; + private String containerId, signal; - public KillContainerCmdImpl(KillContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public KillContainerCmdImpl(KillContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getSignal() { + public String getSignal() { return signal; } @Override - public KillContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public KillContainerCmd withSignal(String signal) { - checkNotNull(signal, "signal was not specified"); - this.signal = signal; - return this; - } + public KillContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public KillContainerCmd withSignal(String signal) { + checkNotNull(signal, "signal was not specified"); + this.signal = signal; + return this; + } @Override public String toString() { return "kill " + containerId; } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 7144e767f..13bb02cfb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -8,95 +8,97 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; - /** * List containers * - * @param showAll - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - true or false, Show the containers sizes. This is false by default. - * @param limit - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - Show only containers created since Id, include non-running ones. - * @param beforeId - Show only containers created before Id, include non-running ones. + * @param showAll + * - true or false, Show all containers. Only running containers are shown by default. + * @param showSize + * - true or false, Show the containers sizes. This is false by default. + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + * @param sinceId + * - Show only containers created since Id, include non-running ones. + * @param beforeId + * - Show only containers created before Id, include non-running ones. * */ -public class ListContainersCmdImpl extends AbstrDockerCmd> implements ListContainersCmd { - - private int limit = -1; - - private boolean showSize, showAll = false; - - private String sinceId, beforeId; - - public ListContainersCmdImpl(ListContainersCmd.Exec exec) { - super(exec); - } +public class ListContainersCmdImpl extends AbstrDockerCmd> implements + ListContainersCmd { + + private int limit = -1; + + private boolean showSize, showAll = false; + + private String sinceId, beforeId; + + public ListContainersCmdImpl(ListContainersCmd.Exec exec) { + super(exec); + } @Override - public int getLimit() { + public int getLimit() { return limit; } @Override - public boolean hasShowSizeEnabled() { + public boolean hasShowSizeEnabled() { return showSize; } @Override - public boolean hasShowAllEnabled() { + public boolean hasShowAllEnabled() { return showAll; } @Override - public String getSinceId() { + public String getSinceId() { return sinceId; } @Override - public String getBeforeId() { + public String getBeforeId() { return beforeId; } @Override - public ListContainersCmd withShowAll(boolean showAll) { - this.showAll = showAll; - return this; - } - - @Override - public ListContainersCmd withShowSize(boolean showSize) { - this.showSize = showSize; - return this; - } - - @Override - public ListContainersCmd withLimit(int limit) { - checkArgument(limit > 0, "limit must be greater 0"); - this.limit = limit; - return this; - } - - @Override - public ListContainersCmd withSince(String since) { - checkNotNull(since, "since was not specified"); - this.sinceId = since; - return this; - } - - @Override - public ListContainersCmd withBefore(String before) { - checkNotNull(before, "before was not specified"); - this.beforeId = before; - return this; - } + public ListContainersCmd withShowAll(boolean showAll) { + this.showAll = showAll; + return this; + } + + @Override + public ListContainersCmd withShowSize(boolean showSize) { + this.showSize = showSize; + return this; + } + + @Override + public ListContainersCmd withLimit(int limit) { + checkArgument(limit > 0, "limit must be greater 0"); + this.limit = limit; + return this; + } + + @Override + public ListContainersCmd withSince(String since) { + checkNotNull(since, "since was not specified"); + this.sinceId = since; + return this; + } + + @Override + public ListContainersCmd withBefore(String before) { + checkNotNull(before, "before was not specified"); + this.beforeId = before; + return this; + } @Override public String toString() { - return new StringBuilder("ps ") - .append(showAll ? "--all=true" : "") - .append(showSize ? "--size=true" : "") - .append(sinceId != null ? "--since " + sinceId : "") - .append(beforeId != null ? "--before " + beforeId : "") - .append(limit != -1 ? "-n " + limit : "") - .toString(); + return new StringBuilder("ps ").append(showAll ? "--all=true" : "").append(showSize ? "--size=true" : "") + .append(sinceId != null ? "--since " + sinceId : "") + .append(beforeId != null ? "--before " + beforeId : "").append(limit != -1 ? "-n " + limit : "") + .toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 998dded5d..ddd4dc79f 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -10,47 +10,47 @@ /** * List images * - * @param showAll - Show all images (by default filter out the intermediate images used to build) - * @param filters - a json encoded value of the filters (a map[string][]string) to process on the images list. + * @param showAll + * - Show all images (by default filter out the intermediate images used to build) + * @param filters + * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ -public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { +public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { - private String filters; + private String filters; - private boolean showAll = false; + private boolean showAll = false; - public ListImagesCmdImpl(ListImagesCmd.Exec exec) { - super(exec); - } + public ListImagesCmdImpl(ListImagesCmd.Exec exec) { + super(exec); + } @Override - public String getFilters() { + public String getFilters() { return filters; } @Override - public boolean hasShowAllEnabled() { + public boolean hasShowAllEnabled() { return showAll; } @Override - public ListImagesCmd withShowAll(boolean showAll) { - this.showAll = showAll; - return this; - } - - @Override - public ListImagesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; - return this; - } + public ListImagesCmd withShowAll(boolean showAll) { + this.showAll = showAll; + return this; + } + + @Override + public ListImagesCmd withFilters(String filter) { + checkNotNull(filter, "filters have not been specified"); + this.filters = filter; + return this; + } @Override public String toString() { - return new StringBuilder("images ") - .append(showAll ? "--all=true" : "") - .append(filters != null ? "--filter " + filters : "") - .toString(); + return new StringBuilder("images ").append(showAll ? "--all=true" : "") + .append(filters != null ? "--filter " + filters : "").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 bd518ddb7..01d1e6494 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -20,29 +20,28 @@ * @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. * @param tail - * - `all` or ``, Output specified number of lines at the end of logs + * - `all` or ``, Output specified number of lines at the end of logs */ public class LogContainerCmdImpl extends AbstrDockerCmd implements LogContainerCmd { private ResultCallback resultCallback; - private String containerId; + private String containerId; - private int tail = -1; + private int tail = -1; - private boolean followStream, timestamps, stdout, stderr; + private boolean followStream, timestamps, stdout, stderr; - public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { - super(exec); - withContainerId(containerId); - withResultCallback(resultCallback); - } + public LogContainerCmdImpl(LogContainerCmd.Exec exec, String containerId, ResultCallback resultCallback) { + super(exec); + withContainerId(containerId); + withResultCallback(resultCallback); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @@ -59,110 +58,106 @@ public LogContainerCmd withResultCallback(ResultCallback resultCallback) } @Override - public int getTail() { + public int getTail() { return tail; } @Override - public boolean hasFollowStreamEnabled() { + public boolean hasFollowStreamEnabled() { return followStream; } @Override - public boolean hasTimestampsEnabled() { + public boolean hasTimestampsEnabled() { return timestamps; } @Override - public boolean hasStdoutEnabled() { + public boolean hasStdoutEnabled() { return stdout; } @Override - public boolean hasStderrEnabled() { + public boolean hasStderrEnabled() { return stderr; } @Override - public LogContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - - @Override - public LogContainerCmd withFollowStream() { - return withFollowStream(true); - } + public LogContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public LogContainerCmd withFollowStream(boolean followStream) { - this.followStream = followStream; - return this; - } + @Override + public LogContainerCmd withFollowStream() { + return withFollowStream(true); + } - @Override - public LogContainerCmd withTimestamps() { - return withTimestamps(true); - } + @Override + public LogContainerCmd withFollowStream(boolean followStream) { + this.followStream = followStream; + return this; + } - @Override - public LogContainerCmd withTimestamps(boolean timestamps) { - this.timestamps = timestamps; - return this; - } + @Override + public LogContainerCmd withTimestamps() { + return withTimestamps(true); + } - @Override - public LogContainerCmd withStdOut() { - return withStdOut(true); - } + @Override + public LogContainerCmd withTimestamps(boolean timestamps) { + this.timestamps = timestamps; + return this; + } - @Override - public LogContainerCmd withStdOut(boolean stdout) { - this.stdout = stdout; - return this; - } + @Override + public LogContainerCmd withStdOut() { + return withStdOut(true); + } - @Override - public LogContainerCmd withStdErr() { - return withStdErr(true); - } + @Override + public LogContainerCmd withStdOut(boolean stdout) { + this.stdout = stdout; + return this; + } - @Override - public LogContainerCmd withStdErr(boolean stderr) { - this.stderr = stderr; - return this; - } + @Override + public LogContainerCmd withStdErr() { + return withStdErr(true); + } - @Override - public LogContainerCmd withTailAll() { - this.tail = -1; - return this; - } + @Override + public LogContainerCmd withStdErr(boolean stderr) { + this.stderr = stderr; + return this; + } + @Override + public LogContainerCmd withTailAll() { + this.tail = -1; + return this; + } - @Override - public LogContainerCmd withTail(int tail) { - this.tail = tail; - return this; - } + @Override + public LogContainerCmd withTail(int tail) { + this.tail = tail; + return this; + } @Override public String toString() { - return new StringBuilder("logs ") - .append(followStream ? "--follow=true" : "") - .append(timestamps ? "--timestamps=true" : "") - .append(containerId) - .toString(); + return new StringBuilder("logs ").append(followStream ? "--follow=true" : "") + .append(timestamps ? "--timestamps=true" : "").append(containerId).toString(); } /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index 5ea60fe86..81a30dcde 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -8,42 +8,42 @@ /** * Pause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class PauseContainerCmdImpl extends AbstrDockerCmd implements PauseContainerCmd { - private String containerId; + private String containerId; - public PauseContainerCmdImpl(PauseContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public PauseContainerCmdImpl(PauseContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public PauseContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public PauseContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { - return new StringBuilder("pause ") - .append(containerId) - .toString(); + return new StringBuilder("pause ").append(containerId).toString(); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); } - - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java index 15cc1f5b3..c9118a095 100644 --- a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java @@ -8,7 +8,7 @@ */ public class PingCmdImpl extends AbstrDockerCmd implements PingCmd { - public PingCmdImpl(PingCmd.Exec exec) { - super(exec); - } + public PingCmdImpl(PingCmd.Exec exec) { + super(exec); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index d1d4ee026..488562b99 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -16,52 +16,49 @@ public class PullImageCmdImpl extends AbstrAuthCfgDockerCmd implements PushImageCmd { +public class PushImageCmdImpl extends AbstrAuthCfgDockerCmd implements + PushImageCmd { private String name; + private String tag; public PushImageCmdImpl(PushImageCmd.Exec exec, String name) { - super(exec); - withName(name); + super(exec); + withName(name); } @Override - public String getName() { + public String getName() { return name; } @@ -31,17 +34,19 @@ public String getTag() { } /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. - */ - @Override - public PushImageCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; - } + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + @Override + public PushImageCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } /** - * @param tag The image's tag. Can be null or empty. + * @param tag + * The image's tag. Can be null or empty. */ @Override public PushImageCmd withTag(String tag) { @@ -52,16 +57,15 @@ public PushImageCmd withTag(String tag) { @Override public String toString() { - return new StringBuilder("push ") - .append(name) - .toString(); + return new StringBuilder("push ").append(name).toString(); } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ @Override public Response exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 7cd063956..ff23023d2 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -8,72 +8,73 @@ /** * Remove a container. * - * @param removeVolumes - true or false, Remove the volumes associated to the container. Defaults to false - * @param force - true or false, Removes the container even if it was running. Defaults to false + * @param removeVolumes + * - true or false, Remove the volumes associated to the container. Defaults to false + * @param force + * - true or false, Removes the container even if it was running. Defaults to false */ -public class RemoveContainerCmdImpl extends AbstrDockerCmd implements RemoveContainerCmd { +public class RemoveContainerCmdImpl extends AbstrDockerCmd implements RemoveContainerCmd { - private String containerId; + private String containerId; - private boolean removeVolumes, force; + private boolean removeVolumes, force; - public RemoveContainerCmdImpl(RemoveContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public RemoveContainerCmdImpl(RemoveContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } - @Override - public String getContainerId() { - return containerId; - } + @Override + public String getContainerId() { + return containerId; + } - @Override - public boolean hasRemoveVolumesEnabled() { - return removeVolumes; - } + @Override + public boolean hasRemoveVolumesEnabled() { + return removeVolumes; + } - @Override - public boolean hasForceEnabled() { - return force; - } + @Override + public boolean hasForceEnabled() { + return force; + } - @Override - public RemoveContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + @Override + public RemoveContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes) { - this.removeVolumes = removeVolumes; - return this; - } + @Override + public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes) { + this.removeVolumes = removeVolumes; + return this; + } - @Override - public RemoveContainerCmd withForce() { - return withForce(true); - } + @Override + public RemoveContainerCmd withForce() { + return withForce(true); + } - @Override - public RemoveContainerCmd withForce(boolean force) { - this.force = force; - return this; - } + @Override + public RemoveContainerCmd withForce(boolean force) { + this.force = force; + return this; + } - @Override - public String toString() { - return new StringBuilder("rm ") - .append(removeVolumes ? "--volumes=true" : "") - .append(force ? "--force=true" : "").append(containerId) - .toString(); - } + @Override + public String toString() { + return new StringBuilder("rm ").append(removeVolumes ? "--volumes=true" : "") + .append(force ? "--force=true" : "").append(containerId).toString(); + } - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 87e096aae..ee9e7f33b 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -12,73 +12,71 @@ */ public class RemoveImageCmdImpl extends AbstrDockerCmd implements RemoveImageCmd { - private String imageId; + private String imageId; - private boolean force, noPrune; + private boolean force, noPrune; - public RemoveImageCmdImpl(RemoveImageCmd.Exec exec, String imageId) { - super(exec); - withImageId(imageId); - } + public RemoveImageCmdImpl(RemoveImageCmd.Exec exec, String imageId) { + super(exec); + withImageId(imageId); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public boolean hasForceEnabled() { + public boolean hasForceEnabled() { return force; } @Override - public boolean hasNoPruneEnabled() { + public boolean hasNoPruneEnabled() { return noPrune; } @Override - public RemoveImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } - - @Override - public RemoveImageCmd withForce() { - return withForce(true); - } - - @Override - public RemoveImageCmd withForce(boolean force) { - this.force = force; - return this; - } - - @Override - public RemoveImageCmd withNoPrune() { - return withNoPrune(true); - } - - @Override - public RemoveImageCmd withNoPrune(boolean noPrune) { - this.noPrune = noPrune; - return this; - } + public RemoveImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } + + @Override + public RemoveImageCmd withForce() { + return withForce(true); + } + + @Override + public RemoveImageCmd withForce(boolean force) { + this.force = force; + return this; + } + + @Override + public RemoveImageCmd withNoPrune() { + return withNoPrune(true); + } + + @Override + public RemoveImageCmd withNoPrune(boolean noPrune) { + this.noPrune = noPrune; + return this; + } @Override public String toString() { - return new StringBuilder("rmi ") - .append(noPrune ? "--no-prune=true" : "") - .append(force ? "--force=true" : "") - .append(imageId) - .toString(); + return new StringBuilder("rmi ").append(noPrune ? "--no-prune=true" : "").append(force ? "--force=true" : "") + .append(imageId).toString(); } - + /** - * @throws NotFoundException No such image + * @throws NotFoundException + * No such image */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index adcac9b4c..4766dfdb4 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -9,57 +9,56 @@ /** * Restart a running container. * - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public class RestartContainerCmdImpl extends AbstrDockerCmd implements RestartContainerCmd { - private String containerId; + private String containerId; - private int timeout = 10; + private int timeout = 10; - public RestartContainerCmdImpl(RestartContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public RestartContainerCmdImpl(RestartContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public int getTimeout() { + public int getTimeout() { return timeout; } @Override - public RestartContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public RestartContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public RestartContainerCmd withtTimeout(int timeout) { - checkArgument(timeout >= 0, "timeout must be greater or equal 0"); - this.timeout = timeout; - return this; - } + @Override + public RestartContainerCmd withtTimeout(int timeout) { + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + this.timeout = timeout; + return this; + } @Override public String toString() { - return new StringBuilder("restart ") - .append("--time=" + timeout + " ") - .append(containerId) - .toString(); + return new StringBuilder("restart ").append("--time=" + timeout + " ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public Void exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 30bb13b2f..ab87c2ea8 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -9,6 +9,7 @@ public class SaveImageCmdImpl extends AbstrDockerCmd implements SaveImageCmd { private String name; + private String tag; public SaveImageCmdImpl(SaveImageCmd.Exec exec, String name) { @@ -27,7 +28,8 @@ public String getTag() { } /** - * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ @Override public SaveImageCmd withName(String name) { @@ -37,7 +39,8 @@ public SaveImageCmd withName(String name) { } /** - * @param tag The image's tag. Can be null or empty. + * @param tag + * The image's tag. Can be null or empty. */ @Override public SaveImageCmd withTag(String tag) { @@ -48,13 +51,12 @@ public SaveImageCmd withTag(String tag) { @Override public String toString() { - return new StringBuilder("get ") - .append(name) - .toString(); + return new StringBuilder("get ").append(name).toString(); } /** - * @throws com.github.dockerjava.api.NotFoundException No such image + * @throws com.github.dockerjava.api.NotFoundException + * No such image */ @Override public InputStream exec() throws NotFoundException { diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 82c94e49f..6630377c8 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -10,34 +10,33 @@ /** * Search images * - * @param term - search term + * @param term + * - search term * */ -public class SearchImagesCmdImpl extends AbstrDockerCmd> implements SearchImagesCmd { +public class SearchImagesCmdImpl extends AbstrDockerCmd> implements SearchImagesCmd { - private String term; + private String term; - public SearchImagesCmdImpl(SearchImagesCmd.Exec exec, String term) { - super(exec); - withTerm(term); - } + public SearchImagesCmdImpl(SearchImagesCmd.Exec exec, String term) { + super(exec); + withTerm(term); + } @Override - public String getTerm() { + public String getTerm() { return term; } @Override - public SearchImagesCmd withTerm(String term) { - checkNotNull(term, "term was not specified"); - this.term = term; - return this; - } + public SearchImagesCmd withTerm(String term) { + checkNotNull(term, "term was not specified"); + this.term = term; + return this; + } @Override public String toString() { - return new StringBuilder("search ") - .append(term) - .toString(); + return new StringBuilder("search ").append(term).toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index e961bf8ba..28373e2ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -10,59 +10,60 @@ /** * Stop a running container. * - * @param containerId - Id of the container - * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + * @param containerId + * - Id of the container + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. * */ public class StopContainerCmdImpl extends AbstrDockerCmd implements StopContainerCmd { - private String containerId; + private String containerId; - private int timeout = 10; + private int timeout = 10; - public StopContainerCmdImpl(StopContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public StopContainerCmdImpl(StopContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public int getTimeout() { + public int getTimeout() { return timeout; } @Override - public StopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public StopContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public StopContainerCmd withTimeout(int timeout) { - checkArgument(timeout >= 0, "timeout must be greater or equal 0"); - this.timeout = timeout; - return this; - } + @Override + public StopContainerCmd withTimeout(int timeout) { + checkArgument(timeout >= 0, "timeout must be greater or equal 0"); + this.timeout = timeout; + return this; + } @Override public String toString() { - return new StringBuilder("stop ") - .append("--time=" + timeout + " ") - .append(containerId) - .toString(); + return new StringBuilder("stop ").append("--time=" + timeout + " ").append(containerId).toString(); } - + /** - * @throws NotFoundException No such container - * @throws NotModifiedException Container already stopped - */ - @Override - public Void exec() throws NotFoundException, NotModifiedException { - return super.exec(); - } + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already stopped + */ + @Override + public Void exec() throws NotFoundException, NotModifiedException { + return super.exec(); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index 8655ddfe8..e31151147 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -4,87 +4,86 @@ import com.github.dockerjava.api.command.TagImageCmd; - /** * Tag an image into a repository * - * @param image The local image to tag (either a name or an id) - * @param repository The repository to tag in - * @param force (not documented) + * @param image + * The local image to tag (either a name or an id) + * @param repository + * The repository to tag in + * @param force + * (not documented) * */ -public class TagImageCmdImpl extends AbstrDockerCmd implements TagImageCmd { +public class TagImageCmdImpl extends AbstrDockerCmd implements TagImageCmd { - private String imageId, repository, tag; + private String imageId, repository, tag; - private boolean force; + private boolean force; - public TagImageCmdImpl(TagImageCmd.Exec exec, String imageId, String repository, String tag) { - super(exec); - withImageId(imageId); - withRepository(repository); - withTag(tag); - } + public TagImageCmdImpl(TagImageCmd.Exec exec, String imageId, String repository, String tag) { + super(exec); + withImageId(imageId); + withRepository(repository); + withTag(tag); + } @Override - public String getImageId() { + public String getImageId() { return imageId; } @Override - public String getRepository() { + public String getRepository() { return repository; } @Override - public String getTag() { + public String getTag() { return tag; } @Override - public boolean hasForceEnabled() { + public boolean hasForceEnabled() { return force; } @Override - public TagImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; - return this; - } - - @Override - public TagImageCmd withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; - return this; - } - - @Override - public TagImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; - return this; - } - - @Override - public TagImageCmd withForce() { - return withForce(true); - } - - @Override - public TagImageCmd withForce(boolean force) { - this.force = force; - return this; - } + public TagImageCmd withImageId(String imageId) { + checkNotNull(imageId, "imageId was not specified"); + this.imageId = imageId; + return this; + } + + @Override + public TagImageCmd withRepository(String repository) { + checkNotNull(repository, "repository was not specified"); + this.repository = repository; + return this; + } + + @Override + public TagImageCmd withTag(String tag) { + checkNotNull(tag, "tag was not specified"); + this.tag = tag; + return this; + } + + @Override + public TagImageCmd withForce() { + return withForce(true); + } + + @Override + public TagImageCmd withForce(boolean force) { + this.force = force; + return this; + } @Override public String toString() { - return new StringBuilder("tag ") - .append(force ? "--force=true " : "") - .append(repository != null ? repository + "/" : "") - .append(imageId) - .append(tag != null ? ":" + tag : "") - .toString(); + return new StringBuilder("tag ").append(force ? "--force=true " : "") + .append(repository != null ? repository + "/" : "").append(imageId) + .append(tag != null ? ":" + tag : "").toString(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 5f7190fb4..b4414f29e 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -9,55 +9,53 @@ /** * List processes running inside a container */ -public class TopContainerCmdImpl extends AbstrDockerCmd implements TopContainerCmd { +public class TopContainerCmdImpl extends AbstrDockerCmd implements + TopContainerCmd { - private String containerId; + private String containerId; - private String psArgs; + private String psArgs; - public TopContainerCmdImpl(TopContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public TopContainerCmdImpl(TopContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public String getPsArgs() { + public String getPsArgs() { return psArgs; } @Override - public TopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } - + public TopContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override - public TopContainerCmd withPsArgs(String psArgs) { - checkNotNull(psArgs, "psArgs was not specified"); - this.psArgs = psArgs; - return this; - } + @Override + public TopContainerCmd withPsArgs(String psArgs) { + checkNotNull(psArgs, "psArgs was not specified"); + this.psArgs = psArgs; + return this; + } @Override public String toString() { - return new StringBuilder("top ") - .append(containerId) - .append(psArgs != null ? " " + psArgs : "") - .toString(); + return new StringBuilder("top ").append(containerId).append(psArgs != null ? " " + psArgs : "").toString(); } /** - * @throws NotFoundException No such container + * @throws NotFoundException + * No such container */ - @Override + @Override public TopContainerResponse exec() throws NotFoundException { - return super.exec(); + return super.exec(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 92d715bcc..583d519c8 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -8,42 +8,42 @@ /** * Unpause a container. * - * @param containerId - Id of the container + * @param containerId + * - Id of the container * */ public class UnpauseContainerCmdImpl extends AbstrDockerCmd implements UnpauseContainerCmd { - private String containerId; + private String containerId; - public UnpauseContainerCmdImpl(UnpauseContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public UnpauseContainerCmdImpl(UnpauseContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public UnpauseContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public UnpauseContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } - @Override + @Override public String toString() { - return new StringBuilder("pause ") - .append(containerId) - .toString(); + return new StringBuilder("pause ").append(containerId).toString(); + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); } - - /** - * @throws NotFoundException No such container - */ - @Override - public Void exec() throws NotFoundException { - return super.exec(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java index 211ed1406..67f46ce3a 100644 --- a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java @@ -6,14 +6,14 @@ /** * Returns the Docker version info. */ -public class VersionCmdImpl extends AbstrDockerCmd implements VersionCmd { +public class VersionCmdImpl extends AbstrDockerCmd implements VersionCmd { - @Override + @Override public String toString() { return "version"; - } - + } + public VersionCmdImpl(VersionCmd.Exec exec) { - super(exec); - } + super(exec); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index d6250cc6f..702eebd33 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -11,24 +11,24 @@ */ public class WaitContainerCmdImpl extends AbstrDockerCmd implements WaitContainerCmd { - private String containerId; + private String containerId; - public WaitContainerCmdImpl(WaitContainerCmd.Exec exec, String containerId) { - super(exec); - withContainerId(containerId); - } + public WaitContainerCmdImpl(WaitContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } @Override - public String getContainerId() { + public String getContainerId() { return containerId; } @Override - public WaitContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; - return this; - } + public WaitContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } @Override public String toString() { 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 802299a7c..5997bbefa 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -31,213 +31,201 @@ */ public class Dockerfile { - public final File dockerFile; + public final File dockerFile; - public Dockerfile(File dockerFile) { + public Dockerfile(File dockerFile) { - if (!dockerFile.exists()) { - throw new IllegalStateException( - String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); - } - - if (!dockerFile.isFile()) { - throw new IllegalStateException( - String.format("Dockerfile %s is not a file", dockerFile.getAbsolutePath())); - } - - this.dockerFile = dockerFile; - - } - - private static class LineTransformer - implements Function> { + if (!dockerFile.exists()) { + throw new IllegalStateException(String.format("Dockerfile %s does not exist", dockerFile.getAbsolutePath())); + } - private int line = 0; + if (!dockerFile.isFile()) { + throw new IllegalStateException(String.format("Dockerfile %s is not a file", dockerFile.getAbsolutePath())); + } - @Override - public Optional apply(String input) { - try { - line++; - return DockerfileStatement.createFromLine(input); + this.dockerFile = dockerFile; - } catch (Exception ex) { - throw new DockerClientException("Error on dockerfile line " + line); - } } - } - public Iterable getStatements() throws IOException { - Collection dockerFileContent = FileUtils.readLines(dockerFile); + private static class LineTransformer implements Function> { - if (dockerFileContent.size() <= 0) { - throw new DockerClientException(String.format( - "Dockerfile %s is empty", dockerFile)); - } + private int line = 0; - Collection> optionals = Collections2 - .transform(dockerFileContent, new LineTransformer()); - - return Optional.presentInstances(optionals); - } - - public List getIgnores() throws IOException { - List ignores = new ArrayList(); - File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); - if (dockerIgnoreFile.exists()) { - int lineNumber = 0; - List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); - for (String pattern : dockerIgnoreFileContent) { - lineNumber++; - pattern = pattern.trim(); - if (pattern.isEmpty()) { - continue; // skip empty lines - } - pattern = FilenameUtils.normalize(pattern); - try { - // validate pattern and make sure we aren't excluding Dockerfile - if (GoLangFileMatch.match(pattern, "Dockerfile")) { - throw new DockerClientException( - String.format( - "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", - pattern, lineNumber)); - } - ignores.add(pattern); - } catch (GoLangFileMatchException e) { - throw new DockerClientException(String.format( - "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + @Override + public Optional apply(String input) { + try { + line++; + return DockerfileStatement.createFromLine(input); + + } catch (Exception ex) { + throw new DockerClientException("Error on dockerfile line " + line); + } } - } } - return ignores; - } + public Iterable getStatements() throws IOException { + Collection dockerFileContent = FileUtils.readLines(dockerFile); - public ScannedResult parse() throws IOException { - return new ScannedResult(); - } - + if (dockerFileContent.size() <= 0) { + throw new DockerClientException(String.format("Dockerfile %s is empty", dockerFile)); + } - public File getDockerFolder() { - return dockerFile.getParentFile(); - } + Collection> optionals = Collections2.transform(dockerFileContent, + new LineTransformer()); + return Optional.presentInstances(optionals); + } - /** - * Result of scanning / parsing a docker file. - */ - public class ScannedResult { + public List getIgnores() throws IOException { + List ignores = new ArrayList(); + File dockerIgnoreFile = new File(getDockerFolder(), ".dockerignore"); + if (dockerIgnoreFile.exists()) { + int lineNumber = 0; + List dockerIgnoreFileContent = FileUtils.readLines(dockerIgnoreFile); + for (String pattern : dockerIgnoreFileContent) { + lineNumber++; + pattern = pattern.trim(); + if (pattern.isEmpty()) { + continue; // skip empty lines + } + pattern = FilenameUtils.normalize(pattern); + try { + // validate pattern and make sure we aren't excluding Dockerfile + if (GoLangFileMatch.match(pattern, "Dockerfile")) { + throw new DockerClientException(String.format( + "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", pattern, + lineNumber)); + } + ignores.add(pattern); + } catch (GoLangFileMatchException e) { + throw new DockerClientException(String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + } + } + } + return ignores; + } - final List ignores; - final Map environmentMap = new HashMap(); - final List filesToAdd = new ArrayList(); + public ScannedResult parse() throws IOException { + return new ScannedResult(); + } - public InputStream buildDockerFolderTar() { - return buildDockerFolderTar(getDockerFolder()); + public File getDockerFolder() { + return dockerFile.getParentFile(); } - public InputStream buildDockerFolderTar(File directory) { + /** + * Result of scanning / parsing a docker file. + */ + public class ScannedResult { - // ARCHIVE TAR - File dockerFolderTar = null; + final List ignores; - try { - String archiveNameWithOutExtension = UUID.randomUUID().toString(); + final Map environmentMap = new HashMap(); - dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, - filesToAdd, - archiveNameWithOutExtension); - return FileUtils.openInputStream(dockerFolderTar); + final List filesToAdd = new ArrayList(); - } catch (IOException ex) { - FileUtils.deleteQuietly(dockerFolderTar); - throw new DockerClientException( - "Error occurred while preparing Docker context folder.", ex); - } - } + public InputStream buildDockerFolderTar() { + return buildDockerFolderTar(getDockerFolder()); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("ignores", ignores) - .add("environmentMap", environmentMap) - .add("filesToAdd", filesToAdd) - .toString(); - } + public InputStream buildDockerFolderTar(File directory) { - public ScannedResult() throws IOException { + // ARCHIVE TAR + File dockerFolderTar = null; - ignores = getIgnores(); - filesToAdd.add(dockerFile); + try { + String archiveNameWithOutExtension = UUID.randomUUID().toString(); - for (DockerfileStatement statement : getStatements()) { - if (statement instanceof DockerfileStatement.Env) { - processEnvStatement((DockerfileStatement.Env) statement); - } else if (statement instanceof DockerfileStatement.Add) { - processAddStatement((DockerfileStatement.Add) statement); - } - } - } + dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, + archiveNameWithOutExtension); + return FileUtils.openInputStream(dockerFolderTar); - private void processAddStatement(DockerfileStatement.Add add) throws IOException { + } catch (IOException ex) { + FileUtils.deleteQuietly(dockerFolderTar); + throw new DockerClientException("Error occurred while preparing Docker context folder.", ex); + } + } - add = add.transform(environmentMap); + @Override + public String toString() { + return Objects.toStringHelper(this).add("ignores", ignores).add("environmentMap", environmentMap) + .add("filesToAdd", filesToAdd).toString(); + } - if (add.isFileResource()) { + public ScannedResult() throws IOException { - File dockerFolder = getDockerFolder(); - String resource = add.source; + ignores = getIgnores(); + filesToAdd.add(dockerFile); - File src = new File(resource); - if (!src.isAbsolute()) { - src = new File(dockerFolder, resource); - } else { - throw new DockerClientException(String.format( - "Source file %s must be relative to %s", - src, dockerFolder)); + for (DockerfileStatement statement : getStatements()) { + if (statement instanceof DockerfileStatement.Env) { + processEnvStatement((DockerfileStatement.Env) statement); + } else if (statement instanceof DockerfileStatement.Add) { + processAddStatement((DockerfileStatement.Add) statement); + } + } } - 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 { - filesToAdd.addAll(resolveWildcards(src, ignores)); + private void processAddStatement(DockerfileStatement.Add add) throws IOException { + + add = add.transform(environmentMap); + + if (add.isFileResource()) { + + File dockerFolder = getDockerFolder(); + String resource = add.source; + + File src = new File(resource); + if (!src.isAbsolute()) { + src = new File(dockerFolder, resource); + } else { + throw new DockerClientException(String.format("Source file %s must be relative to %s", src, + dockerFolder)); + } + + 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 { + filesToAdd.addAll(resolveWildcards(src, ignores)); + } + } } - } - } - private Collection resolveWildcards(File file, List ignores) { - List filesToAdd = new ArrayList(); - - File parent = file.getParentFile(); - if (parent != null) { - if (parent.isDirectory()) { - Collection files = FileUtils.listFiles(parent, - new GoLangMatchFileFilter(parent, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else { - filesToAdd.addAll(resolveWildcards(parent, ignores)); + private Collection resolveWildcards(File file, List ignores) { + List filesToAdd = new ArrayList(); + + File parent = file.getParentFile(); + if (parent != null) { + if (parent.isDirectory()) { + Collection files = FileUtils.listFiles(parent, new GoLangMatchFileFilter(parent, ignores), + TrueFileFilter.INSTANCE); + filesToAdd.addAll(files); + } else { + filesToAdd.addAll(resolveWildcards(parent, ignores)); + } + } else { + throw new DockerClientException(String.format("Source file %s doesn't exist", file)); + } + + return filesToAdd; } - } else { - throw new DockerClientException(String.format( - "Source file %s doesn't exist", file)); - } - return filesToAdd; - } + private void processEnvStatement(DockerfileStatement.Env env) { - private void processEnvStatement(DockerfileStatement.Env env) { + environmentMap.put(env.variable, env.value); + } - environmentMap.put(env.variable, env.value); } - } - } diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index c048f77dd..7b6581e42 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -16,191 +16,182 @@ */ public abstract class DockerfileStatement { - private DockerfileStatement() { - } + private DockerfileStatement() { + } - public T transform(Map env) { - return (T) this; - } + public T transform(Map env) { + return (T) this; + } - protected String filterForEnvironmentVars(Map environmentMap, - String extractedResource) { + protected String filterForEnvironmentVars(Map environmentMap, String extractedResource) { - if (environmentMap.size() > 0) { + if (environmentMap.size() > 0) { - String currentResourceContent = extractedResource; + String currentResourceContent = extractedResource; - for (Map.Entry entry : environmentMap.entrySet()) { + for (Map.Entry entry : environmentMap.entrySet()) { - String variable = entry.getKey(); + String variable = entry.getKey(); - String replacementValue = entry.getValue(); + String replacementValue = entry.getValue(); - // handle: $VARIABLE case - currentResourceContent = currentResourceContent.replaceAll( - "\\$" + variable, Matcher.quoteReplacement(replacementValue)); + // handle: $VARIABLE case + currentResourceContent = currentResourceContent.replaceAll("\\$" + variable, + Matcher.quoteReplacement(replacementValue)); - // handle ${VARIABLE} case - currentResourceContent = currentResourceContent.replaceAll( - "\\$\\{" + variable + "\\}", Matcher.quoteReplacement(replacementValue)); + // handle ${VARIABLE} case + currentResourceContent = currentResourceContent.replaceAll("\\$\\{" + variable + "\\}", + Matcher.quoteReplacement(replacementValue)); - } + } - return currentResourceContent; - } else { - return extractedResource; + return currentResourceContent; + } else { + return extractedResource; + } } - } + /** + * A statement that we don't particularly care about. + */ + public static class OtherLine extends DockerfileStatement { - /** - * A statement that we don't particularly care about. - */ - public static class OtherLine extends DockerfileStatement { + public final String statement; - public final String statement; + public OtherLine(String statement) { + this.statement = statement; + } - public OtherLine(String statement) { - this.statement = statement; + @Override + public String toString() { + return statement; + } } - @Override - public String toString() { - return statement; - } - } + /** + * An ADD or a COPY + */ + public static class Add extends DockerfileStatement { - /** - * An ADD or a COPY - */ - public static class Add extends DockerfileStatement { + private static final Pattern ADD_OR_COPY_PATTERN = Pattern.compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); - private static final Pattern ADD_OR_COPY_PATTERN = Pattern - .compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); + public final String source; - public final String source; - public final String destination; + public final String destination; - private Add(String source, String destination) { - this.source = source; - this.destination = destination; - } + private Add(String source, String destination) { + this.source = source; + this.destination = destination; + } - private Add(final Matcher matcher) { - source = matcher.group(2); - destination = matcher.group(3); - } + private Add(final Matcher matcher) { + source = matcher.group(2); + destination = matcher.group(3); + } - @Override - public Add transform(Map env) { - String resource = filterForEnvironmentVars(env, source).trim(); - return new Add(resource, destination); - } + @Override + public Add transform(Map env) { + String resource = filterForEnvironmentVars(env, source).trim(); + return new Add(resource, destination); + } - public boolean isFileResource() { - URI uri; - try { - uri = new URI(source); - } catch (URISyntaxException e) { - return false; - } - return uri.getScheme() == null || "file".equals(uri.getScheme()); - } + public boolean isFileResource() { + URI uri; + try { + uri = new URI(source); + } catch (URISyntaxException e) { + return false; + } + return uri.getScheme() == null || "file".equals(uri.getScheme()); + } - /** - * Createa an Add if it matches, or missing if not. - * - * @param statement statement that may be an ADD or a COPY - * @return optional typed item. - */ - public static Optional create(String statement) { - Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); - if (!matcher.find()) { - return Optional.absent(); - } + /** + * Createa an Add if it matches, or missing if not. + * + * @param statement + * statement that may be an ADD or a COPY + * @return optional typed item. + */ + public static Optional create(String statement) { + Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } - if (matcher.groupCount() != 3) { - throw new DockerClientException("Wrong ADD or COPY format"); - } - - return Optional.of(new Add(matcher)); - } + if (matcher.groupCount() != 3) { + throw new DockerClientException("Wrong ADD or COPY format"); + } + return Optional.of(new Add(matcher)); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("source", source) - .add("destination", destination) - .toString(); + @Override + public String toString() { + return Objects.toStringHelper(this).add("source", source).add("destination", destination).toString(); + } } - } - public static class Env extends DockerfileStatement { + public static class Env extends DockerfileStatement { - private static final Pattern ENV_PATTERN = Pattern - .compile("^ENV\\s+(.*)\\s+(.*)$"); + private static final Pattern ENV_PATTERN = Pattern.compile("^ENV\\s+(.*)\\s+(.*)$"); - public final String variable; - public final String value; + public final String variable; - private Env(String variable, String value) { - this.variable = variable; - this.value = value; - } + public final String value; - private Env(Matcher envMatcher) { - this.variable = envMatcher.group(1).trim(); - this.value = envMatcher.group(2).trim(); - } + private Env(String variable, String value) { + this.variable = variable; + this.value = value; + } - public static Optional create(String statement) { - Matcher matcher = ENV_PATTERN.matcher(statement.trim()); - if (!matcher.find()) { - return Optional.absent(); - } + private Env(Matcher envMatcher) { + this.variable = envMatcher.group(1).trim(); + this.value = envMatcher.group(2).trim(); + } - if (matcher.groupCount() != 2) { - throw new DockerClientException("Wrong ENV format"); - } + public static Optional create(String statement) { + Matcher matcher = ENV_PATTERN.matcher(statement.trim()); + if (!matcher.find()) { + return Optional.absent(); + } - return Optional.of(new Env(matcher)); - } + if (matcher.groupCount() != 2) { + throw new DockerClientException("Wrong ENV format"); + } - @Override - public String toString() { - return Objects.toStringHelper(this) - .add("variable", variable) - .add("value", value) - .toString(); - } - } - - /** - * Return a dockerfile statement - */ - public static Optional createFromLine(String cmd) { - if (cmd.trim().isEmpty() || cmd.startsWith("#")) { - return Optional.absent(); + return Optional.of(new Env(matcher)); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("variable", variable).add("value", value).toString(); + } } - Optional line; + /** + * Return a dockerfile statement + */ + public static Optional createFromLine(String cmd) { + if (cmd.trim().isEmpty() || cmd.startsWith("#")) { + return Optional.absent(); + } - line = Add.create(cmd); + Optional line; - if (line.isPresent()) { - return line; - } + line = Add.create(cmd); - line = Env.create(cmd); + if (line.isPresent()) { + return line; + } - if (line.isPresent()) { - return line; - } + line = Env.create(cmd); - return Optional.of(new OtherLine(cmd)); + if (line.isPresent()) { + return line; + } + return Optional.of(new OtherLine(cmd)); - } + } } diff --git a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java index b4431b1f4..e4ba60f90 100644 --- a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java @@ -9,27 +9,24 @@ import javax.ws.rs.core.Response; /** - * Default implementation of RedirectStrategy honors the restrictions - * on automatic redirection of entity enclosing methods such as POST - * and PUT imposed by the HTTP specification. 302 Moved Temporarily, - * 301 Moved Permanently and 307 Temporary Redirect status codes will - * result in an automatic redirect of HEAD and GET methods only. + * Default implementation of RedirectStrategy honors the restrictions on automatic redirection of entity enclosing + * methods such as POST and PUT imposed by the HTTP specification. 302 Moved Temporarily, 301 Moved Permanently and 307 + * Temporary Redirect status codes will result in an automatic redirect of HEAD and GET methods only. * * {@link org.apache.http.impl.client.DefaultRedirectStrategy} * - * This filter allows arbitrary redirection for other methods. + * This filter allows arbitrary redirection for other methods. */ public class FollowRedirectsFilter implements ClientResponseFilter { @Override - public void filter(ClientRequestContext requestContext, - ClientResponseContext responseContext) throws IOException { + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { if (!responseContext.getStatusInfo().getFamily().equals(Response.Status.Family.REDIRECTION)) { return; } - Response resp = requestContext.getClient().target(responseContext.getLocation()) - .request().method(requestContext.getMethod()); + Response resp = requestContext.getClient().target(responseContext.getLocation()).request() + .method(requestContext.getMethod()); responseContext.setEntityStream((InputStream) resp.getEntity()); responseContext.setStatusInfo(resp.getStatusInfo()); responseContext.setStatus(resp.getStatus()); diff --git a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java index f2911d961..19befc4b2 100644 --- a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java @@ -1,6 +1,5 @@ package com.github.dockerjava.core.util; - import javax.ws.rs.client.ClientRequestContext; import javax.ws.rs.client.ClientResponseContext; import javax.ws.rs.client.ClientResponseFilter; @@ -14,10 +13,10 @@ */ public class JsonClientFilter implements ClientResponseFilter { - @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { - if (responseContext.getMediaType() != null && responseContext.getMediaType().isCompatible(MediaType.TEXT_PLAIN_TYPE)) { + if (responseContext.getMediaType() != null + && responseContext.getMediaType().isCompatible(MediaType.TEXT_PLAIN_TYPE)) { String newContentType = "application/json" + responseContext.getMediaType().toString().substring(10); responseContext.getHeaders().putSingle("Content-Type", newContentType); } diff --git a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java index 5a72ba237..f7314109b 100644 --- a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java @@ -40,7 +40,6 @@ * holder. */ - import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -72,7 +71,6 @@ import javax.ws.rs.ext.WriterInterceptorContext; import javax.annotation.Priority; - /** * Universal logging filter. * @@ -88,44 +86,50 @@ public class LoggingFilter implements ContainerRequestFilter, ClientRequestFilte ClientResponseFilter, WriterInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class.getName()); + private static final String NOTIFICATION_PREFIX = "* "; + private static final String REQUEST_PREFIX = "> "; + private static final String RESPONSE_PREFIX = "< "; + private static final String ENTITY_LOGGER_PROPERTY = LoggingFilter.class.getName() + ".entityLogger"; - private static final Comparator>> COMPARATOR = - new Comparator>>() { + private static final Comparator>> COMPARATOR = new Comparator>>() { - @Override - public int compare(final Map.Entry> o1, final Map.Entry> o2) { - return o1.getKey().compareToIgnoreCase(o2.getKey()); - } - }; + @Override + public int compare(final Map.Entry> o1, final Map.Entry> o2) { + return o1.getKey().compareToIgnoreCase(o2.getKey()); + } + }; private static final int DEFAULT_MAX_ENTITY_SIZE = 8 * 1024; // @SuppressWarnings("NonConstantLogger") private final Logger logger; + private final AtomicLong _id = new AtomicLong(0); + private final boolean printEntity; + private final int maxEntitySize; /** - * Create a logging filter logging the request and response to a default JDK - * logger, named as the fully qualified class name of this class. Entity - * logging is turned off by default. + * Create a logging filter logging the request and response to a default JDK logger, named as the fully qualified + * class name of this class. Entity logging is turned off by default. */ public LoggingFilter() { this(LOGGER, false); } /** - * Create a logging filter with custom logger and custom settings of entity - * logging. + * Create a logging filter with custom logger and custom settings of entity logging. * - * @param logger the logger to log requests and responses. - * @param printEntity if true, entity will be logged as well up to the default maxEntitySize, which is 8KB + * @param logger + * the logger to log requests and responses. + * @param printEntity + * if true, entity will be logged as well up to the default maxEntitySize, which is 8KB */ @SuppressWarnings("BooleanParameter") public LoggingFilter(final Logger logger, final boolean printEntity) { @@ -135,13 +139,15 @@ public LoggingFilter(final Logger logger, final boolean printEntity) { } /** - * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size - * of entity to be buffered and logged. + * Creates a logging filter with custom logger and entity logging turned on, but potentially limiting the size of + * entity to be buffered and logged. * - * @param logger the logger to log requests and responses. - * @param maxEntitySize maximum number of entity bytes to be logged (and buffered) - if the entity is larger, - * logging filter will print (and buffer in memory) only the specified number of bytes - * and print "...more..." string at the end. + * @param logger + * the logger to log requests and responses. + * @param maxEntitySize + * maximum number of entity bytes to be logged (and buffered) - if the entity is larger, logging filter + * will print (and buffer in memory) only the specified number of bytes and print "...more..." string at + * the end. */ public LoggingFilter(final Logger logger, final int maxEntitySize) { this.logger = logger; @@ -160,25 +166,21 @@ private StringBuilder prefixId(final StringBuilder b, final long id) { return b; } - private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, final URI uri) { - prefixId(b, id).append(NOTIFICATION_PREFIX) - .append(note) - .append(" on thread ").append(Thread.currentThread().getName()) - .append("\n"); - prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" "). - append(uri.toASCIIString()).append("\n"); + private void printRequestLine(final StringBuilder b, final String note, final long id, final String method, + final URI uri) { + prefixId(b, id).append(NOTIFICATION_PREFIX).append(note).append(" on thread ") + .append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(REQUEST_PREFIX).append(method).append(" ").append(uri.toASCIIString()).append("\n"); } private void printResponseLine(final StringBuilder b, final String note, final long id, final int status) { - prefixId(b, id).append(NOTIFICATION_PREFIX) - .append(note) - .append(" on thread ").append(Thread.currentThread().getName()).append("\n"); - prefixId(b, id).append(RESPONSE_PREFIX). - append(Integer.toString(status)). - append("\n"); + prefixId(b, id).append(NOTIFICATION_PREFIX).append(note).append(" on thread ") + .append(Thread.currentThread().getName()).append("\n"); + prefixId(b, id).append(RESPONSE_PREFIX).append(Integer.toString(status)).append("\n"); } - private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, final MultivaluedMap headers) { + private void printPrefixedHeaders(final StringBuilder b, final long id, final String prefix, + final MultivaluedMap headers) { for (final Map.Entry> headerEntry : getSortedHeaders(headers.entrySet())) { final List val = headerEntry.getValue(); final String header = headerEntry.getKey(); @@ -201,7 +203,8 @@ private void printPrefixedHeaders(final StringBuilder b, final long id, final St } private Set>> getSortedHeaders(final Set>> headers) { - final TreeSet>> sortedHeaders = new TreeSet>>(COMPARATOR); + final TreeSet>> sortedHeaders = new TreeSet>>( + COMPARATOR); sortedHeaders.addAll(headers); return sortedHeaders; } @@ -241,7 +244,8 @@ public void filter(final ClientRequestContext context) throws IOException { } @Override - public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) throws IOException { + public void filter(final ClientRequestContext requestContext, final ClientResponseContext responseContext) + throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); @@ -260,7 +264,8 @@ public void filter(final ContainerRequestContext context) throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); - printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo().getRequestUri()); + printRequestLine(b, "Server has received a request", id, context.getMethod(), context.getUriInfo() + .getRequestUri()); printPrefixedHeaders(b, id, REQUEST_PREFIX, context.getHeaders()); if (printEntity && context.hasEntity()) { @@ -271,7 +276,8 @@ public void filter(final ContainerRequestContext context) throws IOException { } @Override - public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException { + public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) + throws IOException { final long id = this._id.incrementAndGet(); final StringBuilder b = new StringBuilder(); @@ -289,7 +295,8 @@ public void filter(final ContainerRequestContext requestContext, final Container } @Override - public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException { + public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContext) throws IOException, + WebApplicationException { final LoggingStream stream = (LoggingStream) writerInterceptorContext.getProperty(ENTITY_LOGGER_PROPERTY); writerInterceptorContext.proceed(); if (stream != null) { @@ -299,7 +306,9 @@ public void aroundWriteTo(final WriterInterceptorContext writerInterceptorContex private class LoggingStream extends OutputStream { private final StringBuilder b; + private final OutputStream inner; + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); LoggingStream(final StringBuilder b, final OutputStream inner) { diff --git a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java index 7e9708564..24f31fb14 100644 --- a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java @@ -22,75 +22,71 @@ import com.github.dockerjava.api.UnauthorizedException; /** - * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s + * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s * * @author marcus * */ public class ResponseStatusExceptionFilter implements ClientResponseFilter { - @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { - int status = responseContext.getStatus(); - switch (status) { - case 200: - case 201: - case 204: - return; - case 304: - throw new NotModifiedException(getBodyAsMessage(responseContext)); - case 400: - throw new BadRequestException(getBodyAsMessage(responseContext)); - case 401: - throw new UnauthorizedException(getBodyAsMessage(responseContext)); - case 404: - throw new NotFoundException(getBodyAsMessage(responseContext)); - case 406: - throw new NotAcceptableException(getBodyAsMessage(responseContext)); - case 409: - throw new ConflictException(getBodyAsMessage(responseContext)); - case 500: - throw new InternalServerErrorException(getBodyAsMessage(responseContext)); - default: - throw new DockerException(getBodyAsMessage(responseContext), status); - } + int status = responseContext.getStatus(); + switch (status) { + case 200: + case 201: + case 204: + return; + case 304: + throw new NotModifiedException(getBodyAsMessage(responseContext)); + case 400: + throw new BadRequestException(getBodyAsMessage(responseContext)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(responseContext)); + case 404: + throw new NotFoundException(getBodyAsMessage(responseContext)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(responseContext)); + case 409: + throw new ConflictException(getBodyAsMessage(responseContext)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(responseContext)); + default: + throw new DockerException(getBodyAsMessage(responseContext), status); + } } - private String getBodyAsMessage(ClientResponseContext responseContext) - throws IOException { - if (responseContext.hasEntity()) { - int contentLength = responseContext.getLength(); - if (contentLength != -1) { - byte[] buffer = new byte[contentLength]; - try { - InputStream entityStream = responseContext.getEntityStream(); - IOUtils.readFully(entityStream, buffer); - entityStream.close(); - } - catch (EOFException e) { - return null; - } - Charset charset = null; - MediaType mediaType = responseContext.getMediaType(); - if (mediaType != null) { - String charsetName = mediaType.getParameters().get("charset"); - if (charsetName != null) { - try { - charset = Charset.forName(charsetName); - } - catch (Exception e) { - //Do noting... + private String getBodyAsMessage(ClientResponseContext responseContext) throws IOException { + if (responseContext.hasEntity()) { + int contentLength = responseContext.getLength(); + if (contentLength != -1) { + byte[] buffer = new byte[contentLength]; + try { + InputStream entityStream = responseContext.getEntityStream(); + IOUtils.readFully(entityStream, buffer); + entityStream.close(); + } catch (EOFException e) { + return null; + } + Charset charset = null; + MediaType mediaType = responseContext.getMediaType(); + if (mediaType != null) { + String charsetName = mediaType.getParameters().get("charset"); + if (charsetName != null) { + try { + charset = Charset.forName(charsetName); + } catch (Exception e) { + // Do noting... } - } - } - if (charset == null) { + } + } + if (charset == null) { charset = Charset.defaultCharset(); - } - String message = new String(buffer, charset); - return message; - } - } - return null; - } + } + String message = new String(buffer, charset); + return message; + } + } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java index 8cfe88b73..d4c9b8400 100644 --- a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java @@ -11,18 +11,16 @@ import org.slf4j.Logger; - /** - * A version of the logging filter that will avoid trying to log entities which can cause - * issues with the console. + * A version of the logging filter that will avoid trying to log entities which can cause issues with the console. * * @author sfitts * */ public class SelectiveLoggingFilter extends LoggingFilter { - + // Immutable'ish - private static final Set SKIPPED_CONTENT; + private static final Set SKIPPED_CONTENT; static { Set s = new HashSet(); s.add(MediaType.APPLICATION_OCTET_STREAM); @@ -30,12 +28,11 @@ public class SelectiveLoggingFilter extends LoggingFilter { SKIPPED_CONTENT = Collections.unmodifiableSet(s); } - public SelectiveLoggingFilter(Logger logger, boolean b) { - super(logger, b); - } + super(logger, b); + } - @Override + @Override public void filter(ClientRequestContext context) throws IOException { // Unless the content type is in the list of those we want to ellide, then just have // our super-class handle things. @@ -44,5 +41,5 @@ public void filter(ClientRequestContext context) throws IOException { super.filter(context); } } - + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 840395105..7ce68eed8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -16,62 +16,58 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; -public abstract class AbstrDockerCmdExec, RES_T> - implements DockerCmdExec { +public abstract class AbstrDockerCmdExec, RES_T> implements DockerCmdExec { - private WebTarget baseResource; + private WebTarget baseResource; - public AbstrDockerCmdExec(WebTarget baseResource) { - checkNotNull(baseResource, - "baseResource was not specified"); - this.baseResource = baseResource; - } + public AbstrDockerCmdExec(WebTarget baseResource) { + checkNotNull(baseResource, "baseResource was not specified"); + this.baseResource = baseResource; + } - protected WebTarget getBaseResource() { - return baseResource; - } + protected WebTarget getBaseResource() { + return baseResource; + } - protected String registryAuth(AuthConfig authConfig) { - try { - return Base64.encodeBase64String(new ObjectMapper() - .writeValueAsString(authConfig).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + protected String registryAuth(AuthConfig authConfig) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - protected String registryConfigs(AuthConfigurations authConfigs) { - try { - return Base64.encodeBase64String(new ObjectMapper() - .writeValueAsString(authConfigs).getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public RES_T exec(CMD_T command) { - // this hack works because of ResponseStatusExceptionFilter - RES_T result; - try { - result = execute(command); - - } catch (ProcessingException e) { - if(e.getCause() instanceof DockerException) { - throw (DockerException)e.getCause(); - } else { - throw e; - } - } finally { - try { - command.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - return result; - } + protected String registryConfigs(AuthConfigurations authConfigs) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfigs).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - protected abstract RES_T execute(CMD_T command); + @Override + public RES_T exec(CMD_T command) { + // this hack works because of ResponseStatusExceptionFilter + RES_T result; + try { + result = execute(command); + + } catch (ProcessingException e) { + if (e.getCause() instanceof DockerException) { + throw (DockerException) e.getCause(); + } else { + throw e; + } + } finally { + try { + command.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + return result; + } + + protected abstract RES_T execute(CMD_T command); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java index 23d6d1ab9..e30028f34 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -1,4 +1,5 @@ package com.github.dockerjava.jaxrs; + /* * Copyright (c) 2014 Spotify AB. * @@ -20,8 +21,6 @@ * under the License. */ - - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -36,291 +35,289 @@ import org.newsclub.net.unix.AFUNIXSocket; /** - * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options - * until the socket is connected. This is necessary because the Apache HTTP client attempts to - * set options prior to connecting the socket, which doesn't work for Unix sockets since options - * are being set on the underlying file descriptor. Until the socket is connected, the file - * descriptor doesn't exist. + * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options until the socket is + * connected. This is necessary because the Apache HTTP client attempts to set options prior to connecting the socket, + * which doesn't work for Unix sockets since options are being set on the underlying file descriptor. Until the socket + * is connected, the file descriptor doesn't exist. * - * This class also noop's any calls to setReuseAddress, which is called by the Apache client but - * isn't supported by AFUnixSocket. + * This class also noop's any calls to setReuseAddress, which is called by the Apache client but isn't supported by + * AFUnixSocket. */ public class ApacheUnixSocket extends Socket { - private final AFUNIXSocket inner; - - private final Queue optionsToSet = new ArrayDeque(); - - public ApacheUnixSocket() throws IOException { - this.inner = AFUNIXSocket.newInstance(); - } - - @Override - public void connect(final SocketAddress endpoint) throws IOException { - inner.connect(endpoint); - setAllSocketOptions(); - } - - @Override - public void connect(final SocketAddress endpoint, final int timeout) throws IOException { - inner.connect(endpoint, timeout); - setAllSocketOptions(); - } - - @Override - public void bind(final SocketAddress bindpoint) throws IOException { - inner.bind(bindpoint); - setAllSocketOptions(); - } - - @Override - public InetAddress getInetAddress() { - return inner.getInetAddress(); - } - - @Override - public InetAddress getLocalAddress() { - return inner.getLocalAddress(); - } - - @Override - public int getPort() { - return inner.getPort(); - } - - @Override - public int getLocalPort() { - return inner.getLocalPort(); - } - - @Override - public SocketAddress getRemoteSocketAddress() { - return inner.getRemoteSocketAddress(); - } - - @Override - public SocketAddress getLocalSocketAddress() { - return inner.getLocalSocketAddress(); - } - - @Override - public SocketChannel getChannel() { - return inner.getChannel(); - } - - @Override - public InputStream getInputStream() throws IOException { - return inner.getInputStream(); - } - - @Override - public OutputStream getOutputStream() throws IOException { - return inner.getOutputStream(); - } - - private void setSocketOption(final SocketOptionSetter s) throws SocketException { - if (inner.isConnected()) { - s.run(); - } else { - if (!optionsToSet.offer(s)) { - throw new SocketException("Failed to queue option"); - } - } - } - - private void setAllSocketOptions() throws SocketException { - for (SocketOptionSetter s : optionsToSet) { - s.run(); - } - } - - @Override - public void setTcpNoDelay(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setTcpNoDelay(on); - } - }); - } - - @Override - public boolean getTcpNoDelay() throws SocketException { - return inner.getTcpNoDelay(); - } - - @Override - public void setSoLinger(final boolean on, final int linger) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSoLinger(on, linger); - } - }); - } - - @Override - public int getSoLinger() throws SocketException { - return inner.getSoLinger(); - } - - @Override - public void sendUrgentData(final int data) throws IOException { - inner.sendUrgentData(data); - } - - @Override - public void setOOBInline(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setOOBInline(on); - } - }); - } - - @Override - public boolean getOOBInline() throws SocketException { - return inner.getOOBInline(); - } - - @Override - public synchronized void setSoTimeout(final int timeout) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSoTimeout(timeout); - } - }); - } - - @Override - public synchronized int getSoTimeout() throws SocketException { - return inner.getSoTimeout(); - } - - @Override - public synchronized void setSendBufferSize(final int size) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setSendBufferSize(size); - } - }); - } - - @Override - public synchronized int getSendBufferSize() throws SocketException { - return inner.getSendBufferSize(); - } - - @Override - public synchronized void setReceiveBufferSize(final int size) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setReceiveBufferSize(size); - } - }); - } - - @Override - public synchronized int getReceiveBufferSize() throws SocketException { - return inner.getReceiveBufferSize(); - } - - @Override - public void setKeepAlive(final boolean on) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setKeepAlive(on); - } - }); - } - - @Override - public boolean getKeepAlive() throws SocketException { - return inner.getKeepAlive(); - } - - @Override - public void setTrafficClass(final int tc) throws SocketException { - setSocketOption(new SocketOptionSetter() { - @Override - public void run() throws SocketException { - inner.setTrafficClass(tc); - } - }); - } - - @Override - public int getTrafficClass() throws SocketException { - return inner.getTrafficClass(); - } - - @Override - public void setReuseAddress(final boolean on) throws SocketException { - // not supported: Apache client tries to set it, but we want to just ignore it - } - - @Override - public boolean getReuseAddress() throws SocketException { - return inner.getReuseAddress(); - } - - @Override - public synchronized void close() throws IOException { - inner.close(); - } - - @Override - public void shutdownInput() throws IOException { - inner.shutdownInput(); - } - - @Override - public void shutdownOutput() throws IOException { - inner.shutdownOutput(); - } - - @Override - public String toString() { - return inner.toString(); - } - - @Override - public boolean isConnected() { - return inner.isConnected(); - } - - @Override - public boolean isBound() { - return inner.isBound(); - } - - @Override - public boolean isClosed() { - return inner.isClosed(); - } - - @Override - public boolean isInputShutdown() { - return inner.isInputShutdown(); - } - - @Override - public boolean isOutputShutdown() { - return inner.isOutputShutdown(); - } - - @Override - public void setPerformancePreferences(final int connectionTime, final int latency, - final int bandwidth) { - inner.setPerformancePreferences(connectionTime, latency, bandwidth); - } - - interface SocketOptionSetter { - void run() throws SocketException; - } + private final AFUNIXSocket inner; + + private final Queue optionsToSet = new ArrayDeque(); + + public ApacheUnixSocket() throws IOException { + this.inner = AFUNIXSocket.newInstance(); + } + + @Override + public void connect(final SocketAddress endpoint) throws IOException { + inner.connect(endpoint); + setAllSocketOptions(); + } + + @Override + public void connect(final SocketAddress endpoint, final int timeout) throws IOException { + inner.connect(endpoint, timeout); + setAllSocketOptions(); + } + + @Override + public void bind(final SocketAddress bindpoint) throws IOException { + inner.bind(bindpoint); + setAllSocketOptions(); + } + + @Override + public InetAddress getInetAddress() { + return inner.getInetAddress(); + } + + @Override + public InetAddress getLocalAddress() { + return inner.getLocalAddress(); + } + + @Override + public int getPort() { + return inner.getPort(); + } + + @Override + public int getLocalPort() { + return inner.getLocalPort(); + } + + @Override + public SocketAddress getRemoteSocketAddress() { + return inner.getRemoteSocketAddress(); + } + + @Override + public SocketAddress getLocalSocketAddress() { + return inner.getLocalSocketAddress(); + } + + @Override + public SocketChannel getChannel() { + return inner.getChannel(); + } + + @Override + public InputStream getInputStream() throws IOException { + return inner.getInputStream(); + } + + @Override + public OutputStream getOutputStream() throws IOException { + return inner.getOutputStream(); + } + + private void setSocketOption(final SocketOptionSetter s) throws SocketException { + if (inner.isConnected()) { + s.run(); + } else { + if (!optionsToSet.offer(s)) { + throw new SocketException("Failed to queue option"); + } + } + } + + private void setAllSocketOptions() throws SocketException { + for (SocketOptionSetter s : optionsToSet) { + s.run(); + } + } + + @Override + public void setTcpNoDelay(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTcpNoDelay(on); + } + }); + } + + @Override + public boolean getTcpNoDelay() throws SocketException { + return inner.getTcpNoDelay(); + } + + @Override + public void setSoLinger(final boolean on, final int linger) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoLinger(on, linger); + } + }); + } + + @Override + public int getSoLinger() throws SocketException { + return inner.getSoLinger(); + } + + @Override + public void sendUrgentData(final int data) throws IOException { + inner.sendUrgentData(data); + } + + @Override + public void setOOBInline(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setOOBInline(on); + } + }); + } + + @Override + public boolean getOOBInline() throws SocketException { + return inner.getOOBInline(); + } + + @Override + public synchronized void setSoTimeout(final int timeout) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSoTimeout(timeout); + } + }); + } + + @Override + public synchronized int getSoTimeout() throws SocketException { + return inner.getSoTimeout(); + } + + @Override + public synchronized void setSendBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setSendBufferSize(size); + } + }); + } + + @Override + public synchronized int getSendBufferSize() throws SocketException { + return inner.getSendBufferSize(); + } + + @Override + public synchronized void setReceiveBufferSize(final int size) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setReceiveBufferSize(size); + } + }); + } + + @Override + public synchronized int getReceiveBufferSize() throws SocketException { + return inner.getReceiveBufferSize(); + } + + @Override + public void setKeepAlive(final boolean on) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setKeepAlive(on); + } + }); + } + + @Override + public boolean getKeepAlive() throws SocketException { + return inner.getKeepAlive(); + } + + @Override + public void setTrafficClass(final int tc) throws SocketException { + setSocketOption(new SocketOptionSetter() { + @Override + public void run() throws SocketException { + inner.setTrafficClass(tc); + } + }); + } + + @Override + public int getTrafficClass() throws SocketException { + return inner.getTrafficClass(); + } + + @Override + public void setReuseAddress(final boolean on) throws SocketException { + // not supported: Apache client tries to set it, but we want to just ignore it + } + + @Override + public boolean getReuseAddress() throws SocketException { + return inner.getReuseAddress(); + } + + @Override + public synchronized void close() throws IOException { + inner.close(); + } + + @Override + public void shutdownInput() throws IOException { + inner.shutdownInput(); + } + + @Override + public void shutdownOutput() throws IOException { + inner.shutdownOutput(); + } + + @Override + public String toString() { + return inner.toString(); + } + + @Override + public boolean isConnected() { + return inner.isConnected(); + } + + @Override + public boolean isBound() { + return inner.isBound(); + } + + @Override + public boolean isClosed() { + return inner.isClosed(); + } + + @Override + public boolean isInputShutdown() { + return inner.isInputShutdown(); + } + + @Override + public boolean isOutputShutdown() { + return inner.isOutputShutdown(); + } + + @Override + public void setPerformancePreferences(final int connectionTime, final int latency, final int bandwidth) { + inner.setPerformancePreferences(connectionTime, latency, bandwidth); + } + + interface SocketOptionSetter { + void run() throws SocketException; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 29f331a2f..6827b4164 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -12,38 +12,34 @@ import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class AttachContainerCmdExec extends - AbstrDockerCmdExec implements - AttachContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(AttachContainerCmdExec.class); - - public AttachContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(AttachContainerCmd command) { - WebTarget webTarget = getBaseResource() - .path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()) - .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") - // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("stream", - command.hasFollowStreamEnabled() ? "1" : "0"); - - LOGGER.trace("POST: {}", webTarget); - - POSTCallbackNotifier callbackNotifier = new POSTCallbackNotifier( - new FrameStreamProcessor(), command.getResultCallback(), webTarget); +public class AttachContainerCmdExec extends AbstrDockerCmdExec implements + AttachContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); + + public AttachContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(AttachContainerCmd command) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/attach") + .resolveTemplate("id", command.getContainerId()) + .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") + // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); + + LOGGER.trace("POST: {}", webTarget); + + POSTCallbackNotifier callbackNotifier = new POSTCallbackNotifier(new FrameStreamProcessor(), + command.getResultCallback(), webTarget); AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); return null; - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java index 3552d9742..8ceca593e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java @@ -12,28 +12,26 @@ import static javax.ws.rs.client.Entity.entity; -public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(AuthCmdExec.class); - - public AuthCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected AuthResponse execute(AuthCmd command) { - WebTarget webResource = getBaseResource().path("/auth"); - LOGGER.trace("POST: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON).post(entity(command.getAuthConfig(), MediaType.APPLICATION_JSON)); - - if(response.getStatus() == 401) { - throw new UnauthorizedException("Unauthorized"); - } +public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AuthCmdExec.class); + + public AuthCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected AuthResponse execute(AuthCmd command) { + WebTarget webResource = getBaseResource().path("/auth"); + LOGGER.trace("POST: {}", webResource); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command.getAuthConfig(), MediaType.APPLICATION_JSON)); + + if (response.getStatus() == 401) { + throw new UnauthorizedException("Unauthorized"); + } return response.readEntity(AuthResponse.class); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 3bdfb006c..3380832ec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -22,99 +22,90 @@ import static javax.ws.rs.client.Entity.entity; -public class BuildImageCmdExec extends - AbstrDockerCmdExec implements - BuildImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(BuildImageCmdExec.class); - - public BuildImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected ResponseImpl execute(BuildImageCmd command) { - WebTarget webResource = getBaseResource().path("/build"); - String dockerFilePath = command.getPathToDockerfile(); - - if (command.getTag() != null) { - webResource = webResource.queryParam("t", command.getTag()); - } - if (command.hasNoCacheEnabled()) { - webResource = webResource.queryParam("nocache", "true"); - } - if (!command.hasRemoveEnabled()) { - webResource = webResource.queryParam("rm", "false"); - } - if (command.isQuiet()) { - webResource = webResource.queryParam("q", "true"); - } - if (command.hasPullEnabled()) { - webResource = webResource.queryParam("pull", "true"); - } - if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webResource = webResource.queryParam("dockerfile", dockerFilePath); - } - - webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, - RequestEntityProcessing.CHUNKED); - webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, - 1024 * 1024); - - LOGGER.debug("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, - webResource.request()) - .accept(MediaType.TEXT_PLAIN) - .post(entity(command.getTarInputStream(), "application/tar"), - Response.class); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - - } - - private Invocation.Builder resourceWithOptionalAuthConfig( - BuildImageCmd command, Invocation.Builder request) { - AuthConfigurations authConfigs = command.getBuildAuthConfigs(); - if (authConfigs != null) { - request = request.header("X-Registry-Config", - registryConfigs(authConfigs)); - } - return request; - } - - public static class ResponseImpl extends BuildImageCmd.Response { - - private final InputStream proxy; - - public ResponseImpl(InputStream proxy) { - this.proxy = proxy; - } - - @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(EventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); - - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } - } - - @Override - public int read() throws IOException { - return proxy.read(); - } - - @Override - public void close() throws IOException { - proxy.close(); - super.close(); - } - } +public class BuildImageCmdExec extends AbstrDockerCmdExec implements + BuildImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); + + public BuildImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected ResponseImpl execute(BuildImageCmd command) { + WebTarget webResource = getBaseResource().path("/build"); + String dockerFilePath = command.getPathToDockerfile(); + + if (command.getTag() != null) { + webResource = webResource.queryParam("t", command.getTag()); + } + if (command.hasNoCacheEnabled()) { + webResource = webResource.queryParam("nocache", "true"); + } + if (!command.hasRemoveEnabled()) { + webResource = webResource.queryParam("rm", "false"); + } + if (command.isQuiet()) { + webResource = webResource.queryParam("q", "true"); + } + if (command.hasPullEnabled()) { + webResource = webResource.queryParam("pull", "true"); + } + if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { + webResource = webResource.queryParam("dockerfile", dockerFilePath); + } + + webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); + webResource.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); + + LOGGER.debug("POST: {}", webResource); + Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept(MediaType.TEXT_PLAIN) + .post(entity(command.getTarInputStream(), "application/tar"), Response.class); + + return new ResponseImpl(new WrappedResponseInputStream(response)); + + } + + private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + + public static class ResponseImpl extends BuildImageCmd.Response { + + private final InputStream proxy; + + public ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(EventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } + } + + @Override + public int read() throws IOException { + return proxy.read(); + } + + @Override + public void close() throws IOException { + proxy.close(); + super.close(); + } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java index f1f4fe33a..b07f5e338 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java @@ -12,27 +12,24 @@ import com.github.dockerjava.api.command.CommitCmd; public class CommitCmdExec extends AbstrDockerCmdExec implements CommitCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CommitCmdExec.class); - - public CommitCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected String execute(CommitCmd command) { - WebTarget webResource = getBaseResource().path("/commit") - .queryParam("container", command.getContainerId()) - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) - .queryParam("m", command.getMessage()) - .queryParam("author", command.getAuthor()) - .queryParam("pause", command.hasPauseEnabled() ? "1" : "0"); - - LOGGER.trace("POST: {}", webResource); - ObjectNode objectNode = webResource.request().accept("application/vnd.docker.raw-stream").post(entity(command, MediaType.APPLICATION_JSON), ObjectNode.class); + + private static final Logger LOGGER = LoggerFactory.getLogger(CommitCmdExec.class); + + public CommitCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected String execute(CommitCmd command) { + WebTarget webResource = getBaseResource().path("/commit").queryParam("container", command.getContainerId()) + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) + .queryParam("m", command.getMessage()).queryParam("author", command.getAuthor()) + .queryParam("pause", command.hasPauseEnabled() ? "1" : "0"); + + LOGGER.trace("POST: {}", webResource); + ObjectNode objectNode = webResource.request().accept("application/vnd.docker.raw-stream") + .post(entity(command, MediaType.APPLICATION_JSON), ObjectNode.class); return objectNode.get("Id").asText(); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java index 2b7059b33..c7c8c293a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java @@ -12,23 +12,23 @@ import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; -public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements ContainerDiffCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(ContainerDiffCmdExec.class); - - public ContainerDiffCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(ContainerDiffCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .get(new GenericType>() { +public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements + ContainerDiffCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ContainerDiffCmdExec.class); + + public ContainerDiffCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(ContainerDiffCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { }); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 0a738be83..88e8c3086 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -14,26 +14,26 @@ import com.github.dockerjava.api.command.CopyFileFromContainerCmd; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements CopyFileFromContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CopyFileFromContainerCmdExec.class); - - public CopyFileFromContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(CopyFileFromContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/copy") - .resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("POST: " + webResource.toString()); - - Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON)); - - return new WrappedResponseInputStream(response); - } +public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements + CopyFileFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileFromContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(CopyFileFromContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: " + webResource.toString()); + + Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(entity(command, MediaType.APPLICATION_JSON)); + + return new WrappedResponseInputStream(response); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java index 26dc25cd2..c02b9f4b7 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java @@ -11,25 +11,26 @@ import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; -public class CreateContainerCmdExec extends AbstrDockerCmdExec implements CreateContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); - - public CreateContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected CreateContainerResponse execute(CreateContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/create"); +public class CreateContainerCmdExec extends AbstrDockerCmdExec implements + CreateContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); + + public CreateContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected CreateContainerResponse execute(CreateContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/create"); if (command.getName() != null) { webResource = webResource.queryParam("name", command.getName()); } - LOGGER.trace("POST: {} ", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), CreateContainerResponse.class); - } + LOGGER.trace("POST: {} ", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java index 4c7bae8b0..c5733241d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java @@ -11,25 +11,22 @@ import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; -public class CreateImageCmdExec extends AbstrDockerCmdExec implements CreateImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(CreateImageCmdExec.class); - - public CreateImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected CreateImageResponse execute(CreateImageCmd command) { - WebTarget webResource = getBaseResource() - .path("/images/create") - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) - .queryParam("fromSrc", "-"); - - LOGGER.trace("POST: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM), CreateImageResponse.class); - } +public class CreateImageCmdExec extends AbstrDockerCmdExec implements + CreateImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateImageCmdExec.class); + + public CreateImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected CreateImageResponse execute(CreateImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/create").queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()).queryParam("fromSrc", "-"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM), CreateImageResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 8a5d5d879..77712fdeb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -25,7 +25,6 @@ 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; @@ -41,302 +40,286 @@ 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 - .getLogger(DockerCmdExecFactoryImpl.class.getName()); - private Client client; - private WebTarget baseResource; - - @Override - public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - - ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); - clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, - true); - - clientConfig.register(ResponseStatusExceptionFilter.class); - clientConfig.register(JsonClientFilter.class); - clientConfig.register(JacksonJsonProvider.class); - - if (dockerClientConfig.followRedirectsFilterEnabled()) { - clientConfig.register(FollowRedirectsFilter.class); - } - - if (dockerClientConfig.isLoggingFilterEnabled()) { - clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); - } - - if (dockerClientConfig.getReadTimeout() != null) { - int readTimeout = dockerClientConfig.getReadTimeout(); - clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); - } - - //clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); - - URI originalUri = dockerClientConfig.getUri(); - - SSLContext sslContext = null; - - if (dockerClientConfig.getSslConfig() != null) { - try { - sslContext = dockerClientConfig.getSslConfig().getSSLContext(); - } catch (Exception ex) { - throw new DockerClientException("Error in SSL Configuration", - ex); - } - } - - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( - getSchemeRegistry(originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS); - - - if (dockerClientConfig.getMaxTotalConnections() != null) - connManager - .setMaxTotal(dockerClientConfig.getMaxTotalConnections()); - if (dockerClientConfig.getMaxPerRoutConnections() != null) - connManager.setDefaultMaxPerRoute(dockerClientConfig - .getMaxPerRoutConnections()); - - clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, - connManager); - - clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, - RequestConfig.custom().setConnectionRequestTimeout(1000).build()); - - ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( - clientConfig); - - if (sslContext != null) { - clientBuilder.sslContext(sslContext); - } - - client = clientBuilder.build(); - - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory - .sanitizeUri(originalUri)); - } - WebTarget webResource = client.target(dockerClientConfig.getUri()); - - if (dockerClientConfig.getVersion() == null - || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" - + dockerClientConfig.getVersion()); - } - } - - private org.apache.http.config.Registry getSchemeRegistry( - final URI originalUri, SSLContext sslContext) { - RegistryBuilder registryBuilder = RegistryBuilder - .create(); - registryBuilder.register("http", - PlainConnectionSocketFactory.getSocketFactory()); - if (sslContext != null) { - registryBuilder.register("https", new SSLConnectionSocketFactory( - sslContext)); - } - registryBuilder.register("unix", new UnixConnectionSocketFactory( - originalUri)); - return registryBuilder.build(); - } - - protected WebTarget getBaseResource() { - checkNotNull(baseResource, - "Factory not initialized. You probably forgot to call init()!"); - return baseResource; - } - - @Override - public AuthCmd.Exec createAuthCmdExec() { - return new AuthCmdExec(getBaseResource()); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(getBaseResource()); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return new PingCmdExec(getBaseResource()); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return new VersionCmdExec(getBaseResource()); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return new PullImageCmdExec(getBaseResource()); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return new PushImageCmdExec(getBaseResource()); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { - return new SaveImageCmdExec(getBaseResource()); - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return new SearchImagesCmdExec(getBaseResource()); - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return new ListImagesCmdExec(getBaseResource()); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return new InspectImageCmdExec(getBaseResource()); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return new ListContainersCmdExec(getBaseResource()); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return new StartContainerCmdExec(getBaseResource()); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return new InspectContainerCmdExec(getBaseResource()); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(getBaseResource()); - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return new WaitContainerCmdExec(getBaseResource()); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return new AttachContainerCmdExec(getBaseResource()); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return new ExecStartCmdExec(getBaseResource()); - } - - @Override - public InspectExecCmd.Exec createInspectExecCmdExec() { - return new InspectExecCmdExec(getBaseResource()); - } - - @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return new LogContainerCmdExec(getBaseResource()); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource()); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return new StopContainerCmdExec(getBaseResource()); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return new ContainerDiffCmdExec(getBaseResource()); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return new KillContainerCmdExec(getBaseResource()); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return new RestartContainerCmdExec(getBaseResource()); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return new CommitCmdExec(getBaseResource()); - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return new TopContainerCmdExec(getBaseResource()); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return new TagImageCmdExec(getBaseResource()); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return new PauseContainerCmdExec(getBaseResource()); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return new UnpauseContainerCmdExec(baseResource); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return new EventsCmdExec(getBaseResource()); - } - - @Override + private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + + private Client client; + + private WebTarget baseResource; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + + ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new ApacheConnectorProvider()); + clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true); + + clientConfig.register(ResponseStatusExceptionFilter.class); + clientConfig.register(JsonClientFilter.class); + clientConfig.register(JacksonJsonProvider.class); + + if (dockerClientConfig.followRedirectsFilterEnabled()) { + clientConfig.register(FollowRedirectsFilter.class); + } + + if (dockerClientConfig.isLoggingFilterEnabled()) { + clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + } + + if (dockerClientConfig.getReadTimeout() != null) { + int readTimeout = dockerClientConfig.getReadTimeout(); + clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); + } + + // clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); + + URI originalUri = dockerClientConfig.getUri(); + + SSLContext sslContext = null; + + if (dockerClientConfig.getSslConfig() != null) { + try { + sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + } catch (Exception ex) { + throw new DockerClientException("Error in SSL Configuration", ex); + } + } + + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( + originalUri, sslContext), null, null, null, 10, TimeUnit.SECONDS); + + if (dockerClientConfig.getMaxTotalConnections() != null) + connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); + if (dockerClientConfig.getMaxPerRoutConnections() != null) + connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); + + clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); + + clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom() + .setConnectionRequestTimeout(1000).build()); + + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); + + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } + + client = clientBuilder.build(); + + if (originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); + } + WebTarget webResource = client.target(dockerClientConfig.getUri()); + + if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { + baseResource = webResource; + } else { + baseResource = webResource.path("v" + dockerClientConfig.getVersion()); + } + } + + private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, + SSLContext sslContext) { + RegistryBuilder registryBuilder = RegistryBuilder.create(); + registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory()); + if (sslContext != null) { + registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); + } + registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri)); + return registryBuilder.build(); + } + + protected WebTarget getBaseResource() { + checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + return baseResource; + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return new AuthCmdExec(getBaseResource()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(getBaseResource()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return new PingCmdExec(getBaseResource()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return new VersionCmdExec(getBaseResource()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return new PullImageCmdExec(getBaseResource()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return new PushImageCmdExec(getBaseResource()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return new SaveImageCmdExec(getBaseResource()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return new SearchImagesCmdExec(getBaseResource()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return new ListImagesCmdExec(getBaseResource()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return new InspectImageCmdExec(getBaseResource()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return new ListContainersCmdExec(getBaseResource()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return new StartContainerCmdExec(getBaseResource()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return new InspectContainerCmdExec(getBaseResource()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return new WaitContainerCmdExec(getBaseResource()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return new AttachContainerCmdExec(getBaseResource()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return new InspectExecCmdExec(getBaseResource()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return new LogContainerCmdExec(getBaseResource()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return new CopyFileFromContainerCmdExec(getBaseResource()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return new StopContainerCmdExec(getBaseResource()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return new ContainerDiffCmdExec(getBaseResource()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return new KillContainerCmdExec(getBaseResource()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return new RestartContainerCmdExec(getBaseResource()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return new CommitCmdExec(getBaseResource()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return new TopContainerCmdExec(getBaseResource()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return new TagImageCmdExec(getBaseResource()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return new PauseContainerCmdExec(getBaseResource()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return new UnpauseContainerCmdExec(baseResource); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return new EventsCmdExec(getBaseResource()); + } + + @Override public StatsCmd.Exec createStatsCmdExec() { - return new StatsCmdExec(getBaseResource()); - } - - @Override - public void close() throws IOException { - checkNotNull(client, - "Factory not initialized. You probably forgot to call init()!"); - client.close(); - } + return new StatsCmdExec(getBaseResource()); + } + + @Override + public void close() throws IOException { + checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); + client.close(); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 98b93fd48..69578a533 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -27,8 +27,8 @@ protected Void execute(EventsCmd command) { LOGGER.trace("GET: {}", webTarget); - GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( - new JsonStreamProcessor(Event.class), command.getResultCallback(), webTarget); + GETCallbackNotifier callbackNotifier = new GETCallbackNotifier(new JsonStreamProcessor( + Event.class), command.getResultCallback(), webTarget); AbstractCallbackNotifier.startAsyncProcessing(callbackNotifier); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index 02ea4d8ae..e2d986bbf 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -10,10 +10,10 @@ import static javax.ws.rs.client.Entity.entity; -public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { +public class ExecCreateCmdExec extends AbstrDockerCmdExec implements + ExecCreateCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(VersionCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); public ExecCreateCmdExec(WebTarget baseResource) { super(baseResource); @@ -21,13 +21,12 @@ public ExecCreateCmdExec(WebTarget baseResource) { @Override protected ExecCreateCmdResponse execute(ExecCreateCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", + command.getContainerId()); LOGGER.trace("POST: {}", webResource); - return webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index cbac951d3..46d0e2d29 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -22,18 +22,15 @@ public ExecStartCmdExec(WebTarget baseResource) { super(baseResource); } - @Override protected InputStream execute(ExecStartCmd command) { WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); LOGGER.trace("POST: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), Response.class); - - return new WrappedResponseInputStream(response); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), Response.class); + + return new WrappedResponseInputStream(response); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java index c585f31c9..eafb87b98 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java @@ -10,20 +10,19 @@ import com.github.dockerjava.api.model.Info; public class InfoCmdExec extends AbstrDockerCmdExec implements InfoCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InfoCmdExec.class); - - public InfoCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Info execute(InfoCmd command) { - WebTarget webResource = getBaseResource().path("/info"); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); - } + + private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); + + public InfoCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Info execute(InfoCmd command) { + WebTarget webResource = getBaseResource().path("/info"); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Info.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java index 664a67c59..a06e46e7c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java @@ -3,28 +3,28 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; -public class InspectContainerCmdExec extends AbstrDockerCmdExec implements InspectContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InspectContainerCmdExec.class); - - public InspectContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InspectContainerResponse execute(InspectContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/json").resolveTemplate("id", command.getContainerId()); - - LOGGER.debug("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); - } +public class InspectContainerCmdExec extends AbstrDockerCmdExec + implements InspectContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectContainerCmdExec.class); + + public InspectContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InspectContainerResponse execute(InspectContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/json").resolveTemplate("id", + command.getContainerId()); + + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java index b9ee33d61..a58a520cd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java @@ -8,7 +8,8 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -public class InspectExecCmdExec extends AbstrDockerCmdExec implements InspectExecCmd.Exec { +public class InspectExecCmdExec extends AbstrDockerCmdExec implements + InspectExecCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); public InspectExecCmdExec(WebTarget baseResource) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java index 784266091..b03cdd799 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java @@ -9,21 +9,21 @@ import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; -public class InspectImageCmdExec extends AbstrDockerCmdExec implements InspectImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(InspectImageCmdExec.class); - - public InspectImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InspectImageResponse execute(InspectImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectImageResponse.class); - } +public class InspectImageCmdExec extends AbstrDockerCmdExec implements + InspectImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectImageCmdExec.class); + + public InspectImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InspectImageResponse execute(InspectImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectImageResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index 6164064c9..bbfd0dbee 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -8,30 +8,27 @@ import com.github.dockerjava.api.command.KillContainerCmd; -public class KillContainerCmdExec extends - AbstrDockerCmdExec implements - KillContainerCmd.Exec { +public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(KillContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(KillContainerCmdExec.class); - public KillContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public KillContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(KillContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/kill") - .resolveTemplate("id", command.getContainerId()); + @Override + protected Void execute(KillContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/kill").resolveTemplate("id", + command.getContainerId()); - if (command.getSignal() != null) { - webResource = webResource.queryParam("signal", command.getSignal()); - } + if (command.getSignal() != null) { + webResource = webResource.queryParam("signal", command.getSignal()); + } - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index 018db9a56..5bb905b56 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -12,19 +12,19 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -public class ListContainersCmdExec extends AbstrDockerCmdExec> implements ListContainersCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); - - public ListContainersCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(ListContainersCmd command) { - WebTarget webResource = getBaseResource().path("/containers/json") - .queryParam("all", command.hasShowAllEnabled() ? "1" : "0") - .queryParam("since", command.getSinceId()) +public class ListContainersCmdExec extends AbstrDockerCmdExec> implements + ListContainersCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); + + public ListContainersCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(ListContainersCmd command) { + WebTarget webResource = getBaseResource().path("/containers/json") + .queryParam("all", command.hasShowAllEnabled() ? "1" : "0").queryParam("since", command.getSinceId()) .queryParam("before", command.getBeforeId()) .queryParam("size", command.hasShowSizeEnabled() ? "1" : "0"); @@ -32,12 +32,13 @@ protected List execute(ListContainersCmd command) { webResource = webResource.queryParam("limit", String.valueOf(command.getLimit())); } - LOGGER.trace("GET: {}", webResource); - List containers = webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { - }); - LOGGER.trace("Response: {}", containers); + LOGGER.trace("GET: {}", webResource); + List containers = webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", containers); - return containers; - } + return containers; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 59e08fb60..b18470e12 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -14,35 +14,30 @@ import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; -public class ListImagesCmdExec extends - AbstrDockerCmdExec> implements - ListImagesCmd.Exec { +public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(ListImagesCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); - public ListImagesCmdExec(WebTarget baseResource) { - super(baseResource); - } + public ListImagesCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected List execute(ListImagesCmd command) { - WebTarget webResource = getBaseResource().path("/images/json") - .queryParam("all", command.hasShowAllEnabled() ? "1" : "0"); + @Override + protected List execute(ListImagesCmd command) { + WebTarget webResource = getBaseResource().path("/images/json").queryParam("all", + command.hasShowAllEnabled() ? "1" : "0"); - if (command.getFilters() != null) - webResource = webResource.queryParam("filters", - urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null) + webResource = webResource.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); - LOGGER.trace("GET: {}", webResource); + LOGGER.trace("GET: {}", webResource); - List images = webResource.request() - .accept(MediaType.APPLICATION_JSON) - .get(new GenericType>() { - }); - LOGGER.trace("Response: {}", images); + List images = webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", images); - return images; - } + return images; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index a738ef976..83a20bce1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -14,31 +14,30 @@ public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); - public LogContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public LogContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - 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") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") - .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); + @Override + 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") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") + .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); - LOGGER.trace("GET: {}", webTarget); + LOGGER.trace("GET: {}", webTarget); - GETCallbackNotifier callbackNotifier = new GETCallbackNotifier( - new FrameStreamProcessor(), command.getResultCallback(), 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/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index 429c61edb..4bd8ddd9a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -8,27 +8,24 @@ import com.github.dockerjava.api.command.PauseContainerCmd; -public class PauseContainerCmdExec extends - AbstrDockerCmdExec implements - PauseContainerCmd.Exec { +public class PauseContainerCmdExec extends AbstrDockerCmdExec implements + PauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(PauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); - public PauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public PauseContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(PauseContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/pause").resolveTemplate("id", - command.getContainerId()); + @Override + protected Void execute(PauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/pause").resolveTemplate("id", + command.getContainerId()); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index 65bdc04b1..9e2677e58 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -9,20 +9,20 @@ public class PingCmdExec extends AbstrDockerCmdExec implements PingCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); - public PingCmdExec(WebTarget baseResource) { - super(baseResource); - } + public PingCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(PingCmd command) { + WebTarget webResource = getBaseResource().path("/_ping"); - @Override - protected Void execute(PingCmd command) { - WebTarget webResource = getBaseResource().path("/_ping"); - LOGGER.trace("GET: {}", webResource); webResource.request().get().close(); - + return null; - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index bd89d22f6..c317aa1c9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -14,39 +14,32 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -public class PullImageCmdExec extends - AbstrDockerCmdExec implements - PullImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(PullImageCmdExec.class); - - public PullImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected InputStream execute(PullImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/create") - .queryParam("tag", command.getTag()) - .queryParam("fromImage", command.getRepository()) - .queryParam("registry", command.getRegistry()); - - LOGGER.trace("POST: {}", webResource); - Response response = resourceWithOptionalAuthConfig(command, webResource.request()) - .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); - - return new WrappedResponseInputStream(response); - } - - private Invocation.Builder resourceWithOptionalAuthConfig( - PullImageCmd command, Invocation.Builder request) { - AuthConfig authConfig = command.getAuthConfig(); - if (authConfig != null) { - request = request.header("X-Registry-Auth", - registryAuth(authConfig)); - } - return request; - } +public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); + + public PullImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(PullImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + + LOGGER.trace("POST: {}", webResource); + Response response = resourceWithOptionalAuthConfig(command, webResource.request()).accept( + MediaType.APPLICATION_OCTET_STREAM_TYPE).post(null); + + return new WrappedResponseInputStream(response); + } + + private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { + AuthConfig authConfig = command.getAuthConfig(); + if (authConfig != null) { + request = request.header("X-Registry-Auth", registryAuth(authConfig)); + } + return request; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 7fc88d91b..4f5ca5d0a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,7 +1,5 @@ package com.github.dockerjava.jaxrs; - - import static javax.ws.rs.client.Entity.entity; import java.io.IOException; @@ -26,64 +24,58 @@ import com.google.common.collect.ImmutableList; public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(PushImageCmdExec.class); - - public PushImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected ResponseImpl execute(PushImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push") - .queryParam("tag", command.getTag()); - - final String registryAuth = registryAuth(command.getAuthConfig()); - LOGGER.trace("POST: {}", webResource); - javax.ws.rs.core.Response response = webResource - .request() - .header("X-Registry-Auth", registryAuth) - .accept(MediaType.APPLICATION_JSON) - .post( - entity(Response.class, MediaType.APPLICATION_JSON)); - - return new ResponseImpl(new WrappedResponseInputStream(response)); - } - - private String name(PushImageCmd command) { - String name = command.getName(); - AuthConfig authConfig = command.getAuthConfig(); - return name.contains("/") ? name : authConfig.getUsername(); - } - - - public static class ResponseImpl extends Response { - - private final InputStream proxy; - - ResponseImpl(InputStream proxy) { - this.proxy = proxy; + + private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); + + public PushImageCmdExec(WebTarget baseResource) { + super(baseResource); } @Override - public Iterable getItems() throws IOException { - ObjectMapper mapper = new ObjectMapper(); - // we'll be reading instances of MyBean - ObjectReader reader = mapper.reader(PushEventStreamItem.class); - // and then do other configuration, if any, and read: - Iterator items = reader.readValues(proxy); - - try { - return ImmutableList.copyOf(items); - } finally { - proxy.close(); - } + protected ResponseImpl execute(PushImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); + + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("POST: {}", webResource); + javax.ws.rs.core.Response response = webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON).post(entity(Response.class, MediaType.APPLICATION_JSON)); + + return new ResponseImpl(new WrappedResponseInputStream(response)); } - @Override - public int read() throws IOException { - return proxy.read(); + private String name(PushImageCmd command) { + String name = command.getName(); + AuthConfig authConfig = command.getAuthConfig(); + return name.contains("/") ? name : authConfig.getUsername(); + } + + public static class ResponseImpl extends Response { + + private final InputStream proxy; + + ResponseImpl(InputStream proxy) { + this.proxy = proxy; + } + + @Override + public Iterable getItems() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + // we'll be reading instances of MyBean + ObjectReader reader = mapper.reader(PushEventStreamItem.class); + // and then do other configuration, if any, and read: + Iterator items = reader.readValues(proxy); + + try { + return ImmutableList.copyOf(items); + } finally { + proxy.close(); + } + } + + @Override + public int read() throws IOException { + return proxy.read(); + } } - } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index d2ff1b837..ebd98fc6f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -8,24 +8,25 @@ import com.github.dockerjava.api.command.RemoveContainerCmd; -public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements RemoveContainerCmd.Exec { +public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements + RemoveContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); - public RemoveContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public RemoveContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(RemoveContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/" + command.getContainerId()) - .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") - .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - - LOGGER.trace("DELETE: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); + @Override + protected Void execute(RemoveContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/" + command.getContainerId()) + .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") + .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - return null; - } + LOGGER.trace("DELETE: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index d5d7b8000..8db23112b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -9,22 +9,22 @@ public class RemoveImageCmdExec extends AbstrDockerCmdExec implements RemoveImageCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); - - public RemoveImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(RemoveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId()) - .queryParam("force", command.hasForceEnabled() ? "1" : "0") - .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); - - LOGGER.trace("DELETE: {}", webResource); - webResource.request().delete().close(); - - return null; - } + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); + + public RemoveImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(RemoveImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getImageId()) + .queryParam("force", command.hasForceEnabled() ? "1" : "0") + .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); + + LOGGER.trace("DELETE: {}", webResource); + webResource.request().delete().close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index 9ac76a36a..f640945a2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -8,28 +8,24 @@ import com.github.dockerjava.api.command.RestartContainerCmd; -public class RestartContainerCmdExec extends - AbstrDockerCmdExec implements - RestartContainerCmd.Exec { +public class RestartContainerCmdExec extends AbstrDockerCmdExec implements + RestartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(RestartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); - public RestartContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public RestartContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(RestartContainerCmd command) { - WebTarget webResource = getBaseResource() - .path("/containers/{id}/restart") - .resolveTemplate("id", command.getContainerId()) - .queryParam("t", String.valueOf(command.getTimeout())); + @Override + protected Void execute(RestartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/restart") + .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index 8d70e2f6f..de56a39b6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -13,8 +13,7 @@ import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class SaveImageCmdExec extends AbstrDockerCmdExec implements SaveImageCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(SaveImageCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); public SaveImageCmdExec(WebTarget baseResource) { super(baseResource); @@ -22,14 +21,11 @@ public SaveImageCmdExec(WebTarget baseResource) { @Override protected InputStream execute(SaveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get") - .queryParam("tag", command.getTag()); + WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get").queryParam("tag", + command.getTag()); LOGGER.trace("GET: {}", webResource); - Response response = webResource - .request() - .accept(MediaType.APPLICATION_JSON) - .get(); + Response response = webResource.request().accept(MediaType.APPLICATION_JSON).get(); return new WrappedResponseInputStream(response); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java index a7b6ddbc2..00aeb91ec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java @@ -12,21 +12,22 @@ import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; -public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements SearchImagesCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); - - public SearchImagesCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected List execute(SearchImagesCmd command) { - WebTarget webResource = getBaseResource().path("/images/search").queryParam("term", command.getTerm()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { +public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements + SearchImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); + + public SearchImagesCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected List execute(SearchImagesCmd command) { + WebTarget webResource = getBaseResource().path("/images/search").queryParam("term", command.getTerm()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { }); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 8ca1a42fc..c90f5e1cc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -10,22 +10,25 @@ import com.github.dockerjava.api.command.StartContainerCmd; -public class StartContainerCmdExec extends AbstrDockerCmdExec implements StartContainerCmd.Exec { +public class StartContainerCmdExec extends AbstrDockerCmdExec implements + StartContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); - public StartContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public StartContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(StartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", command.getContainerId()); + @Override + protected Void execute(StartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", + command.getContainerId()); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)).close(); - - return null; - } + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)) + .close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index bf683be59..3197e0c0e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -8,26 +8,22 @@ import com.github.dockerjava.api.command.StopContainerCmd; -public class StopContainerCmdExec extends - AbstrDockerCmdExec implements - StopContainerCmd.Exec { +public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(StopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); - public StopContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public StopContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(StopContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/stop") - .resolveTemplate("id", command.getContainerId()) - .queryParam("t", String.valueOf(command.getTimeout())); + @Override + protected Void execute(StopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/stop") + .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); - return null; - } + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index dfbeba072..3cddd63f2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -8,26 +8,22 @@ import com.github.dockerjava.api.command.TagImageCmd; public class TagImageCmdExec extends AbstrDockerCmdExec implements TagImageCmd.Exec { - - private static final Logger LOGGER = LoggerFactory - .getLogger(TagImageCmdExec.class); - - public TagImageCmdExec(WebTarget baseResource) { - super(baseResource); - } - - @Override - protected Void execute(TagImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId() + "/tag") - .queryParam("repo", command.getRepository()) - .queryParam("tag", command.getTag()) + + private static final Logger LOGGER = LoggerFactory.getLogger(TagImageCmdExec.class); + + public TagImageCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @Override + protected Void execute(TagImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getImageId() + "/tag") + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) .queryParam("force", command.hasForceEnabled() ? "1" : "0"); - LOGGER.trace("POST: {}", webResource); - webResource.request().post(null).close(); - return null; - } - - + LOGGER.trace("POST: {}", webResource); + webResource.request().post(null).close(); + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java index 55c431ccd..daff2224b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java @@ -11,24 +11,25 @@ import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; -public class TopContainerCmdExec extends AbstrDockerCmdExec implements TopContainerCmd.Exec { +public class TopContainerCmdExec extends AbstrDockerCmdExec implements + TopContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); - public TopContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public TopContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected TopContainerResponse execute(TopContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/top") - .resolveTemplate("id", command.getContainerId()); + @Override + protected TopContainerResponse execute(TopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/top").resolveTemplate("id", + command.getContainerId()); - if(!StringUtils.isEmpty(command.getPsArgs())) - webResource = webResource.queryParam("ps_args", command.getPsArgs()); - - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); - } + if (!StringUtils.isEmpty(command.getPsArgs())) + webResource = webResource.queryParam("ps_args", command.getPsArgs()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java index 4b6cfbba3..3fea92126 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java @@ -1,4 +1,5 @@ package com.github.dockerjava.jaxrs; + /* * Copyright (c) 2014 Spotify AB. * @@ -20,8 +21,6 @@ * under the License. */ - - import org.apache.http.HttpHost; import org.apache.http.annotation.Immutable; import org.apache.http.conn.ConnectTimeoutException; @@ -42,44 +41,40 @@ @Immutable public class UnixConnectionSocketFactory implements ConnectionSocketFactory { - private File socketFile; - - public UnixConnectionSocketFactory(final URI socketUri) { - super(); + private File socketFile; - final String filename = socketUri.toString() - .replaceAll("^unix:///", "unix://localhost/") - .replaceAll("^unix://localhost", ""); + public UnixConnectionSocketFactory(final URI socketUri) { + super(); - this.socketFile = new File(filename); - } + final String filename = socketUri.toString().replaceAll("^unix:///", "unix://localhost/") + .replaceAll("^unix://localhost", ""); - public static URI sanitizeUri(final URI uri) { - if (uri.getScheme().equals("unix")) { - return URI.create("unix://localhost:80"); - } else { - return uri; + this.socketFile = new File(filename); } - } - @Override - public Socket createSocket(final HttpContext context) throws IOException { - return new ApacheUnixSocket(); - } + public static URI sanitizeUri(final URI uri) { + if (uri.getScheme().equals("unix")) { + return URI.create("unix://localhost:80"); + } else { + return uri; + } + } - @Override - public Socket connectSocket(final int connectTimeout, - final Socket socket, - final HttpHost host, - final InetSocketAddress remoteAddress, - final InetSocketAddress localAddress, - final HttpContext context) throws IOException { - try { - socket.connect(new AFUNIXSocketAddress(socketFile), connectTimeout); - } catch (SocketTimeoutException e) { - throw new ConnectTimeoutException(e, null, remoteAddress.getAddress()); + @Override + public Socket createSocket(final HttpContext context) throws IOException { + return new ApacheUnixSocket(); } - return socket; - } + @Override + public Socket connectSocket(final int connectTimeout, final Socket socket, final HttpHost host, + final InetSocketAddress remoteAddress, final InetSocketAddress localAddress, final HttpContext context) + throws IOException { + try { + socket.connect(new AFUNIXSocketAddress(socketFile), connectTimeout); + } catch (SocketTimeoutException e) { + throw new ConnectTimeoutException(e, null, remoteAddress.getAddress()); + } + + return socket; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java index 7fed603a5..de507e8ff 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java @@ -8,24 +8,24 @@ import com.github.dockerjava.api.command.UnpauseContainerCmd; -public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements UnpauseContainerCmd.Exec { +public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements + UnpauseContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); - public UnpauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public UnpauseContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Void execute(UnpauseContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/unpause") - .resolveTemplate("id", command.getContainerId()); - - LOGGER.trace("POST: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON) - .post(null).close(); + @Override + protected Void execute(UnpauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/unpause").resolveTemplate("id", + command.getContainerId()); - return null; - } + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); + + return null; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java index 9b4ac817a..e8af1cb29 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java @@ -11,20 +11,18 @@ public class VersionCmdExec extends AbstrDockerCmdExec implements VersionCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(VersionCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); - public VersionCmdExec(WebTarget baseResource) { - super(baseResource); - } + public VersionCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Version execute(VersionCmd command) { - WebTarget webResource = getBaseResource().path("/version"); + @Override + protected Version execute(VersionCmd command) { + WebTarget webResource = getBaseResource().path("/version"); - LOGGER.trace("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .get(Version.class); - } + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Version.class); + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index 1b81eee33..47af2bcfa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -9,25 +9,24 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.command.WaitContainerCmd; -public class WaitContainerCmdExec extends AbstrDockerCmdExec implements WaitContainerCmd.Exec { +public class WaitContainerCmdExec extends AbstrDockerCmdExec implements + WaitContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory - .getLogger(WaitContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); - public WaitContainerCmdExec(WebTarget baseResource) { - super(baseResource); - } + public WaitContainerCmdExec(WebTarget baseResource) { + super(baseResource); + } - @Override - protected Integer execute(WaitContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/wait") - .resolveTemplate("id", command.getContainerId()); + @Override + protected Integer execute(WaitContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON).post(null, ObjectNode.class); - LOGGER.trace("POST: {}", webResource); - ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON) - .post(null, ObjectNode.class); - return ObjectNode.get("StatusCode").asInt(); - } + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java index f8baeef98..6cfc7a76e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -27,8 +27,8 @@ public abstract class AbstractCallbackNotifier implements Callable { protected final WebTarget webTarget; - protected AbstractCallbackNotifier(ResponseStreamProcessor responseStreamProcessor, ResultCallback resultCallback, - 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; 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 63fea0954..d11cdd7a0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -40,7 +40,6 @@ * holder. */ - import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -127,8 +126,7 @@ 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. + * 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: *

    @@ -144,35 +142,32 @@ *
  • {@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. + * 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}. + * 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. + * 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. + * 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. + * 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. @@ -190,6 +185,7 @@ 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 { @@ -198,14 +194,18 @@ class ApacheConnector implements Connector { } 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. + * @param config + * client configuration. */ ApacheConnector(Configuration config) { Object reqConfig = null; @@ -215,26 +215,18 @@ class ApacheConnector implements Connector { 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()) - ); + 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()) - ); + LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.REQUEST_CONFIG, reqConfig.getClass().getName(), + RequestConfig.class.getName())); reqConfig = null; } } @@ -267,31 +259,30 @@ class ApacheConnector implements Connector { 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); + 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); + 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) - ); + 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); + 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) { @@ -324,10 +315,8 @@ class ApacheConnector implements Connector { } private SSLContext getSslContext(final Configuration config) { - final SslConfigurator sslConfigurator = ApacheClientProperties.getValue( - config.getProperties(), - ApacheClientProperties.SSL_CONFIG, - SslConfigurator.class); + final SslConfigurator sslConfigurator = ApacheClientProperties.getValue(config.getProperties(), + ApacheClientProperties.SSL_CONFIG, SslConfigurator.class); return sslConfigurator != null ? sslConfigurator.createSSLContext() : null; } @@ -340,34 +329,22 @@ HttpClientConnectionManager getConnectionManager(final Configuration config, fin 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()) - ); + 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); + return createConnectionManager(config, sslContext, null, false); } - private HttpClientConnectionManager createConnectionManager( - final Configuration config, - final SSLContext sslContext, - X509HostnameVerifier hostnameVerifier, - final boolean useSystemProperties) { + 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; + 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; @@ -375,30 +352,26 @@ private HttpClientConnectionManager createConnectionManager( final LayeredConnectionSocketFactory sslSocketFactory; if (sslContext != null) { - sslSocketFactory = new SSLConnectionSocketFactory( - sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifier); + sslSocketFactory = new SSLConnectionSocketFactory(sslContext, supportedProtocols, supportedCipherSuites, + hostnameVerifier); } else { if (useSystemProperties) { - sslSocketFactory = new SSLConnectionSocketFactory( - (SSLSocketFactory) SSLSocketFactory.getDefault(), + sslSocketFactory = new SSLConnectionSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault(), supportedProtocols, supportedCipherSuites, hostnameVerifier); } else { - sslSocketFactory = new SSLConnectionSocketFactory( - SSLContexts.createDefault(), - hostnameVerifier); + sslSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), hostnameVerifier); } } - final Registry registry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", sslSocketFactory) + 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)); + final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, + new ConnectionFactory(chunkSize)); if (useSystemProperties) { String s = System.getProperty("http.keepAlive", "true"); @@ -433,8 +406,8 @@ public HttpClient getHttpClient() { /** * Get the {@link CookieStore}. * - * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to - * {@code true}. + * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set + * to {@code true}. */ public CookieStore getCookieStore() { return cookieStore; @@ -465,15 +438,15 @@ 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(), - this.getClass().getName()); + 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 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(); @@ -506,7 +479,6 @@ public ClientResponse apply(final ClientRequest clientRequest) throws Processing } } - try { responseContext.setEntityStream(new HttpClientResponseInputStream(response)); } catch (final IOException e) { @@ -554,23 +526,18 @@ private HttpHost getHost(final HttpUriRequest request) { } private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) { - final Boolean redirectsEnabled = - clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, requestConfig.isRedirectsEnabled()); + 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(); + 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(); @@ -628,7 +595,8 @@ public boolean isStreaming() { } } - private static Map writeOutBoundHeaders(final MultivaluedMap headers, final HttpUriRequest request) { + private static Map writeOutBoundHeaders(final MultivaluedMap headers, + final HttpUriRequest request) { Map stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers); for (Map.Entry e : stringHeaders.entrySet()) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java index 7ba9d8abd..a4d68e202 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java @@ -18,35 +18,31 @@ * */ 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(); - } - - + + 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 index fbde136ff..90600b608 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java @@ -50,8 +50,8 @@ 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. + * 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: *

    @@ -62,29 +62,28 @@ *
  • {@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 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. + * {@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}. + * 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 @@ -92,9 +91,8 @@ * 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. + * 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. @@ -115,23 +113,23 @@ public Connector getConnector(Client client, Configuration 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}. + * 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}. + * @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}. + * @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())); + throw new IllegalArgumentException(LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component + .getClass().getName())); } final Initializable initializable = (Initializable) component; @@ -148,4 +146,3 @@ public static HttpClient getHttpClient(Configurable component) { throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED()); } } - 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 752ff3423..b782667fe 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -6,65 +6,66 @@ import javax.ws.rs.core.Response; /** - * 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 blocking/hanging connections. + * 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 + * blocking/hanging connections. * * @author marcus */ public class WrappedResponseInputStream extends InputStream { - - private Response response; - private InputStream delegate; - - public WrappedResponseInputStream(Response response) { - this.response = response; - this.delegate = response.readEntity(InputStream.class); - } - - public int read() throws IOException { - return delegate.read(); - } - - public int hashCode() { - return delegate.hashCode(); - } - - public int read(byte[] b) throws IOException { - return delegate.read(b); - } - - public boolean equals(Object obj) { - return delegate.equals(obj); - } - - public int read(byte[] b, int off, int len) throws IOException { - return delegate.read(b, off, len); - } - - public long skip(long n) throws IOException { - return delegate.skip(n); - } - - public int available() throws IOException { - return delegate.available(); - } - - public void close() throws IOException { - response.close(); - delegate.close(); - } - - public void mark(int readlimit) { - delegate.mark(readlimit); - } - - public void reset() throws IOException { - delegate.reset(); - } - - public boolean markSupported() { - return delegate.markSupported(); - } - + + private Response response; + + private InputStream delegate; + + public WrappedResponseInputStream(Response response) { + this.response = response; + this.delegate = response.readEntity(InputStream.class); + } + + public int read() throws IOException { + return delegate.read(); + } + + public int hashCode() { + return delegate.hashCode(); + } + + public int read(byte[] b) throws IOException { + return delegate.read(b); + } + + public boolean equals(Object obj) { + return delegate.equals(obj); + } + + public int read(byte[] b, int off, int len) throws IOException { + return delegate.read(b, off, len); + } + + public long skip(long n) throws IOException { + return delegate.skip(n); + } + + public int available() throws IOException { + return delegate.available(); + } + + public void close() throws IOException { + response.close(); + delegate.close(); + } + + public void mark(int readlimit) { + delegate.mark(readlimit); + } + + public void reset() throws IOException { + delegate.reset(); + } + + public boolean markSupported() { + return delegate.markSupported(); + } + } diff --git a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java index 500919fdc..8eed37b62 100644 --- a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java +++ b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -26,20 +26,20 @@ /** * References test resources and provides basic tests functionality. + * * @author Oleg Nenashev */ public enum CommandJSONSamples implements JSONResourceRef { - - inspectContainerResponse_full, - inspectContainerResponse_empty; - + + 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 index 2e294b146..bbe0a06f5 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -22,18 +22,18 @@ /** * 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); + 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); @@ -43,7 +43,7 @@ public void roundTrip_full() throws IOException { 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/java/com/github/dockerjava/api/model/AccessModeTest.java b/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java index 432f7b00f..bdbc2e225 100644 --- a/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java @@ -7,25 +7,24 @@ public class AccessModeTest { - @Test - public void defaultAccessMode() { - assertEquals(AccessMode.DEFAULT, rw); - } - - @Test - public void stringify() { - assertEquals(AccessMode.rw.toString(), "rw"); - } - - @Test - public void fromString() { - assertEquals(AccessMode.valueOf("rw"), rw); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "No enum const.*") - public void fromIllegalString() { - AccessMode.valueOf("xx"); - } + @Test + public void defaultAccessMode() { + assertEquals(AccessMode.DEFAULT, rw); + } + + @Test + public void stringify() { + assertEquals(AccessMode.rw.toString(), "rw"); + } + + @Test + public void fromString() { + assertEquals(AccessMode.valueOf("rw"), rw); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "No enum const.*") + public void fromIllegalString() { + AccessMode.valueOf("xx"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/BindTest.java b/src/test/java/com/github/dockerjava/api/model/BindTest.java index 50a41fc38..db5aec212 100644 --- a/src/test/java/com/github/dockerjava/api/model/BindTest.java +++ b/src/test/java/com/github/dockerjava/api/model/BindTest.java @@ -7,62 +7,59 @@ import org.testng.annotations.Test; public class BindTest { - - @Test - public void parseUsingDefaultAccessMode() { - Bind bind = Bind.parse("/host:/container"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), AccessMode.DEFAULT); - } - @Test - public void parseReadWrite() { - Bind bind = Bind.parse("/host:/container:rw"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), rw); - } - - @Test - public void parseReadOnly() { - Bind bind = Bind.parse("/host:/container:ro"); - assertEquals(bind.getPath(), "/host"); - assertEquals(bind.getVolume().getPath(), "/container"); - assertEquals(bind.getAccessMode(), ro); - } + @Test + public void parseUsingDefaultAccessMode() { + Bind bind = Bind.parse("/host:/container"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), AccessMode.DEFAULT); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind.*") - public void parseInvalidAccessMode() { - Bind.parse("/host:/container:xx"); - } + @Test + public void parseReadWrite() { + Bind bind = Bind.parse("/host:/container:rw"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), rw); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind 'nonsense'") - public void parseInvalidInput() { - Bind.parse("nonsense"); - } + @Test + public void parseReadOnly() { + Bind bind = Bind.parse("/host:/container:ro"); + assertEquals(bind.getPath(), "/host"); + assertEquals(bind.getVolume().getPath(), "/container"); + assertEquals(bind.getAccessMode(), ro); + } - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Bind 'null'") - public void parseNull() { - Bind.parse(null); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind.*") + public void parseInvalidAccessMode() { + Bind.parse("/host:/container:xx"); + } - @Test - public void toStringReadOnly() { - assertEquals(Bind.parse("/host:/container:ro").toString(), "/host:/container:ro"); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind 'nonsense'") + public void parseInvalidInput() { + Bind.parse("nonsense"); + } - @Test - public void toStringReadWrite() { - assertEquals(Bind.parse("/host:/container:rw").toString(), "/host:/container:rw"); - } + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind 'null'") + public void parseNull() { + Bind.parse(null); + } - @Test - public void toStringDefaultAccessMode() { - assertEquals(Bind.parse("/host:/container").toString(), "/host:/container:rw"); - } + @Test + public void toStringReadOnly() { + assertEquals(Bind.parse("/host:/container:ro").toString(), "/host:/container:ro"); + } + + @Test + public void toStringReadWrite() { + assertEquals(Bind.parse("/host:/container:rw").toString(), "/host:/container:rw"); + } + + @Test + public void toStringDefaultAccessMode() { + assertEquals(Bind.parse("/host:/container").toString(), "/host:/container:rw"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/BindingTest.java b/src/test/java/com/github/dockerjava/api/model/BindingTest.java index 0379dcdb0..3309a8904 100644 --- a/src/test/java/com/github/dockerjava/api/model/BindingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/BindingTest.java @@ -8,51 +8,49 @@ public class BindingTest { - @Test - public void parseIpAndPort() { - assertEquals(Binding.parse("127.0.0.1:80"), Ports.Binding("127.0.0.1", 80)); - } - - @Test - public void parsePortOnly() { - assertEquals(Binding.parse("80"), Ports.Binding(null, 80)); - } - - @Test - public void parseIPOnly() { - assertEquals(Binding.parse("127.0.0.1"), Ports.Binding("127.0.0.1", null)); - } - - @Test - public void parseEmptyString() { - assertEquals(Binding.parse(""), Ports.Binding(null, null)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Binding 'nonsense'") - public void parseInvalidInput() { - Binding.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Binding 'null'") - public void parseNull() { - Binding.parse(null); - } - - @Test - public void toStringIpAndHost() { - assertEquals(Binding.parse("127.0.0.1:80").toString(), "127.0.0.1:80"); - } - - @Test - public void toStringPortOnly() { - assertEquals(Binding.parse("80").toString(), "80"); - } - - @Test - public void toStringIpOnly() { - assertEquals(Binding.parse("127.0.0.1").toString(), "127.0.0.1"); - } + @Test + public void parseIpAndPort() { + assertEquals(Binding.parse("127.0.0.1:80"), Ports.Binding("127.0.0.1", 80)); + } + + @Test + public void parsePortOnly() { + assertEquals(Binding.parse("80"), Ports.Binding(null, 80)); + } + + @Test + public void parseIPOnly() { + assertEquals(Binding.parse("127.0.0.1"), Ports.Binding("127.0.0.1", null)); + } + + @Test + public void parseEmptyString() { + assertEquals(Binding.parse(""), Ports.Binding(null, null)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Binding 'nonsense'") + public void parseInvalidInput() { + Binding.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Binding 'null'") + public void parseNull() { + Binding.parse(null); + } + + @Test + public void toStringIpAndHost() { + assertEquals(Binding.parse("127.0.0.1:80").toString(), "127.0.0.1:80"); + } + + @Test + public void toStringPortOnly() { + assertEquals(Binding.parse("80").toString(), "80"); + } + + @Test + public void toStringIpOnly() { + assertEquals(Binding.parse("127.0.0.1").toString(), "127.0.0.1"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java b/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java index eb6e2a542..e45ad2e8e 100644 --- a/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java +++ b/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java @@ -8,22 +8,22 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class CapabilityTest { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = new ObjectMapper(); - @Test - public void serializeCapability() throws Exception { - String json = objectMapper.writeValueAsString(Capability.ALL); - assertEquals(json, "\"ALL\""); - } + @Test + public void serializeCapability() throws Exception { + String json = objectMapper.writeValueAsString(Capability.ALL); + assertEquals(json, "\"ALL\""); + } - @Test - public void deserializeCapability() throws Exception { - Capability capability = objectMapper.readValue("\"ALL\"", Capability.class); - assertEquals(capability, Capability.ALL); - } + @Test + public void deserializeCapability() throws Exception { + Capability capability = objectMapper.readValue("\"ALL\"", Capability.class); + assertEquals(capability, Capability.ALL); + } - @Test(expectedExceptions = JsonMappingException.class) - public void deserializeInvalidCapability() throws Exception { - objectMapper.readValue("\"nonsense\"", Capability.class); - } + @Test(expectedExceptions = JsonMappingException.class) + public void deserializeInvalidCapability() throws Exception { + objectMapper.readValue("\"nonsense\"", Capability.class); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java b/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java index de1d23c21..086613045 100644 --- a/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java +++ b/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java @@ -8,33 +8,31 @@ public class ExposedPortTest { - @Test - public void parsePortAndProtocol() { - ExposedPort exposedPort = ExposedPort.parse("80/tcp"); - assertEquals(exposedPort, new ExposedPort(80, TCP)); - } - - @Test - public void parsePortOnly() { - ExposedPort exposedPort = ExposedPort.parse("80"); - assertEquals(exposedPort, new ExposedPort(80, DEFAULT)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'nonsense'") - public void parseInvalidInput() { - ExposedPort.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'null'") - public void parseNull() { - ExposedPort.parse(null); - } - - @Test - public void stringify() { - assertEquals(ExposedPort.parse("80/tcp").toString(), "80/tcp"); - } + @Test + public void parsePortAndProtocol() { + ExposedPort exposedPort = ExposedPort.parse("80/tcp"); + assertEquals(exposedPort, new ExposedPort(80, TCP)); + } + + @Test + public void parsePortOnly() { + ExposedPort exposedPort = ExposedPort.parse("80"); + assertEquals(exposedPort, new ExposedPort(80, DEFAULT)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'nonsense'") + public void parseInvalidInput() { + ExposedPort.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing ExposedPort 'null'") + public void parseNull() { + ExposedPort.parse(null); + } + + @Test + public void stringify() { + assertEquals(ExposedPort.parse("80/tcp").toString(), "80/tcp"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java index d57c0b572..14325bd12 100644 --- a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java +++ b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java @@ -2,38 +2,36 @@ import junit.framework.TestCase; - public class IdentifierTest extends TestCase { - public void testFromCompoundString() throws Exception { - - Identifier i1 = Identifier.fromCompoundString("10.0.0.1/jim"); - Identifier i2 = Identifier.fromCompoundString("10.0.0.1/jim:123"); - Identifier i3 = Identifier.fromCompoundString("10.0.0.1:123/jim:124"); - Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); + public void testFromCompoundString() throws Exception { - assertTrue(!i1.tag.isPresent()); - assertEquals(i1.repository.name, "10.0.0.1/jim"); + Identifier i1 = Identifier.fromCompoundString("10.0.0.1/jim"); + Identifier i2 = Identifier.fromCompoundString("10.0.0.1/jim:123"); + Identifier i3 = Identifier.fromCompoundString("10.0.0.1:123/jim:124"); + Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); - assertTrue(i2.tag.isPresent()); - assertEquals(i2.tag.get(), "123"); - assertEquals(i2.repository.name, "10.0.0.1/jim"); + assertTrue(!i1.tag.isPresent()); + assertEquals(i1.repository.name, "10.0.0.1/jim"); - assertTrue(i3.tag.isPresent()); - assertEquals(i3.tag.get(), "124"); - assertEquals(i3.repository.name, "10.0.0.1:123/jim"); - assertEquals(i3.repository.getURL().getPort(), 123); - assertEquals(i3A.tag.get(), "latest"); + assertTrue(i2.tag.isPresent()); + assertEquals(i2.tag.get(), "123"); + assertEquals(i2.repository.name, "10.0.0.1/jim"); + assertTrue(i3.tag.isPresent()); + assertEquals(i3.tag.get(), "124"); + assertEquals(i3.repository.name, "10.0.0.1:123/jim"); + assertEquals(i3.repository.getURL().getPort(), 123); + assertEquals(i3A.tag.get(), "latest"); - Identifier i4 = Identifier.fromCompoundString("centos:latest"); - assertTrue(i4.tag.isPresent()); - assertEquals(i4.tag.get(), "latest"); + Identifier i4 = Identifier.fromCompoundString("centos:latest"); + assertTrue(i4.tag.isPresent()); + assertEquals(i4.tag.get(), "latest"); - Identifier i5 = Identifier.fromCompoundString("busybox"); - assertTrue(!i5.tag.isPresent()); + Identifier i5 = Identifier.fromCompoundString("busybox"); + assertTrue(!i5.tag.isPresent()); - Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); - assertEquals(i6.repository.getPath(), "my-test-image"); - } + Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); + assertEquals(i6.repository.getPath(), "my-test-image"); + } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java b/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java index ea0b20d73..25da40d74 100644 --- a/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java +++ b/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java @@ -7,36 +7,34 @@ public class InternetProtocolTest { - @Test - public void defaultProtocol() { - assertEquals(InternetProtocol.DEFAULT, TCP); - } - - @Test - public void stringify() { - assertEquals(TCP.toString(), "tcp"); - } - - @Test - public void parseUpperCase() { - assertEquals(InternetProtocol.parse("TCP"), TCP); - } - - @Test - public void parseLowerCase() { - assertEquals(InternetProtocol.parse("tcp"), TCP); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Protocol.*") - public void parseInvalidInput() { - InternetProtocol.parse("xx"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Protocol 'null'") - public void parseNull() { - InternetProtocol.parse(null); - } + @Test + public void defaultProtocol() { + assertEquals(InternetProtocol.DEFAULT, TCP); + } + + @Test + public void stringify() { + assertEquals(TCP.toString(), "tcp"); + } + + @Test + public void parseUpperCase() { + assertEquals(InternetProtocol.parse("TCP"), TCP); + } + + @Test + public void parseLowerCase() { + assertEquals(InternetProtocol.parse("tcp"), TCP); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Protocol.*") + public void parseInvalidInput() { + InternetProtocol.parse("xx"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Protocol 'null'") + public void parseNull() { + InternetProtocol.parse(null); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/LinkTest.java b/src/test/java/com/github/dockerjava/api/model/LinkTest.java index 2f6df0c5e..208e9f363 100644 --- a/src/test/java/com/github/dockerjava/api/model/LinkTest.java +++ b/src/test/java/com/github/dockerjava/api/model/LinkTest.java @@ -6,35 +6,33 @@ public class LinkTest { - @Test - public void parse() { - Link link = Link.parse("name:alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); - } - - @Test - public void parseWithContainerNames() { - Link link = Link.parse("/name:/conatiner/alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Link 'nonsense'") - public void parseInvalidInput() { - Link.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing Link 'null'") - public void parseNull() { - Link.parse(null); - } - - @Test - public void stringify() { - assertEquals(Link.parse("name:alias").toString(), "name:alias"); - } + @Test + public void parse() { + Link link = Link.parse("name:alias"); + assertEquals(link.getName(), "name"); + assertEquals(link.getAlias(), "alias"); + } + + @Test + public void parseWithContainerNames() { + Link link = Link.parse("/name:/conatiner/alias"); + assertEquals(link.getName(), "name"); + assertEquals(link.getAlias(), "alias"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Link 'nonsense'") + public void parseInvalidInput() { + Link.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Link 'null'") + public void parseNull() { + Link.parse(null); + } + + @Test + public void stringify() { + assertEquals(Link.parse("name:alias").toString(), "name:alias"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java b/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java index 2aeb768f6..e5f5f4c1b 100644 --- a/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java @@ -7,55 +7,48 @@ import com.github.dockerjava.api.model.Ports.Binding; public class PortBindingTest { - - private static final ExposedPort TCP_8080 = ExposedPort.tcp(8080); - - @Test - public void fullDefinition() { - assertEquals(PortBinding.parse("127.0.0.1:80:8080/tcp"), - new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); - } - - @Test - public void noProtocol() { - assertEquals(PortBinding.parse("127.0.0.1:80:8080"), - new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); - } - - @Test - public void noHostIp() { - assertEquals(PortBinding.parse("80:8080/tcp"), - new PortBinding(new Binding(80), TCP_8080)); - } - - @Test - public void portsOnly() { - assertEquals(PortBinding.parse("80:8080"), - new PortBinding(new Binding(80), TCP_8080)); - } - - @Test - public void exposedPortOnly() { - assertEquals(PortBinding.parse("8080"), - new PortBinding(new Binding(), TCP_8080)); - } - - @Test - public void dynamicHostPort() { - assertEquals(PortBinding.parse("127.0.0.1::8080"), - new PortBinding(new Binding("127.0.0.1"), TCP_8080)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing PortBinding 'nonsense'") - public void parseInvalidInput() { - PortBinding.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing PortBinding 'null'") - public void parseNull() { - PortBinding.parse(null); - } + + private static final ExposedPort TCP_8080 = ExposedPort.tcp(8080); + + @Test + public void fullDefinition() { + assertEquals(PortBinding.parse("127.0.0.1:80:8080/tcp"), + new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); + } + + @Test + public void noProtocol() { + assertEquals(PortBinding.parse("127.0.0.1:80:8080"), new PortBinding(new Binding("127.0.0.1", 80), TCP_8080)); + } + + @Test + public void noHostIp() { + assertEquals(PortBinding.parse("80:8080/tcp"), new PortBinding(new Binding(80), TCP_8080)); + } + + @Test + public void portsOnly() { + assertEquals(PortBinding.parse("80:8080"), new PortBinding(new Binding(80), TCP_8080)); + } + + @Test + public void exposedPortOnly() { + assertEquals(PortBinding.parse("8080"), new PortBinding(new Binding(), TCP_8080)); + } + + @Test + public void dynamicHostPort() { + assertEquals(PortBinding.parse("127.0.0.1::8080"), new PortBinding(new Binding("127.0.0.1"), TCP_8080)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing PortBinding 'nonsense'") + public void parseInvalidInput() { + PortBinding.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing PortBinding 'null'") + public void parseNull() { + PortBinding.parse(null); + } } 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 9190eefd2..8c8d2014f 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 @@ -10,50 +10,51 @@ import com.github.dockerjava.api.model.Ports.Binding; 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 { - Ports ports = objectMapper.readValue(jsonWithDoubleBindingForOnePort, Ports.class); - Map map = ports.getBindings(); - assertEquals(map.size(), 1); - - Binding[] bindings = map.get(ExposedPort.tcp(80)); - assertEquals(bindings.length, 2); - assertEquals(bindings[0], new Binding("10.0.0.1", 80)); - assertEquals(bindings[1], new Binding("10.0.0.2", 80)); - } - - @Test - public void serializingPortWithMultipleBindings() throws Exception { - Ports ports = new Ports(); - ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", 80)); - ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", 80)); - assertEquals(objectMapper.writeValueAsString(ports), jsonWithDoubleBindingForOnePort); - } - - @Test - 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); - } + 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 { + Ports ports = objectMapper.readValue(jsonWithDoubleBindingForOnePort, Ports.class); + Map map = ports.getBindings(); + assertEquals(map.size(), 1); + + Binding[] bindings = map.get(ExposedPort.tcp(80)); + assertEquals(bindings.length, 2); + assertEquals(bindings[0], new Binding("10.0.0.1", 80)); + assertEquals(bindings[1], new Binding("10.0.0.2", 80)); + } + + @Test + public void serializingPortWithMultipleBindings() throws Exception { + Ports ports = new Ports(); + ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", 80)); + ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", 80)); + assertEquals(objectMapper.writeValueAsString(ports), jsonWithDoubleBindingForOnePort); + } + + @Test + 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 18c7f0f09..7b22bd039 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 @@ -11,56 +11,53 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * As there may be several {@link Binding}s per {@link ExposedPort}, - * it makes a difference if you add {@link PortBinding}s for the - * same or different {@link ExposedPort}s to {@link Ports}. - * This test verifies that the Map in {@link Ports} is populated - * correctly in both cases. + * As there may be several {@link Binding}s per {@link ExposedPort}, it makes a difference if you add + * {@link PortBinding}s for the same or different {@link ExposedPort}s to {@link Ports}. This test verifies that the Map + * in {@link Ports} is populated correctly in both cases. */ public class Ports_addBindingsTest { - private static final ExposedPort TCP_80 = ExposedPort.tcp(80); - private static final ExposedPort TCP_90 = ExposedPort.tcp(90); - private static final Binding BINDING_8080 = Ports.Binding(8080); - private static final Binding BINDING_9090 = Ports.Binding(9090); - - private Ports ports; - - @BeforeMethod - public void setup() { - ports = new Ports(); - } - - @Test - public void addTwoBindingsForDifferentExposedPorts() { - ports.add( - new PortBinding(BINDING_8080, TCP_80), - new PortBinding(BINDING_9090, TCP_90)); - - Map bindings = ports.getBindings(); - // two keys with one value each - assertEquals(bindings.size(), 2); - assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080 }); - assertEquals(bindings.get(TCP_90), new Binding[] { BINDING_9090 }); - } - - @Test - public void addTwoBindingsForSameExposedPort() { - ports.add( - new PortBinding(BINDING_8080, TCP_80), - new PortBinding(BINDING_9090, TCP_80)); - - Map bindings = ports.getBindings(); - // one key with two values - assertEquals(bindings.size(), 1); - 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); - } + private static final ExposedPort TCP_80 = ExposedPort.tcp(80); + + private static final ExposedPort TCP_90 = ExposedPort.tcp(90); + + private static final Binding BINDING_8080 = Ports.Binding(8080); + + private static final Binding BINDING_9090 = Ports.Binding(9090); + + private Ports ports; + + @BeforeMethod + public void setup() { + ports = new Ports(); + } + + @Test + public void addTwoBindingsForDifferentExposedPorts() { + ports.add(new PortBinding(BINDING_8080, TCP_80), new PortBinding(BINDING_9090, TCP_90)); + + Map bindings = ports.getBindings(); + // two keys with one value each + assertEquals(bindings.size(), 2); + assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080 }); + assertEquals(bindings.get(TCP_90), new Binding[] { BINDING_9090 }); + } + + @Test + public void addTwoBindingsForSameExposedPort() { + ports.add(new PortBinding(BINDING_8080, TCP_80), new PortBinding(BINDING_9090, TCP_80)); + + Map bindings = ports.getBindings(); + // one key with two values + assertEquals(bindings.size(), 1); + 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); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java index 8a40de28b..8db0273df 100644 --- a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java @@ -3,16 +3,16 @@ import junit.framework.TestCase; public class RepositoryTest extends TestCase { - public void testRepository() throws Exception { + public void testRepository() throws Exception { - Repository repo = new Repository("10.0.0.1/jim"); - Repository repo1 = new Repository("10.0.0.1:1234/jim"); - Repository repo2 = new Repository("busybox"); + Repository repo = new Repository("10.0.0.1/jim"); + Repository repo1 = new Repository("10.0.0.1:1234/jim"); + Repository repo2 = new Repository("busybox"); - assertEquals("jim", repo.getPath()); - assertEquals("jim", repo1.getPath()); - assertEquals("busybox", repo2.getPath()); + assertEquals("jim", repo.getPath()); + assertEquals("jim", repo1.getPath()); + assertEquals("busybox", repo2.getPath()); - assertEquals(1234, repo1.getURL().getPort()); - } + assertEquals(1234, repo1.getURL().getPort()); + } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java index 04823db24..3bc22c00e 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java @@ -6,35 +6,33 @@ public class RestartPolicy_ParsingTest { - @Test - public void noRestart() throws Exception { - assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); - } - - @Test - public void alwaysRestart() throws Exception { - assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); - } - - @Test - public void onFailureRestart() throws Exception { - assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); - } - - @Test - public void onFailureRestartWithCount() throws Exception { - assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") - public void illegalSyntax() throws Exception { - RestartPolicy.parse("nonsense"); - } - - @Test(expectedExceptions = IllegalArgumentException.class, - expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") - public void illegalRetryCount() throws Exception { - RestartPolicy.parse("on-failure:X"); - } + @Test + public void noRestart() throws Exception { + assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); + } + + @Test + public void alwaysRestart() throws Exception { + assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); + } + + @Test + public void onFailureRestart() throws Exception { + assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); + } + + @Test + public void onFailureRestartWithCount() throws Exception { + assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") + public void illegalSyntax() throws Exception { + RestartPolicy.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") + public void illegalRetryCount() throws Exception { + RestartPolicy.parse("on-failure:X"); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java index 7b13a3958..b4a9a746a 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java @@ -7,35 +7,38 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** - * Compares serialization results of various {@link RestartPolicy}s with - * what Docker (as of 1.3.3) actually sends when executing - * docker run --restart xxx. + * Compares serialization results of various {@link RestartPolicy}s with what Docker (as of 1.3.3) actually sends when + * executing docker run --restart xxx. */ public class RestartPolicy_SerializingTest { - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Test // --restart no - public void noRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); - } - - @Test // --restart always - public void alwaysRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); - } - - @Test // --restart on-failure - public void onFailureRestart() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); - } - - @Test // --restart on-failure:2 - public void onFailureRestartWithCount() throws Exception { - String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); - assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); - } - + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + // --restart no + public void noRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); + } + + @Test + // --restart always + public void alwaysRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); + } + + @Test + // --restart on-failure + public void onFailureRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); + } + + @Test + // --restart on-failure:2 + public void onFailureRestartWithCount() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); + assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); + } + } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java index a52441d63..a2d99ce9c 100644 --- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java @@ -7,19 +7,14 @@ public class RestartPolicy_toStringTest { - @DataProvider(name = "input") - public Object[][] restartPolicies() { - return new Object[][] { - { "no" }, - { "always" }, - { "on-failure" }, - { "on-failure:2" } - }; - } + @DataProvider(name = "input") + public Object[][] restartPolicies() { + return new Object[][] { { "no" }, { "always" }, { "on-failure" }, { "on-failure:2" } }; + } - @Test(dataProvider = "input") - public void serializationWithoutCount(String policy) throws Exception { - assertEquals(RestartPolicy.parse(policy).toString(), policy); - } + @Test(dataProvider = "input") + public void serializationWithoutCount(String policy) throws Exception { + assertEquals(RestartPolicy.parse(policy).toString(), policy); + } } diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java index e8bafc460..41abaf99d 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -16,8 +16,8 @@ public void t() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); VolumeBinds volumeBinds = objectMapper.readValue(s, VolumeBinds.class); VolumeBind[] binds = volumeBinds.getBinds(); - assertEquals(binds.length,1); - assertEquals(binds[0].getHostPath(),"/some/path"); + assertEquals(binds.length, 1); + assertEquals(binds[0].getHostPath(), "/some/path"); assertEquals(binds[0].getContainerPath(), "/data"); } @@ -28,5 +28,4 @@ public void t1() throws IOException { objectMapper.readValue(s, VolumeBinds.class); } - } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java index b7c3bbff5..55c7088c4 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeFrom_SerializingTest.java @@ -7,19 +7,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class VolumeFrom_SerializingTest { - private final ObjectMapper objectMapper = new ObjectMapper(); - private final String json = "\"container1:ro\""; - - @Test - public void deserializing() throws Exception { - VolumesFrom volumeFrom = objectMapper.readValue(json, VolumesFrom.class); - assertEquals(volumeFrom, new VolumesFrom("container1", AccessMode.ro)); - } - - @Test - public void serializing() throws Exception { - VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); - assertEquals(objectMapper.writeValueAsString(volumeFrom), json); - } + private final ObjectMapper objectMapper = new ObjectMapper(); + + private final String json = "\"container1:ro\""; + + @Test + public void deserializing() throws Exception { + VolumesFrom volumeFrom = objectMapper.readValue(json, VolumesFrom.class); + assertEquals(volumeFrom, new VolumesFrom("container1", AccessMode.ro)); + } + + @Test + public void serializing() throws Exception { + VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); + assertEquals(objectMapper.writeValueAsString(volumeFrom), json); + } } 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 7419e5dc9..5b8311425 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeTest.java @@ -5,8 +5,8 @@ import org.testng.annotations.Test; public class VolumeTest { - @Test - public void getPath() { - assertEquals(new Volume("/path").getPath(), "/path"); - } + @Test + public void getPath() { + assertEquals(new Volume("/path").getPath(), "/path"); + } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index ec70de4c7..bae718acb 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -33,28 +33,26 @@ public abstract class AbstractDockerClientTest extends Assert { - public static final Logger LOG = LoggerFactory - .getLogger(AbstractDockerClientTest.class); + public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); protected DockerClient dockerClient; - protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory(DockerClientBuilder.getDefaultDockerCmdExecFactory()); + protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory( + DockerClientBuilder.getDefaultDockerCmdExecFactory()); - public void beforeTest() { + public void beforeTest() { - LOG.info("======================= BEFORETEST ======================="); - LOG.info("Connecting to Docker server"); - dockerClient = DockerClientBuilder.getInstance(config()) - .withDockerCmdExecFactory(dockerCmdExecFactory) - .build(); + LOG.info("======================= BEFORETEST ======================="); + LOG.info("Connecting to Docker server"); + dockerClient = DockerClientBuilder.getInstance(config()).withDockerCmdExecFactory(dockerCmdExecFactory).build(); - LOG.info("Pulling image 'busybox'"); - // need to block until image is pulled completely - asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); + LOG.info("Pulling image 'busybox'"); + // need to block until image is pulled completely + asString(dockerClient.pullImageCmd("busybox").withTag("latest").exec()); - assertNotNull(dockerClient); - LOG.info("======================= END OF BEFORETEST =======================\n\n"); - } + assertNotNull(dockerClient); + LOG.info("======================= END OF BEFORETEST =======================\n\n"); + } private DockerClientConfig config() { return config(null); @@ -63,134 +61,129 @@ private DockerClientConfig config() { protected DockerClientConfig config(String password) { DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() .withServerAddress("https://index.docker.io/v1/"); - if (password!=null) { + if (password != null) { builder = builder.withPassword(password); } - return builder - .build(); + return builder.build(); } public void afterTest() { - LOG.info("======================= END OF AFTERTEST ======================="); - } - - - public void beforeMethod(Method method) { - LOG.info(String - .format("################################## STARTING %s ##################################", - method.getName())); - } - - public void afterMethod(ITestResult result) { - - for (String container : dockerCmdExecFactory.getContainerNames()) { - LOG.info("Cleaning up temporary container {}", container); - - try { - dockerClient.removeContainerCmd(container).withForce().exec(); - } catch (DockerException ignore) { - //ignore.printStackTrace(); - } - } - - for (String image : dockerCmdExecFactory.getImageNames()) { - LOG.info("Cleaning up temporary image with {}", image); - try { - dockerClient.removeImageCmd(image).withForce().exec(); - } catch (DockerException ignore) { - //ignore.printStackTrace(); - } - } - - LOG.info( - "################################## END OF {} ##################################\n", - result.getName()); - } - - protected String asString(InputStream response) { - return consumeAsString(response); - } - - public static String consumeAsString(InputStream response) { - - StringWriter logwriter = new StringWriter(); - - try { - LineIterator itr = IOUtils.lineIterator( - response, "UTF-8"); - - while (itr.hasNext()) { - String line = itr.next(); - logwriter.write(line + (itr.hasNext() ? "\n" : "")); - LOG.info("line: "+line); - } - response.close(); - - return logwriter.toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - IOUtils.closeQuietly(response); - } - } - - // UTIL - - /** - * Checks to see if a specific port is available. - * - * @param port - * the port to check for availability - */ - public static boolean available(int port) { - if (port < 1100 || port > 60000) { - throw new IllegalArgumentException("Invalid start port: " + port); - } - - ServerSocket ss = null; - DatagramSocket ds = null; - try { - ss = new ServerSocket(port); - ss.setReuseAddress(true); - ds = new DatagramSocket(port); - ds.setReuseAddress(true); - return true; - } catch (IOException ignored) { - } finally { - if (ds != null) { - ds.close(); - } - - if (ss != null) { - try { - ss.close(); - } catch (IOException e) { - /* should not be thrown */ - } - } - } - - return false; - } - - /** - * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) - * has {@link VolumeBind}s for the given {@link Volume}s - */ - 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())); - } - assertThat(volumes, contains(expectedVolumes)); - } - - public static class CollectFramesCallback extends ResultCallbackTemplate { + LOG.info("======================= END OF AFTERTEST ======================="); + } + + public void beforeMethod(Method method) { + LOG.info(String.format("################################## STARTING %s ##################################", + method.getName())); + } + + public void afterMethod(ITestResult result) { + + for (String container : dockerCmdExecFactory.getContainerNames()) { + LOG.info("Cleaning up temporary container {}", container); + + try { + dockerClient.removeContainerCmd(container).withForce().exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + for (String image : dockerCmdExecFactory.getImageNames()) { + LOG.info("Cleaning up temporary image with {}", image); + try { + dockerClient.removeImageCmd(image).withForce().exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + LOG.info("################################## END OF {} ##################################\n", result.getName()); + } + + protected String asString(InputStream response) { + return consumeAsString(response); + } + + public static String consumeAsString(InputStream response) { + + StringWriter logwriter = new StringWriter(); + + try { + LineIterator itr = IOUtils.lineIterator(response, "UTF-8"); + + while (itr.hasNext()) { + String line = itr.next(); + logwriter.write(line + (itr.hasNext() ? "\n" : "")); + LOG.info("line: " + line); + } + response.close(); + + return logwriter.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + IOUtils.closeQuietly(response); + } + } + + // UTIL + + /** + * Checks to see if a specific port is available. + * + * @param port + * the port to check for availability + */ + public static boolean available(int port) { + if (port < 1100 || port > 60000) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException ignored) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + /** + * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) has {@link VolumeBind}s for + * the given {@link Volume}s + */ + 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())); + } + assertThat(volumes, contains(expectedVolumes)); + } + + public static class CollectFramesCallback extends ResultCallbackTemplate { public final List frames = new ArrayList(); + private final StringBuffer log = new StringBuffer(); @Override @@ -211,7 +204,7 @@ public String toString() { } } - protected String containerLog(String containerId) throws Exception { + protected String containerLog(String containerId) throws Exception { CollectFramesCallback collectFramesCallback = new CollectFramesCallback(); diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index e5bef57d3..85ee0d7ac 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -24,50 +24,46 @@ */ @Test(groups = "integration") public class DockerClientTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(DockerClientTest.class); + public static final Logger LOG = LoggerFactory.getLogger(DockerClientTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - @Test - public void testRunShlex() throws DockerException { + @Test + public void testRunShlex() throws DockerException { - String[] commands = new String[] { - "true", - "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"", - "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'", - "/bin/sh -c echo Hello World", "/bin/sh -c echo 'Hello World'", - "echo 'Night of Nights'", "true && echo 'Night of Nights'" }; + String[] commands = new String[] { "true", + "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"", + "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'", + "/bin/sh -c echo Hello World", "/bin/sh -c echo 'Hello World'", "echo 'Night of Nights'", + "true && echo 'Night of Nights'" }; - for (String command : commands) { - LOG.info("Running command: [{}]", command); + for (String command : commands) { + LOG.info("Running command: [{}]", command); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd(commands).exec(); - dockerClient.startContainerCmd(container.getId()); - - int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(); - assertThat(exitcode, equalTo(0)); - } - } + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(commands).exec(); + dockerClient.startContainerCmd(container.getId()); + int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(); + assertThat(exitcode, equalTo(0)); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java index 5212fe50d..8c93df20a 100644 --- a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java +++ b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java @@ -18,42 +18,43 @@ public class CompressArchiveUtilTest { - @Test - public void testExecutableFlagIsPreserved() throws Exception { - File executableFile = createExecutableFile(); - File archive = CompressArchiveUtil.archiveTARFiles(executableFile.getParentFile(), asList(executableFile), "archive"); - File expectedFile = extractFileByName(archive, "executableFile.sh.result"); - - assertThat("should be executable", expectedFile.canExecute()); - } - - private File createExecutableFile() throws IOException { - File baseDir = new File(FileUtils.getTempDirectoryPath()); - File executableFile = new File(baseDir, "executableFile.sh"); - executableFile.createNewFile(); - executableFile.setExecutable(true); - assertThat(executableFile.canExecute(), is(true)); - return executableFile; - } - - private File extractFileByName(File archive, String filenameToExtract) throws IOException { - File baseDir = new File(FileUtils.getTempDirectoryPath()); - File expectedFile = new File(baseDir, filenameToExtract); - expectedFile.delete(); - assertThat(expectedFile.exists(), is(false)); - - TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new FileInputStream(archive)); - TarArchiveEntry entry; - while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { - String individualFiles = entry.getName(); - // there should be only one file in this archive - assertThat(individualFiles, equalTo("executableFile.sh")); - IOUtils.copy(tarArchiveInputStream, new FileOutputStream(expectedFile)); - if ((entry.getMode() & 0755) == 0755) { - expectedFile.setExecutable(true); - } + @Test + public void testExecutableFlagIsPreserved() throws Exception { + File executableFile = createExecutableFile(); + File archive = CompressArchiveUtil.archiveTARFiles(executableFile.getParentFile(), asList(executableFile), + "archive"); + File expectedFile = extractFileByName(archive, "executableFile.sh.result"); + + assertThat("should be executable", expectedFile.canExecute()); + } + + private File createExecutableFile() throws IOException { + File baseDir = new File(FileUtils.getTempDirectoryPath()); + File executableFile = new File(baseDir, "executableFile.sh"); + executableFile.createNewFile(); + executableFile.setExecutable(true); + assertThat(executableFile.canExecute(), is(true)); + return executableFile; + } + + private File extractFileByName(File archive, String filenameToExtract) throws IOException { + File baseDir = new File(FileUtils.getTempDirectoryPath()); + File expectedFile = new File(baseDir, filenameToExtract); + expectedFile.delete(); + assertThat(expectedFile.exists(), is(false)); + + TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new FileInputStream(archive)); + TarArchiveEntry entry; + while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { + String individualFiles = entry.getName(); + // there should be only one file in this archive + assertThat(individualFiles, equalTo("executableFile.sh")); + IOUtils.copy(tarArchiveInputStream, new FileOutputStream(expectedFile)); + if ((entry.getMode() & 0755) == 0755) { + expectedFile.setExecutable(true); + } + } + tarArchiveInputStream.close(); + return expectedFile; } - tarArchiveInputStream.close(); - return expectedFile; - } } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 64ab912d0..634d0e9a5 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,12 +16,14 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, + false, false, new LocalDirectorySSLConfig("flim"), 20, 2); } @Test public void string() throws Exception { - assertEquals("DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", + assertEquals( + "DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", EXAMPLE_CONFIG.toString()); } @@ -150,7 +152,7 @@ public void defaults() throws Exception { systemProperties.setProperty("user.home", "someHomeDir"); // when you build config - DockerClientConfig config = buildConfig(Collections.emptyMap(), systemProperties); + DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then the cert path is as expected assertEquals(config.getUri(), URI.create("https://localhost:2376")); @@ -159,7 +161,7 @@ public void defaults() throws Exception { assertEquals(config.getVersion(), null); assertEquals(config.isLoggingFilterEnabled(), true); assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); - assertEquals( ((LocalDirectorySSLConfig)config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); + assertEquals(((LocalDirectorySSLConfig) config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); } @Test @@ -179,7 +181,7 @@ public void systemProperties() throws Exception { systemProperties.setProperty("docker.io.enableLoggingFilter", "false"); // when you build new config - DockerClientConfig config = buildConfig(Collections.emptyMap(), systemProperties); + DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then it is the same as the example assertEquals(config, EXAMPLE_CONFIG); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 2a961e3b8..eac3bb725 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,8 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, + false, null, 20, 2); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index 215926a56..cf5b03188 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -40,8 +40,7 @@ public void testMatch(MatchTestCase testCase) throws IOException { @DataProvider public Object[][] getTestData() { - return new Object[][] { - new Object[] { new MatchTestCase("abc", "abc", true, false) }, + return new Object[][] { new Object[] { new MatchTestCase("abc", "abc", true, false) }, new Object[] { new MatchTestCase("*", "abc", true, false) }, new Object[] { new MatchTestCase("*c", "abc", true, false) }, new Object[] { new MatchTestCase("a*", "a", true, false) }, @@ -99,8 +98,11 @@ public Object[][] getTestData() { private final class MatchTestCase { private final String pattern; + private final String s; + private final boolean matches; + private final boolean expectException; public MatchTestCase(String pattern, String s, boolean matches, boolean expectException) { @@ -113,8 +115,8 @@ public MatchTestCase(String pattern, String s, boolean matches, boolean expectEx @Override public String toString() { - return "MatchTestCase [pattern=" + pattern + ", s=" + s + ", matches=" + matches - + ", expectException=" + expectException + "]"; + return "MatchTestCase [pattern=" + pattern + ", s=" + s + ", matches=" + matches + ", expectException=" + + expectException + "]"; } } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index fb764474f..380f5dd9f 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -11,188 +11,184 @@ import com.github.dockerjava.jaxrs.BuildImageCmdExec; /** - * Special {@link DockerCmdExecFactory} implementation that collects container - * and image creations while test execution for the purpose of automatically - * cleanup. + * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution + * for the purpose of automatically cleanup. * * @author marcus * */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { - private List containerNames = new ArrayList(); - - private List imageNames = new ArrayList(); - - private DockerCmdExecFactory delegate; - - public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { - this.delegate = delegate; - } - - @Override - public void init(DockerClientConfig dockerClientConfig) { - delegate.init(dockerClientConfig); - } - - @Override - public void close() throws IOException { - delegate.close(); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmd.Exec() { - @Override - public CreateContainerResponse exec(CreateContainerCmd command) { - CreateContainerResponse createContainerResponse = delegate - .createCreateContainerCmdExec().exec(command); - containerNames.add(createContainerResponse.getId()); - return createContainerResponse; - } - }; - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmd.Exec() { - @Override - public Void exec(RemoveContainerCmd command) { - delegate.createRemoveContainerCmdExec().exec(command); - containerNames.remove(command.getContainerId()); - return null; - } - }; - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmd.Exec() { - @Override - public CreateImageResponse exec(CreateImageCmd command) { - CreateImageResponse createImageResponse = delegate - .createCreateImageCmdExec().exec(command); - imageNames.add(createImageResponse.getId()); - return createImageResponse; - } - }; - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmd.Exec() { - @Override - public Void exec(RemoveImageCmd command) { - delegate.createRemoveImageCmdExec().exec(command); - imageNames.remove(command.getImageId()); - return null; - } - }; - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmd.Exec() { - @Override - public BuildImageCmd.Response exec(BuildImageCmd command) { - // can't detect image id here so tagging it - String tag = command.getTag(); - if (tag == null || "".equals(tag.trim())) { - tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); - command.withTag(tag); - } - InputStream inputStream = delegate.createBuildImageCmdExec() - .exec(command); - imageNames.add(tag); - return new BuildImageCmdExec.ResponseImpl(inputStream); - } - }; - } - - @Override - public Exec createAuthCmdExec() { - return delegate.createAuthCmdExec(); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return delegate.createInfoCmdExec(); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return delegate.createPingCmdExec(); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return delegate.createExecCmdExec(); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return delegate.createVersionCmdExec(); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return delegate.createPullImageCmdExec(); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return delegate.createPushImageCmdExec(); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { - return delegate.createSaveImageCmdExec(); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return delegate.createSearchImagesCmdExec(); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return delegate.createListImagesCmdExec(); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return delegate.createInspectImageCmdExec(); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return delegate.createListContainersCmdExec(); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return delegate.createStartContainerCmdExec(); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return delegate.createInspectContainerCmdExec(); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return delegate.createWaitContainerCmdExec(); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return delegate.createAttachContainerCmdExec(); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - return delegate.createExecStartCmdExec(); - } + private List containerNames = new ArrayList(); + + private List imageNames = new ArrayList(); + + private DockerCmdExecFactory delegate; + + public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { + this.delegate = delegate; + } + + @Override + public void init(DockerClientConfig dockerClientConfig) { + delegate.init(dockerClientConfig); + } + + @Override + public void close() throws IOException { + delegate.close(); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmd.Exec() { + @Override + public CreateContainerResponse exec(CreateContainerCmd command) { + CreateContainerResponse createContainerResponse = delegate.createCreateContainerCmdExec().exec(command); + containerNames.add(createContainerResponse.getId()); + return createContainerResponse; + } + }; + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmd.Exec() { + @Override + public Void exec(RemoveContainerCmd command) { + delegate.createRemoveContainerCmdExec().exec(command); + containerNames.remove(command.getContainerId()); + return null; + } + }; + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmd.Exec() { + @Override + public CreateImageResponse exec(CreateImageCmd command) { + CreateImageResponse createImageResponse = delegate.createCreateImageCmdExec().exec(command); + imageNames.add(createImageResponse.getId()); + return createImageResponse; + } + }; + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmd.Exec() { + @Override + public Void exec(RemoveImageCmd command) { + delegate.createRemoveImageCmdExec().exec(command); + imageNames.remove(command.getImageId()); + return null; + } + }; + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmd.Exec() { + @Override + public BuildImageCmd.Response exec(BuildImageCmd command) { + // can't detect image id here so tagging it + String tag = command.getTag(); + if (tag == null || "".equals(tag.trim())) { + tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); + command.withTag(tag); + } + InputStream inputStream = delegate.createBuildImageCmdExec().exec(command); + imageNames.add(tag); + return new BuildImageCmdExec.ResponseImpl(inputStream); + } + }; + } + + @Override + public Exec createAuthCmdExec() { + return delegate.createAuthCmdExec(); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return delegate.createInfoCmdExec(); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return delegate.createPingCmdExec(); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return delegate.createExecCmdExec(); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return delegate.createVersionCmdExec(); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return delegate.createPullImageCmdExec(); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return delegate.createPushImageCmdExec(); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return delegate.createSaveImageCmdExec(); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return delegate.createSearchImagesCmdExec(); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return delegate.createListImagesCmdExec(); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return delegate.createInspectImageCmdExec(); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return delegate.createListContainersCmdExec(); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return delegate.createStartContainerCmdExec(); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return delegate.createInspectContainerCmdExec(); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return delegate.createWaitContainerCmdExec(); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return delegate.createAttachContainerCmdExec(); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return delegate.createExecStartCmdExec(); + } @Override public InspectExecCmd.Exec createInspectExecCmdExec() { @@ -200,76 +196,76 @@ public InspectExecCmd.Exec createInspectExecCmdExec() { } @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return delegate.createLogContainerCmdExec(); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return delegate.createCopyFileFromContainerCmdExec(); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return delegate.createStopContainerCmdExec(); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return delegate.createContainerDiffCmdExec(); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return delegate.createKillContainerCmdExec(); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return delegate.createRestartContainerCmdExec(); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return delegate.createCommitCmdExec(); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return delegate.createTopContainerCmdExec(); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return delegate.createTagImageCmdExec(); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return delegate.createPauseContainerCmdExec(); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return delegate.createUnpauseContainerCmdExec(); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return delegate.createEventsCmdExec(); - } - - @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return delegate.createLogContainerCmdExec(); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return delegate.createCopyFileFromContainerCmdExec(); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return delegate.createStopContainerCmdExec(); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return delegate.createContainerDiffCmdExec(); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return delegate.createKillContainerCmdExec(); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return delegate.createRestartContainerCmdExec(); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return delegate.createCommitCmdExec(); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return delegate.createTopContainerCmdExec(); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return delegate.createTagImageCmdExec(); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return delegate.createPauseContainerCmdExec(); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return delegate.createUnpauseContainerCmdExec(); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return delegate.createEventsCmdExec(); + } + + @Override public StatsCmd.Exec createStatsCmdExec() { - return delegate.createStatsCmdExec(); - } + return delegate.createStatsCmdExec(); + } - public List getContainerNames() { - return new ArrayList(containerNames); - } + public List getContainerNames() { + return new ArrayList(containerNames); + } - public List getImageNames() { - return new ArrayList(imageNames); - } + public List getImageNames() { + return new ArrayList(imageNames); + } } 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 c4147f1a5..3a1c70c8f 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -81,7 +81,6 @@ public void onNext(Frame frame) { assertThat(collectFramesCallback.toString(), endsWith(snippet)); } - @Test public void attachContainerWithTTY() throws Exception { @@ -93,11 +92,9 @@ public void attachContainerWithTTY() throws Exception { String fullLog = asString(response); assertThat(fullLog, containsString("Successfully built")); - String imageId = StringUtils.substringBetween(fullLog, - "Successfully built ", "\\n\"}").trim(); + String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); - CreateContainerResponse container = dockerClient.createContainerCmd(imageId) - .withTty(true).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd(imageId).withTty(true).exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -121,7 +118,6 @@ public void onNext(Frame frame) { System.out.println("log: " + collectFramesCallback.toString()); - HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); assertThat(collectFramesCallback.toString(), containsString("stdout\r\nstderr")); diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java index 950111497..3c60cada2 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -13,41 +13,41 @@ @Test(groups = "integration") public class AuthCmdImplTest 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 testAuth() throws Exception { + @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 testAuth() throws Exception { AuthResponse response = dockerClient.authCmd().exec(); assertEquals(response.getStatus(), "Login Succeeded"); } - @Test - public void testAuthInvalid() throws Exception { + @Test + public void testAuthInvalid() throws Exception { try { - DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec(); + DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec(); fail("Expected a UnauthorizedException caused by a bad password."); - } catch (UnauthorizedException e) { - assertEquals(e.getMessage(), "Wrong login/password, please try again\n"); - } - } + } catch (UnauthorizedException e) { + assertEquals(e.getMessage(), "Wrong login/password, please try again\n"); + } + } } 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 a94209fea..f90250ea3 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -39,48 +39,43 @@ @Test(groups = "integration") public class BuildImageCmdImplTest extends AbstractDockerClientTest { - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test - public void testNginxDockerfileBuilder() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("nginx").getFile()); + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + @Test + public void testNginxDockerfileBuilder() { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile()); - String fullLog = asString(response); - assertThat(fullLog, containsString("Successfully built")); + InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - String imageId = StringUtils.substringBetween(fullLog, - "Successfully built ", "\\n\"}").trim(); + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - assertThat(inspectImageResponse, not(nullValue())); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim(); - assertThat(inspectImageResponse.getAuthor(), - equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); - } + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); + } @Test(groups = "ignoreInCircleCi") public void testNonstandard1() { @@ -95,16 +90,12 @@ public void testNonstandard1() { @Test(groups = "ignoreInCircleCi") public void testNonstandard2() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("nonstandard").getFile()); + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nonstandard").getFile()); File dockerFile = new File(Thread.currentThread().getContextClassLoader() .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); - - InputStream response = dockerClient.buildImageCmd() - .withBaseDirectory(baseDir) - .withDockerfile(dockerFile) - .withNoCache().exec(); + InputStream response = dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile) + .withNoCache().exec(); String fullLog = asString(response); assertThat(fullLog, containsString("Successfully built")); @@ -120,45 +111,42 @@ public void testDockerBuilderFromTar() throws Exception { } @Test - public void testDockerBuilderAddUrl() throws Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testAddUrl").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Docker")); - } - - @Test - 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 Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testAddFilesViaWildcard").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Successfully executed testinclude1.sh")); - assertThat(response, not(containsString("Successfully executed testinclude2.sh"))); - } - - @Test - 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 Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testEnv").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("Successfully executed testrun.sh")); - } + public void testDockerBuilderAddUrl() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddUrl").getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Docker")); + } + + @Test + 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 Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFilesViaWildcard") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Successfully executed testinclude1.sh")); + assertThat(response, not(containsString("Successfully executed testinclude2.sh"))); + } + + @Test + 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 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) throws Exception { return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream)); @@ -166,7 +154,7 @@ private String dockerfileBuild(InputStream tarInputStream) throws Exception { private String dockerfileBuild(File baseDir) throws Exception { return execBuild(dockerClient.buildImageCmd(baseDir)); - } + } private String execBuild(BuildImageCmd buildImageCmd) throws Exception { // Build image @@ -190,83 +178,74 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { } + @Test(expectedExceptions = { DockerClientException.class }) + public void testDockerfileIgnored() { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") + .getFile()); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + } + + @Test(expectedExceptions = { DockerClientException.class }) + public void testInvalidDockerIgnorePattern() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("testInvalidDockerignorePattern").getFile()); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + } + + @Test(groups = "ignoreInCircleCi") + public void testDockerIgnore() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerignore") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d")); + } + + @Test + public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); + + Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); + String imageId = null; - @Test(expectedExceptions={DockerClientException.class}) - public void testDockerfileIgnored() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testDockerfileIgnored").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - } - - @Test(expectedExceptions={DockerClientException.class}) - public void testInvalidDockerIgnorePattern() { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testInvalidDockerignorePattern").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(); - } - - @Test(groups = "ignoreInCircleCi") - public void testDockerIgnore() throws Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testDockerignore").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d")); - } - - @Test - public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("netcat").getFile()); - - Iterable response = dockerClient.buildImageCmd(baseDir).withNoCache().exec().getItems(); - - String imageId = null; - - for(EventStreamItem item : response) { - String text = item.getStream(); - if( text.startsWith("Successfully built ")) { - imageId = StringUtils.substringBetween(text, - "Successfully built ", "\n").trim(); - } - } - - assertNotNull(imageId, "Not successful in build"); - - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - 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(); - - assertThat(inspectContainerResponse.getId(), notNullValue()); - assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), - notNullValue()); - - // No use as such if not running on the server -// for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) { -// int port = Integer.valueOf(p.getHostPort()); -// LOG.info("Checking port {} is open", port); -// assertThat(available(port), is(false)); -// } - dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec(); - - } - - @Test - public void testAddAndCopySubstitution () throws Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("testENVSubstitution").getFile()); - String response = dockerfileBuild(baseDir); - assertThat(response, containsString("testENVSubstitution successfully completed")); - } + for (EventStreamItem item : response) { + String text = item.getStream(); + if (text.startsWith("Successfully built ")) { + imageId = StringUtils.substringBetween(text, "Successfully built ", "\n").trim(); + } + } + + assertNotNull(imageId, "Not successful in build"); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + 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(); + + assertThat(inspectContainerResponse.getId(), notNullValue()); + assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), notNullValue()); + + // No use as such if not running on the server + // for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) { + // int port = Integer.valueOf(p.getHostPort()); + // LOG.info("Checking port {} is open", port); + // assertThat(available(port), is(false)); + // } + dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec(); + + } + + @Test + public void testAddAndCopySubstitution() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testENVSubstitution") + .getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("testENVSubstitution successfully completed")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java index ea5f6128d..415ca8f0b 100644 --- a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java @@ -25,63 +25,56 @@ @Test(groups = "integration") public class CommitCmdImplTest 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 commit() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("touch", "/test").exec(); - - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Commiting container: {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(imageId).exec(); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - - assertThat(inspectImageResponse, - hasField("container", startsWith(container.getId()))); - assertThat(inspectImageResponse.getContainerConfig().getImage(), - equalTo("busybox")); - - InspectImageResponse busyboxImg = dockerClient.inspectImageCmd("busybox").exec(); - - assertThat(inspectImageResponse.getParent(), - equalTo(busyboxImg.getId())); - } - - - @Test - public void commitNonExistingContainer() throws DockerException { - try { - dockerClient.commitCmd("non-existent").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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 commit() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Commiting container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse, hasField("container", startsWith(container.getId()))); + assertThat(inspectImageResponse.getContainerConfig().getImage(), equalTo("busybox")); + + InspectImageResponse busyboxImg = dockerClient.inspectImageCmd("busybox").exec(); + + assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId())); + } + + @Test + public void commitNonExistingContainer() throws DockerException { + try { + dockerClient.commitCmd("non-existent").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java index 58c95486c..e94c8c6c2 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -26,56 +26,53 @@ @Test(groups = "integration") public class ContainerDiffCmdImplTest 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(groups = "ignoreInCircleCi") - public void testContainerDiff() throws DockerException { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("touch", "/test" ).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)); - - List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); - LOG.info("Container DIFF: {}", filesystemDiff.toString()); - - assertThat(filesystemDiff.size(), equalTo(1)); - ChangeLog testChangeLog = selectUnique(filesystemDiff, - hasField("path", equalTo("/test"))); - - assertThat(testChangeLog, hasField("path", equalTo("/test"))); - assertThat(testChangeLog, hasField("kind", equalTo(1))); - } - - @Test - public void testContainerDiffWithNonExistingContainer() throws DockerException { - try { - dockerClient.containerDiffCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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(groups = "ignoreInCircleCi") + public void testContainerDiff() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").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)); + + List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); + LOG.info("Container DIFF: {}", filesystemDiff.toString()); + + assertThat(filesystemDiff.size(), equalTo(1)); + ChangeLog testChangeLog = selectUnique(filesystemDiff, hasField("path", equalTo("/test"))); + + assertThat(testChangeLog, hasField("path", equalTo("/test"))); + assertThat(testChangeLog, hasField("kind", equalTo(1))); + } + + @Test + public void testContainerDiffWithNonExistingContainer() throws DockerException { + try { + dockerClient.containerDiffCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java index 193b787ce..72a97d04c 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -40,9 +40,7 @@ public void afterMethod(ITestResult result) { public void copyFromContainer() throws Exception { // TODO extract this into a shared method CreateContainerResponse container = dockerClient.createContainerCmd("busybox") - .withName("docker-java-itest-copyFromContainer") - .withCmd("touch", "/copyFromContainer") - .exec(); + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); LOG.info("Created container: {}", container); assertThat(container.getId(), not(isEmptyOrNullString())); @@ -58,7 +56,7 @@ public void copyFromContainer() throws Exception { assertNotNull(responseAsString); assertTrue(responseAsString.length() > 0); } - + @Test public void copyFromNonExistingContainer() throws Exception { try { 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 94d4cff62..1b372d245 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -154,27 +154,23 @@ public void createContainerWithVolumesFrom() throws DockerException { } @Test - public void createContainerWithEnv() throws Exception { + public void createContainerWithEnv() throws Exception { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withEnv("VARIABLE=success") - .withCmd("env").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withEnv("VARIABLE=success") + .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( - Arrays.asList(inspectContainerResponse.getConfig().getEnv()), - containsInAnyOrder("VARIABLE=success")); + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEnv()), containsInAnyOrder("VARIABLE=success")); - dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(containerLog(container.getId()), containsString("VARIABLE=success")); - } + assertThat(containerLog(container.getId()), containsString("VARIABLE=success")); + } @Test public void createContainerWithHostname() throws Exception { @@ -192,8 +188,7 @@ public void createContainerWithHostname() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - assertThat(containerLog(container.getId()), - containsString("HOSTNAME=docker-java")); + assertThat(containerLog(container.getId()), containsString("HOSTNAME=docker-java")); } @Test 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 53131c611..2d6ec9522 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -22,9 +22,13 @@ public class DockerfileFixture implements AutoCloseable { private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileFixture.class); + private final DockerClient dockerClient; + private String directory; + private String repository; + private String containerId; public DockerfileFixture(DockerClient dockerClient, String directory) { @@ -35,35 +39,27 @@ public DockerfileFixture(DockerClient dockerClient, String directory) { public void open() throws IOException { LOGGER.info("building {}", directory); - InputStream response = dockerClient - .buildImageCmd(new File("src/test/resources", directory)) - .withNoCache() // remove alternatives, cause problems + InputStream response = dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() // remove + // alternatives, + // cause + // problems .exec(); - + String log = AbstractDockerClientTest.consumeAsString(response); - + assertThat(log, containsString("Successfully built")); - Image lastCreatedImage = dockerClient - .listImagesCmd() - .exec() - .get(0); + Image lastCreatedImage = dockerClient.listImagesCmd().exec().get(0); - repository = lastCreatedImage - .getRepoTags()[0]; + repository = lastCreatedImage.getRepoTags()[0]; LOGGER.info("created {} {}", lastCreatedImage.getId(), repository); - containerId = dockerClient - .createContainerCmd(lastCreatedImage.getId()) - .exec() - .getId(); + containerId = dockerClient.createContainerCmd(lastCreatedImage.getId()).exec().getId(); LOGGER.info("starting {}", containerId); - dockerClient - .startContainerCmd(containerId) - .exec(); + dockerClient.startContainerCmd(containerId).exec(); } @Override @@ -72,9 +68,7 @@ public void close() throws Exception { if (containerId != null) { LOGGER.info("removing container {}", containerId); try { - dockerClient - .removeContainerCmd(containerId) - .withForce() // stop too + dockerClient.removeContainerCmd(containerId).withForce() // stop too .exec(); } catch (NotFoundException | InternalServerErrorException ignored) { LOGGER.info("ignoring {}", ignored.getMessage()); @@ -85,10 +79,7 @@ public void close() throws Exception { if (repository != null) { LOGGER.info("removing repository {}", repository); try { - dockerClient - .removeImageCmd(repository) - .withForce() - .exec(); + dockerClient.removeImageCmd(repository).withForce().exec(); } catch (NotFoundException | InternalServerErrorException e) { LOGGER.info("ignoring {}", e.getMessage()); } 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 07bca25b5..c311540b1 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventStreamReaderITest.java @@ -17,9 +17,8 @@ import static org.hamcrest.core.IsNull.nullValue; import static org.testng.AssertJUnit.assertNull; - @Test(groups = "integration") -public class EventStreamReaderITest { +public class EventStreamReaderITest { private DockerClient dockerClient; @@ -36,17 +35,13 @@ public void tearDown() throws Exception { @Test(groups = "ignoreInCircleCi") public void pullCanBeStreamed() throws Exception { - try (EventStreamReader reader = new EventStreamReader<>( - dockerClient.pullImageCmd("busybox:latest").exec(), - PullEventStreamItem.class) - ) {; - assertThat(reader.readItem(), - allOf( - hasProperty("status", equalTo("Pulling from busybox")), - hasProperty("progress", nullValue()), - hasProperty("progressDetail", nullValue()) - ) - ); + try (EventStreamReader reader = new EventStreamReader<>(dockerClient.pullImageCmd( + "busybox:latest").exec(), PullEventStreamItem.class)) { + ; + assertThat( + reader.readItem(), + allOf(hasProperty("status", equalTo("Pulling from busybox")), hasProperty("progress", nullValue()), + hasProperty("progressDetail", nullValue()))); assertNull(reader.readItem()); } } @@ -54,17 +49,12 @@ public void pullCanBeStreamed() throws Exception { @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()) - ) - ); + 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()); } 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 baaeb8ca3..eb490d7e9 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -24,131 +24,125 @@ @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { - private static int KNOWN_NUM_EVENTS = 4; + private static int KNOWN_NUM_EVENTS = 4; - private static String getEpochTime() { - return String.valueOf(System.currentTimeMillis() / 1000); - } + private static String getEpochTime() { + return String.valueOf(System.currentTimeMillis() / 1000); + } - @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); + } - /* - * This specific test may fail with boot2docker as time may not in sync with host system - */ - @Test - public void testEventStreamTimeBound() throws InterruptedException, - IOException { - // Don't include other tests events - TimeUnit.SECONDS.sleep(1); + /* + * This specific test may fail with boot2docker as time may not in sync with host system + */ + @Test + public void testEventStreamTimeBound() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); - String startTime = getEpochTime(); - int expectedEvents = generateEvents(); - String endTime = getEpochTime(); + String startTime = getEpochTime(); + int expectedEvents = generateEvents(); + String endTime = getEpochTime(); - CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); + EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback) - .withSince(startTime).withUntil(endTime); - eventsCmd.exec(); + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(startTime).withUntil(endTime); + eventsCmd.exec(); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + eventCallback.close(); - eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } - assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); - } + @Test + public void testEventStreaming1() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); - @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); - CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(getEpochTime()); + eventsCmd.exec(); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince( - getEpochTime()); - eventsCmd.exec(); + generateEvents(); - generateEvents(); + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } - eventCallback.close(); - assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); - } + @Test + public void testEventStreaming2() throws InterruptedException, IOException { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); - @Test - public void testEventStreaming2() 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); - CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince(getEpochTime()); + eventsCmd.exec(); - EventsCmd eventsCmd = dockerClient.eventsCmd(eventCallback).withSince( - getEpochTime()); - eventsCmd.exec(); + generateEvents(); - generateEvents(); + boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } - eventCallback.close(); - assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); - } + /** + * This method generates {#link KNOWN_NUM_EVENTS} events + */ + private int generateEvents() { + String testImage = "busybox"; + asString(dockerClient.pullImageCmd(testImage).exec()); + CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec(); + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.stopContainerCmd(container.getId()).exec(); + return KNOWN_NUM_EVENTS; + } - /** - * This method generates {#link KNOWN_NUM_EVENTS} events - */ - private int generateEvents() { - String testImage = "busybox"; - asString(dockerClient.pullImageCmd(testImage).exec()); - CreateContainerResponse container = dockerClient - .createContainerCmd(testImage).withCmd("sleep", "9999").exec(); - dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.stopContainerCmd(container.getId()).exec(); - return KNOWN_NUM_EVENTS; - } + private class EventCallbackTest extends ResultCallbackTemplate { - private class EventCallbackTest extends ResultCallbackTemplate { + private final CountDownLatch countDownLatch; - private final CountDownLatch countDownLatch; + private final List events = new ArrayList(); - private final List events = new ArrayList(); + public EventCallbackTest(CountDownLatch countDownLatch) { + this.countDownLatch = countDownLatch; + } - public EventCallbackTest(CountDownLatch countDownLatch) { - this.countDownLatch = countDownLatch; - } - - public void onNext(Event event) { - LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); + public void onNext(Event event) { + LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); countDownLatch.countDown(); events.add(event); - } + } - public List getEvents() { - return new ArrayList(events); - } - } + public List getEvents() { + return new ArrayList(events); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java index 028f4cac1..d5ec79307 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -40,8 +40,7 @@ public void afterMethod(ITestResult result) { public void execCreateTest() { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); @@ -50,7 +49,8 @@ public void execCreateTest() { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withCmd("touch", "file.log").exec(); assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); } 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 a62a5bd9a..c3586a965 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -41,9 +41,7 @@ public void afterMethod(ITestResult result) { public void execStart() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -51,8 +49,7 @@ public void execStart() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true) - .withCmd("touch", "/execStartTest.log").exec(); + .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); @@ -69,9 +66,7 @@ public void execStart() throws Exception { public void execStartAttached() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("sleep", "9999") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -79,8 +74,7 @@ public void execStartAttached() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true) - .withCmd("touch", "/execStartTest.log").exec(); + .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(); 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 2b5e2b644..10210c281 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -14,13 +14,16 @@ 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 diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index 7170c12f3..19e275078 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -21,53 +21,51 @@ @Test(groups = "integration") public class InfoCmdImplTest 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 info() throws DockerException { + @Test + public void info() throws DockerException { // Make sure that there is at least one container for the assertion // TODO extract this into a shared method - if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox") - .withName("docker-java-itest-info") - .withCmd("touch", "/test") - .exec(); + if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-info").withCmd("touch", "/test").exec(); - LOG.info("Created container: {}", container); - assertThat(container.getId(), not(isEmptyOrNullString())); + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); - dockerClient.startContainerCmd(container.getId()).exec(); - } + dockerClient.startContainerCmd(container.getId()).exec(); + } - Info dockerInfo = dockerClient.infoCmd().exec(); - LOG.info(dockerInfo.toString()); + Info dockerInfo = dockerClient.infoCmd().exec(); + LOG.info(dockerInfo.toString()); - assertTrue(dockerInfo.toString().contains("containers")); - assertTrue(dockerInfo.toString().contains("images")); - assertTrue(dockerInfo.toString().contains("debug")); + assertTrue(dockerInfo.toString().contains("containers")); + assertTrue(dockerInfo.toString().contains("images")); + assertTrue(dockerInfo.toString().contains("debug")); - assertTrue(dockerInfo.getContainers() > 0); - assertTrue(dockerInfo.getImages() > 0); - assertTrue(dockerInfo.getNFd() > 0); - assertTrue(dockerInfo.getNGoroutines() > 0); - assertTrue(dockerInfo.getNCPU() > 0); - } + assertTrue(dockerInfo.getContainers() > 0); + assertTrue(dockerInfo.getImages() > 0); + assertTrue(dockerInfo.getNFd() > 0); + assertTrue(dockerInfo.getNGoroutines() > 0); + assertTrue(dockerInfo.getNCPU() > 0); + } } 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 f1270f4e6..69f4d78e1 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -47,9 +47,7 @@ public void afterMethod(ITestResult result) { public void inspectExecTest() throws IOException { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox") - .withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -57,31 +55,25 @@ public void inspectExecTest() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout() - .withAttachStderr() - .withCmd("touch", "/marker").exec(); + .withAttachStdout().withAttachStderr().withCmd("touch", "/marker").exec(); LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout() - .withAttachStderr() - .withCmd("test", "-e", "/marker").exec(); + .withAttachStdout().withAttachStderr().withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); // Check that file does not exist InputStream response1 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()) - .exec(); - asString(response1); // consume + .withExecId(checkFileCmdCreateResponse.getId()).exec(); + asString(response1); // consume InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(first.getExitCode(), is(1)); // Create the file InputStream response2 = dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileCmdCreateResponse.getId()) - .exec(); + .withExecId(touchFileCmdCreateResponse.getId()).exec(); asString(response2); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); @@ -89,8 +81,7 @@ public void inspectExecTest() throws IOException { // Check that file does exist now InputStream response3 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()) - .exec(); + .withExecId(checkFileCmdCreateResponse.getId()).exec(); asString(response3); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java index 33d80ef2d..e60930d88 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -26,60 +26,55 @@ @Test(groups = "integration") public class KillContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(KillContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void killContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Killing container: {}", container.getId()); - dockerClient.killContainerCmd(container.getId()).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), - is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), - not(equalTo(0))); - - } - - @Test - public void killNonExistingContainer() throws DockerException { - - try { - dockerClient.killContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + public static final Logger LOG = LoggerFactory.getLogger(KillContainerCmdImplTest.class); + + @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(groups = "ignoreInCircleCi") + public void killContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Killing container: {}", container.getId()); + dockerClient.killContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + + } + + @Test + public void killNonExistingContainer() throws DockerException { + + try { + dockerClient.killContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java index f73ac5e4b..b074409bd 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -31,76 +31,72 @@ @Test(groups = "integration") public class ListContainersCmdImplTest 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 testListContainers() throws DockerException { + @Test + public void testListContainers() throws DockerException { - String testImage = "busybox"; + String testImage = "busybox"; - // need to block until image is pulled completely - asString(dockerClient.pullImageCmd(testImage).exec()); + // need to block until image is pulled completely + asString(dockerClient.pullImageCmd(testImage).exec()); - List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - assertThat(containers, notNullValue()); - LOG.info("Container List: {}", containers); + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + assertThat(containers, notNullValue()); + LOG.info("Container List: {}", containers); - int size = containers.size(); + int size = containers.size(); - CreateContainerResponse container1 = dockerClient - .createContainerCmd(testImage).withCmd("echo").exec(); + CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo").exec(); - assertThat(container1.getId(), not(isEmptyString())); + assertThat(container1.getId(), not(isEmptyString())); - InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); - assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); + assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); - dockerClient.startContainerCmd(container1.getId()).exec(); + dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("container id: " + container1.getId()); + LOG.info("container id: " + container1.getId()); - List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); - for(Container container: containers2) { - LOG.info("listContainer: id=" + container.getId() +" image=" + container.getImage()); - } + for (Container container : containers2) { + LOG.info("listContainer: id=" + container.getId() + " image=" + container.getImage()); + } - assertThat(size + 1, is(equalTo(containers2.size()))); - Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); - assertThat(containers2, matcher); + assertThat(size + 1, is(equalTo(containers2.size()))); + Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); + assertThat(containers2, matcher); - List filteredContainers = filter( - hasField("id", startsWith(container1.getId())), containers2); - assertThat(filteredContainers.size(), is(equalTo(1))); - - for(Container container: filteredContainers) { - LOG.info("filteredContainer: " + container); - } - - Container container2 = filteredContainers.get(0); - assertThat(container2.getCommand(), not(isEmptyString())); - assertThat(container2.getImage(), startsWith(testImage + ":")); - } + List filteredContainers = filter(hasField("id", startsWith(container1.getId())), containers2); + assertThat(filteredContainers.size(), is(equalTo(1))); + for (Container container : filteredContainers) { + LOG.info("filteredContainer: " + container); + } + Container container2 = filteredContainers.get(0); + assertThat(container2.getCommand(), not(isEmptyString())); + assertThat(container2.getImage(), startsWith(testImage + ":")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 05bf94837..e91641eeb 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -22,78 +22,75 @@ @Test(groups = "integration") public class ListImagesCmdImplTest 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 listImages() throws DockerException { - List images = dockerClient.listImagesCmd().withShowAll(true).exec(); - assertThat(images, notNullValue()); - LOG.info("Images List: {}", images); - Info info = dockerClient.infoCmd().exec(); - - assertThat(images.size(), equalTo(info.getImages())); - - Image img = images.get(0); - assertThat(img.getCreated(), is(greaterThan(0L))); - assertThat(img.getVirtualSize(), is(greaterThan(0L))); - assertThat(img.getId(), not(isEmptyString())); - assertThat(img.getRepoTags(), not(emptyArray())); - } - - @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { - String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd() - .withFilters("{\"dangling\":[\"true\"]}") - .withShowAll(true).exec(); - assertThat(images, notNullValue()); - LOG.info("Images List: {}", images); - assertThat(images.size(), is(greaterThan(0))); - boolean imageInFilteredList = isImageInFilteredList(images, imageId); - assertTrue(imageInFilteredList); - } - - private boolean isImageInFilteredList(List images, String expectedImageId) { - for (Image image : images) { - if (expectedImageId.equals(image.getId())) { - return true; - } - } - return false; - } - - private String createDanglingImage() { - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "5").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Committing container {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); - - dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); - dockerClient.removeContainerCmd(container.getId()).exec(); - return imageId; - } + @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 listImages() throws DockerException { + List images = dockerClient.listImagesCmd().withShowAll(true).exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + Info info = dockerClient.infoCmd().exec(); + + assertThat(images.size(), equalTo(info.getImages())); + + Image img = images.get(0); + assertThat(img.getCreated(), is(greaterThan(0L))); + assertThat(img.getVirtualSize(), is(greaterThan(0L))); + assertThat(img.getId(), not(isEmptyString())); + assertThat(img.getRepoTags(), not(emptyArray())); + } + + @Test(groups = "ignoreInCircleCi") + public void listDanglingImages() throws DockerException { + String imageId = createDanglingImage(); + List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) + .exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + assertThat(images.size(), is(greaterThan(0))); + boolean imageInFilteredList = isImageInFilteredList(images, imageId); + assertTrue(imageInFilteredList); + } + + private boolean isImageInFilteredList(List images, String expectedImageId) { + for (Image image : images) { + if (expectedImageId.equals(image.getId())) { + return true; + } + } + return false; + } + + private String createDanglingImage() { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + return imageId; + } } 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 18c001c5f..ec61a53db 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -141,6 +141,4 @@ public void asyncMultipleLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } - - } diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index f9968a449..f3871e042 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -28,24 +28,24 @@ public InputStream exec(PullImageCmd command) { }; @BeforeTest - public void beforeTest() throws DockerException { - super.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 nullAuthConfig() throws Exception { @@ -59,59 +59,57 @@ public void nullAuthConfig() throws Exception { } @Test - public void testPullImage() throws DockerException, IOException { - Info info = dockerClient.infoCmd().exec(); - LOG.info("Client info: {}", info.toString()); - - int imgCount = info.getImages(); - LOG.info("imgCount1: {}", imgCount); - - // This should be an image that is not used by other repositories - // already - // pulled down, preferably small in size. If tag is not used pull will - // download all images in that repository but tmpImgs will only - // deleted 'latest' image but not images with other tags - String testImage = "hackmann/empty"; - - LOG.info("Removing image: {}", testImage); - - try { - dockerClient.removeImageCmd(testImage).withForce().exec(); - } catch (NotFoundException e) { - // just ignore if not exist - } - - - info = dockerClient.infoCmd().exec(); - LOG.info("Client info: {}", info.toString()); - - imgCount = info.getImages(); - LOG.info("imgCount2: {}", imgCount); - - LOG.info("Pulling image: {}", testImage); - - InputStream response = dockerClient.pullImageCmd(testImage).exec(); - - assertThat(asString(response), containsString("Download complete")); - - info = dockerClient.infoCmd().exec(); - LOG.info("Client info after pull, {}", info.toString()); - - assertThat(imgCount, lessThanOrEqualTo(info.getImages())); - - InspectImageResponse inspectImageResponse = dockerClient - .inspectImageCmd(testImage).exec(); - LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - assertThat(inspectImageResponse, notNullValue()); - } - - @Test - public void testPullNonExistingImage() throws DockerException, IOException { - - // does not throw an exception - InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); - // stream needs to be fully read in order to close the underlying connection - asString(is); - } + public void testPullImage() throws DockerException, IOException { + Info info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + int imgCount = info.getImages(); + LOG.info("imgCount1: {}", imgCount); + + // This should be an image that is not used by other repositories + // already + // pulled down, preferably small in size. If tag is not used pull will + // download all images in that repository but tmpImgs will only + // deleted 'latest' image but not images with other tags + String testImage = "hackmann/empty"; + + LOG.info("Removing image: {}", testImage); + + try { + dockerClient.removeImageCmd(testImage).withForce().exec(); + } catch (NotFoundException e) { + // just ignore if not exist + } + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + imgCount = info.getImages(); + LOG.info("imgCount2: {}", imgCount); + + LOG.info("Pulling image: {}", testImage); + + InputStream response = dockerClient.pullImageCmd(testImage).exec(); + + assertThat(asString(response), containsString("Download complete")); + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info after pull, {}", info.toString()); + + assertThat(imgCount, lessThanOrEqualTo(info.getImages())); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(testImage).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + assertThat(inspectImageResponse, notNullValue()); + } + + @Test + public void testPullNonExistingImage() throws DockerException, IOException { + + // does not throw an exception + InputStream is = dockerClient.pullImageCmd("xvxcv/foo").exec(); + // stream needs to be fully read in order to close the underlying connection + asString(is); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index f409aebf7..8498256a8 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -16,60 +16,58 @@ @Test(groups = "integration") public class PushImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(PushImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class); String username; - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); username = dockerClient.authConfig().getUsername(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test - public void pushLatest() throws Exception { + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); + @Test + public void pushLatest() throws Exception { - LOG.info("Created container {}", container.toString()); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); - assertThat(container.getId(), not(isEmptyString())); + LOG.info("Created container {}", container.toString()); - LOG.info("Committing container: {}", container.toString()); - String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); + assertThat(container.getId(), not(isEmptyString())); - // we have to block until image is pushed - asString(dockerClient.pushImageCmd(username + "/busybox").exec()); + LOG.info("Committing container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); + + // we have to block until image is pushed + asString(dockerClient.pushImageCmd(username + "/busybox").exec()); LOG.info("Removing image: {}", imageId); - dockerClient.removeImageCmd(imageId).exec(); - - String response = asString(dockerClient.pullImageCmd(username + "/busybox").exec()); + dockerClient.removeImageCmd(imageId).exec(); - assertThat(response, not(containsString("HTTP code: 404"))); - } + String response = asString(dockerClient.pullImageCmd(username + "/busybox").exec()); - @Test - public void pushExistentImage() throws Exception { + assertThat(response, not(containsString("HTTP code: 404"))); + } - assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); - } + @Test + public void pushExistentImage() throws Exception { -} + assertThat(asString(dockerClient.pushImageCmd(username + "/xxx").exec()), containsString("error")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java index b6fe173ae..22fbb096c 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -28,57 +28,53 @@ @Test(groups = "integration") public class RemoveContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(RemoveContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void removeContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); - - dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); - - LOG.info("Removing container: {}", container.getId()); - dockerClient.removeContainerCmd(container.getId()).exec(); - - List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); - - Matcher matcher = not(hasItem(hasField("id", - startsWith(container.getId())))); - assertThat(containers2, matcher); - - } - - @Test - public void removeNonExistingContainer() throws DockerException { - try { - dockerClient.removeContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + public static final Logger LOG = LoggerFactory.getLogger(RemoveContainerCmdImplTest.class); + @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(groups = "ignoreInCircleCi") + public void removeContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(); + LOG.info("Removing container: {}", container.getId()); + dockerClient.removeContainerCmd(container.getId()).exec(); + + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(container.getId())))); + assertThat(containers2, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java index af6bc39cc..1c0f3db1c 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -29,64 +29,60 @@ @Test(groups = "integration") public class RemoveImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(RemoveImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(RemoveImageCmdImplTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test(groups = "ignoreInCircleCi") - public void removeImage() throws DockerException, InterruptedException { + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); + @Test(groups = "ignoreInCircleCi") + public void removeImage() throws DockerException, InterruptedException { - LOG.info("Committing container {}", container.toString()); - String imageId = dockerClient - .commitCmd(container.getId()).exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); - dockerClient.removeContainerCmd(container.getId()).exec(); + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); - LOG.info("Removing image: {}", imageId); - dockerClient.removeImageCmd(imageId).exec(); + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); - List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + LOG.info("Removing image: {}", imageId); + dockerClient.removeImageCmd(imageId).exec(); - Matcher matcher = not(hasItem(hasField("id", startsWith(imageId)))); - assertThat(containers, matcher); - } + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); - @Test - public void removeNonExistingImage() throws DockerException, InterruptedException { - try { - dockerClient.removeImageCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } + Matcher matcher = not(hasItem(hasField("id", startsWith(imageId)))); + assertThat(containers, matcher); + } - } + @Test + public void removeNonExistingImage() throws DockerException, InterruptedException { + try { + dockerClient.removeImageCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } - diff --git a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java index b6040a0ff..866800163 100644 --- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java @@ -24,67 +24,61 @@ @Test(groups = "integration") public class RestartContainerCmdImplTest 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 restartContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - String startTime = inspectContainerResponse.getState().getStartedAt(); - - dockerClient.restartContainerCmd(container.getId()).withtTimeout(2).exec(); - - InspectContainerResponse inspectContainerResponse2 = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect After Restart: {}", - inspectContainerResponse2.toString()); - - String startTime2 = inspectContainerResponse2.getState().getStartedAt(); - - assertThat(startTime, not(equalTo(startTime2))); - - assertThat(inspectContainerResponse.getState().isRunning(), - is(equalTo(true))); - - dockerClient.killContainerCmd(container.getId()).exec(); - } - - @Test - public void restartNonExistingContainer() throws DockerException, InterruptedException { - try { - dockerClient.restartContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - - } + @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 restartContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + String startTime = inspectContainerResponse.getState().getStartedAt(); + + dockerClient.restartContainerCmd(container.getId()).withtTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect After Restart: {}", inspectContainerResponse2.toString()); + + String startTime2 = inspectContainerResponse2.getState().getStartedAt(); + + assertThat(startTime, not(equalTo(startTime2))); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(true))); + + dockerClient.killContainerCmd(container.getId()).exec(); + } + + @Test + public void restartNonExistingContainer() throws DockerException, InterruptedException { + try { + dockerClient.restartContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java index 859a76cc2..9facdc2d9 100644 --- a/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SaveImageCmdImplTest.java @@ -26,8 +26,7 @@ @Test(groups = "integration") public class SaveImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(SaveImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(SaveImageCmdImplTest.class); String username; @@ -35,6 +34,7 @@ public class SaveImageCmdImplTest extends AbstractDockerClientTest { public void beforeTest() throws DockerException { super.beforeTest(); } + @AfterTest public void afterTest() { super.afterTest(); @@ -53,8 +53,7 @@ public void afterMethod(ITestResult result) { @Test public void saveImage() throws Exception { - InputStream image = IOUtils.toBufferedInputStream(dockerClient - .saveImageCmd("busybox").exec()); + InputStream image = IOUtils.toBufferedInputStream(dockerClient.saveImageCmd("busybox").exec()); assertThat(image.available(), greaterThan(0)); } diff --git a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java index 5c2393534..f61ff078a 100644 --- a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java @@ -25,38 +25,35 @@ @Test(groups = "integration") public class SearchImagesCmdImplTest 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 searchImages() throws DockerException { - List dockerSearch = dockerClient.searchImagesCmd("busybox").exec(); - LOG.info("Search returned {}", dockerSearch.toString()); - - Matcher matcher = hasItem(hasField("name", equalTo("busybox"))); - assertThat(dockerSearch, matcher); - - assertThat( - filter(hasField("name", is("busybox")), dockerSearch).size(), - equalTo(1)); - } - + @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 searchImages() throws DockerException { + List dockerSearch = dockerClient.searchImagesCmd("busybox").exec(); + LOG.info("Search returned {}", dockerSearch.toString()); + + Matcher matcher = hasItem(hasField("name", equalTo("busybox"))); + assertThat(dockerSearch, matcher); + + assertThat(filter(hasField("name", is("busybox")), dockerSearch).size(), equalTo(1)); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java index 3cf643c4e..8a2a2f13e 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -26,57 +26,54 @@ @Test(groups = "integration") public class StopContainerCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(StopContainerCmdImplTest.class); - - @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(groups = "ignoreInCircleCi") - public void testStopContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - dockerClient.startContainerCmd(container.getId()).exec(); - - LOG.info("Stopping container: {}", container.getId()); - dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec(); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); - } - - @Test - public void testStopNonExistingContainer() throws DockerException { - try { - dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - - } - } + public static final Logger LOG = LoggerFactory.getLogger(StopContainerCmdImplTest.class); + + @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(groups = "ignoreInCircleCi") + public void testStopContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Stopping container: {}", container.getId()); + dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + } + + @Test + public void testStopNonExistingContainer() throws DockerException { + try { + dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java index 97f422f28..b7c8bc4ff 100644 --- a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java @@ -19,47 +19,46 @@ @Test(groups = "integration") public class TagImageCmdImplTest extends AbstractDockerClientTest { - public static final Logger LOG = LoggerFactory - .getLogger(TagImageCmdImplTest.class); + public static final Logger LOG = LoggerFactory.getLogger(TagImageCmdImplTest.class); - @BeforeTest - public void beforeTest() throws DockerException { - super.beforeTest(); - } - @AfterTest - public void afterTest() { - super.afterTest(); - } + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } - @BeforeMethod - public void beforeMethod(Method method) { - super.beforeMethod(method); - } + @AfterTest + public void afterTest() { + super.afterTest(); + } - @AfterMethod - public void afterMethod(ITestResult result) { - super.afterMethod(result); - } + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } - @Test - public void tagImage() throws Exception { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } - dockerClient.tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); + @Test + public void tagImage() throws Exception { + String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); - dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec(); - } - - @Test - public void tagNonExistingImage() throws Exception { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); - - try { - dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + dockerClient.tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); -} + dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec(); + } + + @Test + public void tagNonExistingImage() throws Exception { + String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + try { + dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java index 8c9064346..edb5560e6 100644 --- a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java @@ -17,37 +17,36 @@ @Test(groups = "integration") public class VersionCmdImplTest 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 version() throws DockerException { - Version version = dockerClient.versionCmd().exec(); - LOG.info(version.toString()); - - assertTrue(version.getGoVersion().length() > 0); - assertTrue(version.getVersion().length() > 0); - - assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); - - } + @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 version() throws DockerException { + Version version = dockerClient.versionCmd().exec(); + LOG.info(version.toString()); + + assertTrue(version.getGoVersion().length() > 0); + assertTrue(version.getVersion().length() > 0); + + assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); + + } } diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 19c7057d2..576506498 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -24,56 +24,54 @@ @Test(groups = "integration") public class WaitContainerCmdImplTest 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 testWaitContainer() throws DockerException { - - CreateContainerResponse container = dockerClient - .createContainerCmd("busybox").withCmd("true").exec(); - - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(isEmptyString())); - - dockerClient.startContainerCmd(container.getId()).exec(); - - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); - LOG.info("Container exit code: {}", exitCode); - - assertThat(exitCode, equalTo(0)); - - InspectContainerResponse inspectContainerResponse = dockerClient - .inspectContainerCmd(container.getId()).exec(); - LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); - assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); - } - - @Test - public void testWaitNonExistingContainer() throws DockerException { - try { - dockerClient.waitContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } - } + @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 testWaitContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + LOG.info("Container exit code: {}", exitCode); + + assertThat(exitCode, equalTo(0)); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); + } + + @Test + public void testWaitNonExistingContainer() throws DockerException { + try { + dockerClient.waitContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java index 428511c2e..8b5e3c7e4 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java @@ -13,38 +13,37 @@ public class DockerfileTest extends TestCase { - private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class); + private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class); - @Test - public void testAllItems() throws IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader() - .getResource("netcat").getFile()); + @Test + public void testAllItems() throws IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); - File root = baseDir.getParentFile(); + File root = baseDir.getParentFile(); - Map dockerfiles = new HashMap(); - Map results = new HashMap(); + Map dockerfiles = new HashMap(); + Map results = new HashMap(); - for (File child : root.listFiles()) { - if (new File(child, "Dockerfile").exists()) { - Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); - dockerfiles.put(child.getName(), dockerfile); - } - } + for (File child : root.listFiles()) { + if (new File(child, "Dockerfile").exists()) { + Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile")); + dockerfiles.put(child.getName(), dockerfile); + } + } - for (String name : dockerfiles.keySet()) { - log.info("Scanning {}", name); - try { - results.put(name, dockerfiles.get(name).parse()); - } catch (Exception ex) { - log.error("Error in {}", name, ex); - } + for (String name : dockerfiles.keySet()) { + log.info("Scanning {}", name); + try { + results.put(name, dockerfiles.get(name).parse()); + } catch (Exception ex) { + log.error("Error in {}", name, ex); + } - } + } - for (String name : results.keySet()) { - log.info("Name: {} = {}", name, results.get(name)); + for (String name : results.keySet()) { + log.info("Name: {} = {}", name, results.get(name)); + } } - } } \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java index 882b3b012..1d5f43a6f 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java +++ b/src/test/java/com/github/dockerjava/test/serdes/AbstractJSONResourceRef.java @@ -17,15 +17,17 @@ /** * 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 index 96e5df726..662b9b216 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONResourceRef.java @@ -18,20 +18,23 @@ import java.io.IOException; /** - * References JSON resources, which + * 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(); + 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 index b6a33b722..c83851370 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -29,16 +29,20 @@ /** * 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 + * + * @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()); @@ -47,71 +51,91 @@ public static String readString(JSONResourceRef resource) throws IOException { } 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 + * + * @param + * Data class to be read + * @param resource + * Resource reference + * @param tclass + * Class entry * @return Item - * @throws IOException JSON conversion error + * @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 + * + * @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 { + 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 + * + * @param + * Item class + * @param item + * Item to be checked * @return Deserialized object after the roundtrip - * @throws IOException JSON Conversion error - * @throws AssertionError Validation error + * @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()); + 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 + * + * @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 + * @throws IOException + * JSON Conversion error + * @throws AssertionError + * Validation error */ - public static TClass testRoundTrip(TClass item, Class asclass) - throws IOException, AssertionError { + public static TClass testRoundTrip(TClass item, Class asclass) throws IOException, AssertionError { ObjectMapper mapper = new ObjectMapper(); - + 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 022a2a6df1eb90d88a51cfe462a8a5dcff0cac9d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 26 Jun 2015 21:39:24 +0200 Subject: [PATCH 0252/1399] Merge from master --- .../dockerjava/api/command/AttachContainerCmd.java | 2 +- .../github/dockerjava/api/command/LogContainerCmd.java | 9 ++++++++- .../com/github/dockerjava/core/command/FrameReader.java | 3 --- .../java/com/github/dockerjava/jaxrs/EventsCmdExec.java | 1 - .../com/github/dockerjava/jaxrs/LogContainerCmdExec.java | 1 - .../jaxrs/util/WrappedResponseInputStream.java | 2 +- .../core/command/AttachContainerCmdImplTest.java | 2 +- 7 files changed, 11 insertions(+), 9 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 c414947fe..3261be28c 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -75,4 +75,4 @@ public interface AttachContainerCmd extends AsyncDockerCmd { } -} \ 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 48a3b8976..43d6466d8 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -20,9 +20,16 @@ * - 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 +<<<<<<< HEAD * * Consider wrapping any input stream you get with a frame reader to make reading frame easier. * +======= + * + * Consider wrapping any input stream you get with a frame reader to make reading frame easier. + * + * @see com.github.dockerjava.core.command.FrameReader +>>>>>>> refs/heads/master */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -80,4 +87,4 @@ public interface LogContainerCmd extends AsyncDockerCmd { } -} \ No newline at end of file +} 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 3f8aad9e8..d8f0cd7f6 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -4,8 +4,6 @@ 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; @@ -75,7 +73,6 @@ public Frame readFrame() throws IOException { return new Frame(streamType(buffer[0]), payload); } - } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 69578a533..115c7c3d3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -7,7 +7,6 @@ import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -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; diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 83a20bce1..e50ef610a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -8,7 +8,6 @@ import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.async.FrameStreamProcessor; -import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; 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 b782667fe..fe4514273 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -9,7 +9,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 * blocking/hanging connections. - * + * * @author marcus */ public class WrappedResponseInputStream extends InputStream { 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 3a1c70c8f..fa5ec44ae 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -78,7 +78,7 @@ public void onNext(Frame frame) { collectFramesCallback.close(); - assertThat(collectFramesCallback.toString(), endsWith(snippet)); + assertThat(collectFramesCallback.toString(), containsString(snippet)); } @Test From 1407b7f4e1d69c8c8c0fbf8a43afee062068812e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 3 Jul 2015 19:55:03 +0200 Subject: [PATCH 0253/1399] Add eclipse formatting rules --- etc/code-style.epf | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 etc/code-style.epf diff --git a/etc/code-style.epf b/etc/code-style.epf new file mode 100644 index 000000000..abd8a9364 --- /dev/null +++ b/etc/code-style.epf @@ -0,0 +1,23 @@ +#Mon Jun 29 09:34:24 CEST 2015 +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true +/instance/org.eclipse.jdt.ui/formatter_settings_version=12 +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=12 +/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldSuffixes= +/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_code_templates=