From cdea15bb437a402a50628debde7bb7ae5b4e9a57 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 23 Jul 2018 19:42:26 +0300 Subject: [PATCH 01/66] [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 25e75bebd..7f9cefc94 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-rc-4 + 3.1.0-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 - 3.1.0-rc-4 + HEAD From 39d02d870e80d49efcd8e0e990953322dce3f611 Mon Sep 17 00:00:00 2001 From: Richard North Date: Mon, 13 Aug 2018 00:55:27 +0100 Subject: [PATCH 02/66] Allow netty to handle compressed response bodies Fixes #1079 --- .../github/dockerjava/netty/NettyDockerCmdExecFactory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java index 5e63921e1..dfc740e35 100644 --- a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java @@ -39,6 +39,7 @@ import io.netty.channel.unix.DomainSocketAddress; import io.netty.channel.unix.UnixChannel; import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpContentDecompressor; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.ssl.SslHandler; import io.netty.handler.timeout.IdleState; @@ -158,6 +159,7 @@ public EpollDomainSocketChannel newChannel() { @Override protected void initChannel(final UnixChannel channel) throws Exception { channel.pipeline().addLast(new HttpClientCodec()); + channel.pipeline().addLast(new HttpContentDecompressor()); } }); return epollEventLoopGroup; @@ -172,6 +174,7 @@ public EventLoopGroup kqueueGroup() { protected void initChannel(final KQueueDomainSocketChannel channel) throws Exception { channel.pipeline().addLast(new LoggingHandler(getClass())); channel.pipeline().addLast(new HttpClientCodec()); + channel.pipeline().addLast(new HttpContentDecompressor()); } }); @@ -212,6 +215,7 @@ protected void initChannel(final SocketChannel channel) throws Exception { // channel.pipeline().addLast(new // HttpProxyHandler(proxyAddress)); channel.pipeline().addLast(new HttpClientCodec()); + channel.pipeline().addLast(new HttpContentDecompressor()); } }); From fee921e8ca4cceb929993f31cef47b49837c297e Mon Sep 17 00:00:00 2001 From: Sylvere Richard Date: Tue, 14 Aug 2018 20:18:25 +0200 Subject: [PATCH 03/66] Fix #921, make AuthConfig compatible with indentitytoken which was introduced in DOCKER API 1.23 --- .../dockerjava/api/model/AuthConfig.java | 20 +++++++++++++++++++ .../dockerjava/api/model/AuthConfigTest.java | 17 ++++++++++++++++ .../samples/1.23/other/AuthConfig/docs1.json | 4 ++++ 3 files changed, 41 insertions(+) create mode 100644 src/test/resources/samples/1.23/other/AuthConfig/docs1.json 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 074c6db61..3cba343c2 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -42,6 +42,12 @@ public class AuthConfig implements Serializable { @JsonProperty("registrytoken") private String registrytoken; + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_23} + */ + @JsonProperty("identitytoken") + private String identitytoken; + public String getUsername() { return username; } @@ -87,6 +93,20 @@ public AuthConfig withAuth(String auth) { return this; } + /** + * @see #identitytoken + */ + public String getIdentitytoken() { + return identitytoken; + } + /** + * @see #identitytoken + */ + public AuthConfig withIdentityToken(String identitytoken) { + this.identitytoken = identitytoken; + return this; + } + /** * @see #registrytoken */ diff --git a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index 351086d19..db9bf6d60 100644 --- a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -61,4 +61,21 @@ public void serderDocs2() throws IOException { assertThat(authConfig1, equalTo(authConfig)); } + + @Test + public void compatibleWithIdentitytoken() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_23, + "/other/AuthConfig/docs1.json", + type + ); + String auth = "YWRtaW46"; + String identitytoken = "1cba468e-8cbe-4c55-9098-2c2ed769e885"; + assertThat(authConfig, notNullValue()); + assertThat(authConfig.getAuth(), is(auth)); + assertThat(authConfig.getIdentitytoken(), is(identitytoken)); + final AuthConfig authConfig1 = new AuthConfig().withAuth(auth).withIdentityToken(identitytoken); + assertThat(authConfig1, equalTo(authConfig)); + } } diff --git a/src/test/resources/samples/1.23/other/AuthConfig/docs1.json b/src/test/resources/samples/1.23/other/AuthConfig/docs1.json new file mode 100644 index 000000000..1ebc88193 --- /dev/null +++ b/src/test/resources/samples/1.23/other/AuthConfig/docs1.json @@ -0,0 +1,4 @@ +{ + "auth": "YWRtaW46", + "identitytoken": "1cba468e-8cbe-4c55-9098-2c2ed769e885" +} \ No newline at end of file From 94af355c8e2d29fa95226fdde7aaa3375c980113 Mon Sep 17 00:00:00 2001 From: exfalso <0slemi0@gmail.com> Date: Sat, 18 Aug 2018 23:17:23 +0100 Subject: [PATCH 04/66] Fix double-marshalling of cachefrom --- .../github/dockerjava/core/exec/BuildImageCmdExec.java | 8 ++++---- .../com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 7 +++---- .../java/com/github/dockerjava/cmd/BuildImageCmdIT.java | 3 +-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java index 9d749ae44..486cbe620 100644 --- a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java @@ -1,8 +1,5 @@ package com.github.dockerjava.core.exec; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.BuildImageCmd; @@ -12,6 +9,9 @@ import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.MediaType; import com.github.dockerjava.core.WebTarget; +import com.google.common.base.Joiner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.apache.commons.lang.StringUtils.isNotBlank; @@ -59,7 +59,7 @@ protected Void execute0(BuildImageCmd command, ResultCallback } if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) { - webTarget = webTarget.queryParamsSet("cachefrom", command.getCacheFrom()); + webTarget = webTarget.queryParam("cachefrom", "[\"" + Joiner.on("\",\"").join(command.getCacheFrom()) + "\"]"); } if (command.getRemote() != null) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 53f31050a..854dec1df 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.RequestEntityProcessing; import org.slf4j.Logger; @@ -75,10 +76,8 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("t", command.getTag()); } - if (command.getCacheFrom() != null) { - for (String c: command.getCacheFrom()) { - webTarget = webTarget.queryParam("cachefrom", c); - } + if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) { + webTarget = webTarget.queryParam("cachefrom", "[\"" + Joiner.on("\",\"").join(command.getCacheFrom()) + "\"]"); } if (command.getRemote() != null) { diff --git a/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java b/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java index 89d9d5b33..aae6380d8 100644 --- a/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java @@ -302,8 +302,7 @@ public void cacheFrom() throws Exception { assertThat(inspectImageResponse1, not(nullValue())); File baseDir2 = fileFromBuildTestResource("CacheFrom/test2"); - String cacheImage = String.format("[\"%s\"]", imageId1); - String imageId2 = dockerRule.getClient().buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(cacheImage))) + String imageId2 = dockerRule.getClient().buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(imageId1))) .exec(new BuildImageResultCallback()) .awaitImageId(); InspectImageResponse inspectImageResponse2 = dockerRule.getClient().inspectImageCmd(imageId2).exec(); From 68ff59926b05c54b97a6e52b4799ab2f693a5bc7 Mon Sep 17 00:00:00 2001 From: "Kevin D. Williams" Date: Mon, 20 Aug 2018 15:45:51 -0600 Subject: [PATCH 05/66] ugly fix for failure with latest docker client on mac --- .../dockerjava/api/model/AuthConfig.java | 20 +++++++++++++++++++ .../dockerjava/api/model/AuthConfigTest.java | 15 ++++++++++++++ .../1.25/other/AuthConfig/orchestrators.json | 3 +++ 3 files changed, 38 insertions(+) create mode 100644 src/test/resources/samples/1.25/other/AuthConfig/orchestrators.json 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 3cba343c2..72bf4ef04 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -48,6 +48,12 @@ public class AuthConfig implements Serializable { @JsonProperty("identitytoken") private String identitytoken; + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("stackOrchestrator") + private String stackOrchestrator; + public String getUsername() { return username; } @@ -123,6 +129,20 @@ public AuthConfig withRegistrytoken(String registrytoken) { return this; } + /** + * @see #stackOrchestrator + */ + public String getStackOrchestrator() { + return stackOrchestrator; + } + + /** + * @see #stackOrchestrator + */ + public void setStackOrchestrator(String stackOrchestrator) { + this.stackOrchestrator = stackOrchestrator; + } + @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); diff --git a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index db9bf6d60..add1e7a25 100644 --- a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -10,6 +10,7 @@ import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; @@ -78,4 +79,18 @@ public void compatibleWithIdentitytoken() throws IOException { final AuthConfig authConfig1 = new AuthConfig().withAuth(auth).withIdentityToken(identitytoken); assertThat(authConfig1, equalTo(authConfig)); } + + @Test + public void shouldNotFailWithStackOrchestratorInConfig() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_25, + "/other/AuthConfig/orchestrators.json", + type + ); + assertThat(authConfig, notNullValue()); + assertThat(authConfig.getAuth(), is(nullValue())); + assertThat(authConfig.getStackOrchestrator(), is("kubernetes")); + } + } diff --git a/src/test/resources/samples/1.25/other/AuthConfig/orchestrators.json b/src/test/resources/samples/1.25/other/AuthConfig/orchestrators.json new file mode 100644 index 000000000..3b67b1941 --- /dev/null +++ b/src/test/resources/samples/1.25/other/AuthConfig/orchestrators.json @@ -0,0 +1,3 @@ +{ + "stackOrchestrator" : "kubernetes" +} \ No newline at end of file From c552bb04edfa77187a76a798b8a4573f05aedf9c Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Fri, 24 Aug 2018 10:31:56 +0100 Subject: [PATCH 06/66] #1086: Address comments --- .../core/exec/BuildImageCmdExec.java | 4 +-- .../core/util/CacheFromEncoder.java | 27 +++++++++++++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 5 ++-- 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java diff --git a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java index 486cbe620..d229a9732 100644 --- a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java @@ -9,7 +9,7 @@ import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.MediaType; import com.github.dockerjava.core.WebTarget; -import com.google.common.base.Joiner; +import com.github.dockerjava.core.util.CacheFromEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +59,7 @@ protected Void execute0(BuildImageCmd command, ResultCallback } if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) { - webTarget = webTarget.queryParam("cachefrom", "[\"" + Joiner.on("\",\"").join(command.getCacheFrom()) + "\"]"); + webTarget = webTarget.queryParam("cachefrom", CacheFromEncoder.jsonEncode(command.getCacheFrom())); } if (command.getRemote() != null) { diff --git a/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java b/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java new file mode 100644 index 000000000..59da5e406 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.core.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + +import javax.ws.rs.core.MediaType; +import java.util.Collection; + +/** + * JSON Encoder for the docker --cache-from parameter. + */ +public class CacheFromEncoder { + private CacheFromEncoder() { + } + + private static final ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Collection.class, + MediaType.APPLICATION_JSON_TYPE); + + public static String jsonEncode(Collection imageIds) { + try { + return OBJECT_MAPPER.writeValueAsString(imageIds); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 854dec1df..a741e0a61 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -7,9 +7,10 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Joiner; +import com.github.dockerjava.core.util.CacheFromEncoder; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.RequestEntityProcessing; import org.slf4j.Logger; @@ -77,7 +78,7 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag } if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) { - webTarget = webTarget.queryParam("cachefrom", "[\"" + Joiner.on("\",\"").join(command.getCacheFrom()) + "\"]"); + webTarget = webTarget.queryParam("cachefrom", CacheFromEncoder.jsonEncode(command.getCacheFrom())); } if (command.getRemote() != null) { From 92a4263a9a304848c46ab11e3ee6972028ea53e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szywa=C5=82a=20Andrzej?= Date: Wed, 29 Aug 2018 08:43:10 +0200 Subject: [PATCH 07/66] InvalidDefinitionException: No serializer found for class com.github.dockerjava.api.model.ServiceGlobalModeOptions #1090 --- .../com/github/dockerjava/netty/NettyInvocationBuilder.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java index 952fea3ac..39ea98c51 100644 --- a/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.Frame; @@ -343,7 +344,9 @@ private HttpRequest prepareEntityRequest(String uri, Object entity, HttpMethod h byte[] bytes; try { - bytes = new ObjectMapper().writeValueAsBytes(entity); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + bytes = objectMapper.writeValueAsBytes(entity); } catch (JsonProcessingException e) { throw new RuntimeException(e); } From 393e7cd0cd104bc5e49e896edb099ca8ec0e616b Mon Sep 17 00:00:00 2001 From: Wolfram Wingerath Date: Tue, 4 Sep 2018 13:10:32 +0200 Subject: [PATCH 08/66] Added memory swappiness to create container command. --- .../api/command/CreateContainerCmd.java | 5 +++++ .../core/command/CreateContainerCmdImpl.java | 13 ++++++++++++ .../dockerjava/cmd/CreateContainerCmdIT.java | 20 +++++++++++++++++++ 3 files changed, 38 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 34682a14f..4fc7f5f32 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -126,6 +126,9 @@ public interface CreateContainerCmd extends SyncDockerCmd Date: Thu, 13 Sep 2018 18:28:30 +0200 Subject: [PATCH 09/66] Add OSVersion and RootFS support in InspectImageResponse --- .../dockerjava/api/command/GraphData.java | 19 +++++ .../api/command/InspectImageResponse.java | 41 +++++++++++ .../github/dockerjava/api/command/RootFS.java | 72 +++++++++++++++++++ .../api/command/InspectImageResponseTest.java | 46 ++++++++++++ .../samples/1.25/images/windowsImage/doc.json | 72 +++++++++++++++++++ 5 files changed, 250 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/command/RootFS.java create mode 100644 src/test/resources/samples/1.25/images/windowsImage/doc.json diff --git a/src/main/java/com/github/dockerjava/api/command/GraphData.java b/src/main/java/com/github/dockerjava/api/command/GraphData.java index 5a2944e0b..518970dc6 100644 --- a/src/main/java/com/github/dockerjava/api/command/GraphData.java +++ b/src/main/java/com/github/dockerjava/api/command/GraphData.java @@ -28,6 +28,9 @@ public class GraphData { @JsonProperty("DeviceSize") private String deviceSize; + @JsonProperty("dir") + private String dir; + /** * @see #rootDir */ @@ -92,6 +95,22 @@ public GraphData withDeviceSize(String deviceSize) { return this; } + /** + * @see #dir + */ + @CheckForNull + public String getDir() { + return dir; + } + + /** + * @see #dir + */ + public GraphData withDir(String dir) { + this.dir = dir; + return this; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); 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 c1967e384..19727504e 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java @@ -49,6 +49,12 @@ public class InspectImageResponse { @JsonProperty("Os") private String os; + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("OsVersion") + private String osVersion; + @JsonProperty("Parent") private String parent; @@ -73,6 +79,9 @@ public class InspectImageResponse { @JsonProperty("GraphDriver") private GraphDriver graphDriver; + @JsonProperty("RootFS") + private RootFS rootFS; + /** * @see #arch */ @@ -236,6 +245,22 @@ public InspectImageResponse withOs(String os) { return this; } + /** + * @see #osVersion + */ + @CheckForNull + public String getOsVersion() { + return osVersion; + } + + /** + * @see #osVersion + */ + public InspectImageResponse withOsVersion(String osVersion) { + this.osVersion = osVersion; + return this; + } + /** * @see #parent */ @@ -332,6 +357,22 @@ public InspectImageResponse withVirtualSize(Long virtualSize) { return this; } + /** + * @see #rootFS + */ + @CheckForNull + public RootFS getRootFS() { + return rootFS; + } + + /** + * @see #rootFS + */ + public InspectImageResponse withRootFS(RootFS rootFS) { + this.rootFS = rootFS; + return this; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/command/RootFS.java b/src/main/java/com/github/dockerjava/api/command/RootFS.java new file mode 100644 index 000000000..82d3049d6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/RootFS.java @@ -0,0 +1,72 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import javax.annotation.CheckForNull; +import java.util.List; + +/** + * Part of {@link InspectImageResponse} + * + * @author Dmitry Tretyakov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class RootFS { + + @JsonProperty("Type") + private String type; + + @JsonProperty("Layers") + private List layers; + + /** + * @see #type + */ + @CheckForNull + public String getType() { + return type; + } + + /** + * @see #type + */ + public RootFS withType(String type) { + this.type = type; + return this; + } + + /** + * @see #layers + */ + @CheckForNull + public List getLayers() { + return layers; + } + + /** + * @see #layers + */ + public RootFS withLayers(List layers) { + this.layers = layers; + return this; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } +} diff --git a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java index ca17ec58a..2cfde68d7 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java @@ -9,6 +9,7 @@ import java.util.Collections; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_22; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_25; import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -206,4 +207,49 @@ public void testOverlayNetworkRootDir() throws IOException { assertThat(graphDriver.getName(), is("overlay")); assertThat(graphDriver.getData(), equalTo(overlayGraphData)); } + + @Test + public void inspectWindowsImage() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class); + + final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_25, + "images/windowsImage/doc.json", + type + ); + + assertThat(inspectImage, notNullValue()); + + assertThat(inspectImage.getRepoTags(), hasSize(1)); + assertThat(inspectImage.getRepoTags(), contains( + "microsoft/nanoserver:latest" + )); + + assertThat(inspectImage.getRepoDigests(), hasSize(1)); + assertThat(inspectImage.getRepoDigests(), contains("microsoft/nanoserver@" + + "sha256:aee7d4330fe3dc5987c808f647441c16ed2fa1c7d9c6ef49d6498e5c9860b50b") + ); + + assertThat(inspectImage.getConfig(), notNullValue()); + assertThat(inspectImage.getConfig().getCmd(), is(new String[]{"c:\\windows\\system32\\cmd.exe"})); + + assertThat(inspectImage.getOs(), is("windows")); + assertThat(inspectImage.getOsVersion(), is("10.0.14393")); + assertThat(inspectImage.getSize(), is(651862727L)); + assertThat(inspectImage.getVirtualSize(), is(651862727L)); + + assertThat(inspectImage.getGraphDriver(), notNullValue()); + assertThat(inspectImage.getGraphDriver().getName(), is("windowsfilter")); + assertThat(inspectImage.getGraphDriver().getData(), notNullValue()); + assertThat(inspectImage.getGraphDriver().getData().getDir(), is("C:\\control\\windowsfilter\\" + + "6fe6a289b98276a6a5ca0345156ca61d7b38f3da6bb49ef95af1d0f1ac37e5bf" + )); + + assertThat(inspectImage.getRootFS(), notNullValue()); + assertThat(inspectImage.getRootFS().getType(), is("layers")); + assertThat(inspectImage.getRootFS().getLayers(), hasSize(1)); + assertThat(inspectImage.getRootFS().getLayers(), contains( + "sha256:342d4e407550c52261edd20cd901b5ce438f0b1e940336de3978210612365063" + )); + } } diff --git a/src/test/resources/samples/1.25/images/windowsImage/doc.json b/src/test/resources/samples/1.25/images/windowsImage/doc.json new file mode 100644 index 000000000..e7b68c078 --- /dev/null +++ b/src/test/resources/samples/1.25/images/windowsImage/doc.json @@ -0,0 +1,72 @@ +{ + "Id": "sha256:105d76d0f40e38427c63023ffe649bf36fa85058d3469551e43e4dcc2431fb31", + "RepoTags": [ + "microsoft/nanoserver:latest" + ], + "RepoDigests": [ + "microsoft/nanoserver@sha256:aee7d4330fe3dc5987c808f647441c16ed2fa1c7d9c6ef49d6498e5c9860b50b" + ], + "Parent": "", + "Comment": "", + "Created": "2016-09-22T02:39:30.9154862-07:00", + "Container": "", + "ContainerConfig": { + "Hostname": "", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": null, + "Cmd": null, + "Image": "", + "Volumes": null, + "WorkingDir": "", + "Entrypoint": null, + "OnBuild": null, + "Labels": null + }, + "DockerVersion": "", + "Author": "", + "Config": { + "Hostname": "", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": null, + "Cmd": [ + "c:\\windows\\system32\\cmd.exe" + ], + "Image": "", + "Volumes": null, + "WorkingDir": "", + "Entrypoint": null, + "OnBuild": null, + "Labels": null + }, + "Architecture": "", + "Os": "windows", + "OsVersion": "10.0.14393", + "Size": 651862727, + "VirtualSize": 651862727, + "GraphDriver": { + "Name": "windowsfilter", + "Data": { + "dir": "C:\\control\\windowsfilter\\6fe6a289b98276a6a5ca0345156ca61d7b38f3da6bb49ef95af1d0f1ac37e5bf" + } + }, + "RootFS": { + "Type": "layers", + "Layers": [ + "sha256:342d4e407550c52261edd20cd901b5ce438f0b1e940336de3978210612365063" + ] + } +} \ No newline at end of file From a5be86d945e52a82bce0526cde1e842cc60d266c Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Thu, 13 Sep 2018 18:59:15 +0200 Subject: [PATCH 10/66] Support platform option in image build/create/pull commands --- .../dockerjava/api/command/BuildImageCmd.java | 13 +++++++++++++ .../dockerjava/api/command/CreateImageCmd.java | 9 +++++++++ .../dockerjava/api/command/PullImageCmd.java | 8 ++++++++ .../core/command/BuildImageCmdImpl.java | 13 +++++++++++++ .../core/command/CreateImageCmdImpl.java | 16 +++++++++++++++- .../core/command/PullImageCmdImpl.java | 13 ++++++++++++- .../dockerjava/core/exec/BuildImageCmdExec.java | 4 ++++ .../dockerjava/core/exec/CreateImageCmdExec.java | 4 ++++ .../dockerjava/core/exec/PullImageCmdExec.java | 4 ++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++++ .../dockerjava/jaxrs/CreateImageCmdExec.java | 4 ++++ .../dockerjava/jaxrs/PullImageCmdExec.java | 4 ++++ 12 files changed, 94 insertions(+), 2 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 9cf3296ce..2c0091fcf 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -131,6 +131,14 @@ public interface BuildImageCmd extends AsyncDockerCmd { } 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 86935cd10..4e78dd5e0 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -13,6 +13,9 @@ public interface CreateImageCmd extends SyncDockerCmd { @CheckForNull String getTag(); + @CheckForNull + String getPlatform(); + @CheckForNull InputStream getImageStream(); @@ -35,6 +38,12 @@ public interface CreateImageCmd extends SyncDockerCmd { */ CreateImageCmd withTag(String tag); + /** + * @param platform + * the platform for this image + */ + CreateImageCmd withPlatform(String platform); + interface Exec extends DockerCmdSyncExec { } 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 81da24e61..cc95161a5 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -19,6 +19,9 @@ public interface PullImageCmd extends AsyncDockerCmd implements CreateImageCmd { - private String repository, tag; + private String repository, tag, platform; private InputStream imageStream; @@ -38,6 +38,11 @@ public String getTag() { return tag; } + @Override + public String getPlatform() { + return platform; + } + @Override public InputStream getImageStream() { return imageStream; @@ -75,4 +80,13 @@ public CreateImageCmdImpl withTag(String tag) { this.tag = tag; return this; } + + /** + * {@inheritDoc} + */ + @Override + public CreateImageCmd withPlatform(String platform) { + this.platform = platform; + 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 b69791fe5..a3395c21b 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -13,7 +13,7 @@ */ public class PullImageCmdImpl extends AbstrAsyncDockerCmd implements PullImageCmd { - private String repository, tag, registry; + private String repository, tag, platform, registry; private AuthConfig authConfig; @@ -42,6 +42,11 @@ public String getTag() { return tag; } + @Override + public String getPlatform() { + return platform; + } + @Override public String getRegistry() { return registry; @@ -61,6 +66,12 @@ public PullImageCmd withTag(String tag) { return this; } + @Override + public PullImageCmd withPlatform(String platform) { + this.platform = platform; + return this; + } + @Override public PullImageCmd withRegistry(String registry) { checkNotNull(registry, "registry was not specified"); diff --git a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java index 9d749ae44..06fac4ff4 100644 --- a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java @@ -106,6 +106,10 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("networkmode", command.getNetworkMode()); } + if (command.getPlatform() != null) { + webTarget = webTarget.queryParam("platform", command.getPlatform()); + } + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()) diff --git a/src/main/java/com/github/dockerjava/core/exec/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/CreateImageCmdExec.java index ad3d0d283..b1f4f23c0 100644 --- a/src/main/java/com/github/dockerjava/core/exec/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/CreateImageCmdExec.java @@ -24,6 +24,10 @@ protected CreateImageResponse execute(CreateImageCmd command) { WebTarget webResource = getBaseResource().path("/images/create").queryParam("repo", command.getRepository()) .queryParam("tag", command.getTag()).queryParam("fromSrc", "-"); + if (command.getPlatform() != null) { + webResource = webResource.queryParam("platform", command.getPlatform()); + } + LOGGER.trace("POST: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM) .post(new TypeReference() { diff --git a/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java index a6079d7eb..cafb4ac30 100644 --- a/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java @@ -25,6 +25,10 @@ protected Void execute0(PullImageCmd command, ResultCallback r WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + if (command.getPlatform() != null) { + webResource = webResource.queryParam("platform", command.getPlatform()); + } + LOGGER.trace("POST: {}", webResource); resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request()).accept(MediaType.APPLICATION_OCTET_STREAM).post( null, new TypeReference() { diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 53f31050a..251857ce8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -125,6 +125,10 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("networkmode", command.getNetworkMode()); } + if (command.getPlatform() != null) { + webTarget = webTarget.queryParam("platform", command.getPlatform()); + } + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java index d5c40f83b..dc1c9e1af 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java @@ -26,6 +26,10 @@ protected CreateImageResponse execute(CreateImageCmd command) { WebTarget webResource = getBaseResource().path("/images/create").queryParam("repo", command.getRepository()) .queryParam("tag", command.getTag()).queryParam("fromSrc", "-"); + if (command.getPlatform() != null) { + webResource = webResource.queryParam("platform", command.getPlatform()); + } + 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/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index d2b22856d..70e1d0aac 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -32,6 +32,10 @@ protected AbstractCallbackNotifier callbackNotifier(PullImageC WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + if (command.getPlatform() != null) { + webResource = webResource.queryParam("platform", command.getPlatform()); + } + LOGGER.trace("POST: {}", webResource); Builder builder = resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request()).accept( MediaType.APPLICATION_OCTET_STREAM_TYPE); From fba4fd15ec0c10cd524adbaf50870e5ea37b10ec Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 14 Sep 2018 11:20:42 +0200 Subject: [PATCH 11/66] Add isolation property support in Info response --- .../com/github/dockerjava/api/model/Info.java | 22 +++++ .../dockerjava/core/RemoteApiVersion.java | 2 + .../github/dockerjava/api/model/InfoTest.java | 37 ++++++++ .../resources/samples/1.38/info/lcow.json | 93 +++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 src/test/resources/samples/1.38/info/lcow.json 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 6925df5f2..fdbaa4722 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -230,6 +230,12 @@ public class Info implements Serializable { @JsonProperty("Swarm") private SwarmInfo swarm; + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("Isolation") + private String isolation; + /** * @see #architecture */ @@ -1046,6 +1052,22 @@ public Info withSwarm(SwarmInfo swarm) { return this; } + /** + * @see #isolation + */ + @CheckForNull + public String getIsolation() { + return isolation; + } + + /** + * @see #isolation + */ + public Info withIsolation(String isolation) { + this.isolation = isolation; + return this; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index dcf47d9e6..66b5b47f7 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -87,6 +87,8 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_34 = RemoteApiVersion.create(1, 34); public static final RemoteApiVersion VERSION_1_35 = RemoteApiVersion.create(1, 35); public static final RemoteApiVersion VERSION_1_36 = RemoteApiVersion.create(1, 36); + public static final RemoteApiVersion VERSION_1_37 = RemoteApiVersion.create(1, 37); + public static final RemoteApiVersion VERSION_1_38 = RemoteApiVersion.create(1, 38); /** diff --git a/src/test/java/com/github/dockerjava/api/model/InfoTest.java b/src/test/java/com/github/dockerjava/api/model/InfoTest.java index 372abf52f..6e37636ec 100644 --- a/src/test/java/com/github/dockerjava/api/model/InfoTest.java +++ b/src/test/java/com/github/dockerjava/api/model/InfoTest.java @@ -3,10 +3,12 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.InfoRegistryConfig.IndexConfig; +import com.github.dockerjava.core.RemoteApiVersion; import org.hamcrest.CoreMatchers; import org.junit.Test; import java.io.IOException; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -327,4 +329,39 @@ public void serder2Json() throws IOException { assertThat(info, is(withInfo)); } + + @Test + public void info_1_38() throws IOException { + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().constructType(Info.class); + + final Info info = testRoundTrip(RemoteApiVersion.VERSION_1_38, + "info/lcow.json", + type + ); + + assertThat(info, notNullValue()); + assertThat(info.getArchitecture(), is("x86_64")); + assertThat(info.getDockerRootDir(), is("C:\\ProgramData\\Docker")); + assertThat(info.getDriver(), is("windowsfilter (windows) lcow (linux)")); + + assertThat(info.getDriverStatuses(), equalTo(Arrays.asList( + Arrays.asList("Windows", ""), + Arrays.asList("LCOW", "") + ))); + + assertThat(info.getIsolation(), is("hyperv")); + assertThat(info.getKernelVersion(), is("10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)")); + assertThat(info.getOsType(), is("windows")); + assertThat(info.getOperatingSystem(), is("Windows 10 Pro Version 1803 (OS Build 17134.228)")); + + final Map> plugins = new LinkedHashMap<>(); + plugins.put("Authorization", null); + plugins.put("Log", asList("awslogs", "etwlogs", "fluentd", "gelf", "json-file", "logentries", "splunk", "syslog")); + plugins.put("Network", asList("ics", "l2bridge", "l2tunnel", "nat", "null", "overlay", "transparent")); + plugins.put("Volume", singletonList("local")); + assertThat(info.getPlugins(), equalTo(plugins)); + + assertThat(info.getServerVersion(), is("18.06.1-ce")); + } } diff --git a/src/test/resources/samples/1.38/info/lcow.json b/src/test/resources/samples/1.38/info/lcow.json new file mode 100644 index 000000000..7ab600449 --- /dev/null +++ b/src/test/resources/samples/1.38/info/lcow.json @@ -0,0 +1,93 @@ +{ + "Architecture": "x86_64", + "BridgeNfIp6tables": true, + "BridgeNfIptables": true, + "CPUSet": false, + "CPUShares": false, + "CgroupDriver": "", + "ClusterAdvertise": "", + "ClusterStore": "", + "ContainerdCommit": { + "Expected": "", + "ID": "" + }, + "Containers": 3, + "ContainersPaused": 0, + "ContainersRunning": 0, + "ContainersStopped": 3, + "CpuCfsPeriod": false, + "CpuCfsQuota": false, + "Debug": true, + "DefaultRuntime": "", + "DockerRootDir": "C:\\ProgramData\\Docker", + "Driver": "windowsfilter (windows) lcow (linux)", + "DriverStatus": [["Windows", ""], ["LCOW", ""]], + "ExperimentalBuild": true, + "GenericResources": null, + "HttpProxy": "", + "HttpsProxy": "", + "ID": "ZOGT:VB24:YEPZ:Y7HU:JHPB:WNUE:UYQG:7YRY:VLZV:FLWV:R65B:ICZG", + "IPv4Forwarding": true, + "Images": 2, + "IndexServerAddress": "https://index.docker.io/v1/", + "InitBinary": "", + "InitCommit": { + "Expected": "", + "ID": "" + }, + "Isolation": "hyperv", + "KernelMemory": false, + "KernelVersion": "10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)", + "Labels": [], + "LiveRestoreEnabled": false, + "LoggingDriver": "json-file", + "MemTotal": 68684476416, + "MemoryLimit": false, + "NCPU": 8, + "NEventsListener": 1, + "NFd": -1, + "NGoroutines": 28, + "Name": "somename", + "NoProxy": "", + "OSType": "windows", + "OomKillDisable": false, + "OperatingSystem": "Windows 10 Pro Version 1803 (OS Build 17134.228)", + "Plugins": { + "Authorization": null, + "Log": ["awslogs", "etwlogs", "fluentd", "gelf", "json-file", "logentries", "splunk", "syslog"], + "Network": ["ics", "l2bridge", "l2tunnel", "nat", "null", "overlay", "transparent"], + "Volume": ["local"] + }, + "RegistryConfig": { + "AllowNondistributableArtifactsCIDRs": [], + "AllowNondistributableArtifactsHostnames": [], + "IndexConfigs": { + "docker.io": { + "Mirrors": [], + "Name": "docker.io", + "Official": true, + "Secure": true + } + }, + "InsecureRegistryCIDRs": ["127.0.0.0/8"], + "Mirrors": [] + }, + "RuncCommit": { + "Expected": "", + "ID": "" + }, + "Runtimes": null, + "SecurityOptions": [], + "ServerVersion": "18.06.1-ce", + "SwapLimit": false, + "Swarm": { + "ControlAvailable": false, + "Error": "", + "LocalNodeState": "inactive", + "NodeAddr": "", + "NodeID": "", + "RemoteManagers": null + }, + "SystemStatus": null, + "SystemTime": "2018-09-14T09:40:05.1369294+02:00" +} From a091bdaf80b65e1d33a99719ed6c40793aedc51f Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 14 Sep 2018 11:22:43 +0200 Subject: [PATCH 12/66] Add WorkingDir property in containers exec --- .../dockerjava/api/command/ExecCreateCmd.java | 5 +++++ .../core/command/ExecCreateCmdImpl.java | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) 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 1ab974644..902d01016 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -26,6 +26,9 @@ public interface ExecCreateCmd extends SyncDockerCmd { @CheckForNull Boolean getPrivileged(); + @CheckForNull + String getWorkingDir(); + ExecCreateCmd withAttachStderr(Boolean attachStderr); ExecCreateCmd withAttachStdin(Boolean attachStdin); @@ -42,6 +45,8 @@ public interface ExecCreateCmd extends SyncDockerCmd { ExecCreateCmd withPrivileged(Boolean isPrivileged); + ExecCreateCmd withWorkingDir(String workingDir); + interface Exec extends DockerCmdSyncExec { } 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 ed6e58211..051a45f0c 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -33,7 +33,7 @@ public class ExecCreateCmdImpl extends AbstrDockerCmd Date: Fri, 14 Sep 2018 11:24:21 +0200 Subject: [PATCH 13/66] Add missing properties in Version response --- .../github/dockerjava/api/model/Version.java | 43 +++++++++ .../api/model/VersionComponent.java | 91 +++++++++++++++++++ .../dockerjava/api/model/VersionPlatform.java | 52 +++++++++++ .../dockerjava/api/model/VersionTest.java | 48 ++++++++++ .../resources/samples/1.38/version/lcow.json | 31 +++++++ 5 files changed, 265 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/model/VersionComponent.java create mode 100644 src/main/java/com/github/dockerjava/api/model/VersionPlatform.java create mode 100644 src/test/resources/samples/1.38/version/lcow.json 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 f08c411e2..2dcfdcb86 100644 --- a/src/main/java/com/github/dockerjava/api/model/Version.java +++ b/src/main/java/com/github/dockerjava/api/model/Version.java @@ -9,6 +9,7 @@ import javax.annotation.CheckForNull; import java.io.Serializable; +import java.util.List; /** * Used for `/version` @@ -53,6 +54,24 @@ public class Version implements Serializable { @JsonProperty("Experimental") private Boolean experimental; + /** + * @since ~{@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("MinAPIVersion") + private String minAPIVersion; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_35} + */ + @JsonProperty("Platform") + private VersionPlatform platform; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_35} + */ + @JsonProperty("Components") + private List components; + public String getVersion() { return version; } @@ -97,6 +116,30 @@ public Boolean getExperimental() { return experimental; } + /** + * @see #minAPIVersion + */ + @CheckForNull + public String getMinAPIVersion() { + return minAPIVersion; + } + + /** + * @see #platform + */ + @CheckForNull + public VersionPlatform getPlatform() { + return platform; + } + + /** + * @see #components + */ + @CheckForNull + public List getComponents() { + return components; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/model/VersionComponent.java b/src/main/java/com/github/dockerjava/api/model/VersionComponent.java new file mode 100644 index 000000000..90561d326 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VersionComponent.java @@ -0,0 +1,91 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import javax.annotation.CheckForNull; +import java.util.Map; + +/** + * Part of {@link Version} + * + * @author Dmitry Tretyakov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class VersionComponent { + + @JsonProperty("Details") + private Map details; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Version") + private String version; + + /** + * @see #details + */ + @CheckForNull + public Map getDetails() { + return details; + } + + /** + * @see #details + */ + public VersionComponent withDetails(Map details) { + this.details = details; + return this; + } + + /** + * @see #name + */ + @CheckForNull + public String getName() { + return name; + } + + /** + * @see #name + */ + public VersionComponent withName(String name) { + this.name = name; + return this; + } + + /** + * @see #version + */ + @CheckForNull + public String getVersion() { + return version; + } + + /** + * @see #version + */ + public VersionComponent withVersion(String version) { + this.version = version; + return this; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java b/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java new file mode 100644 index 000000000..1af7d3c55 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; + +import javax.annotation.CheckForNull; + +/** + * Part of {@link Version} + * + * @author Dmitry Tretyakov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class VersionPlatform { + + @JsonProperty("Name") + private String name; + + /** + * @see #name + */ + @CheckForNull + public String getName() { + return name; + } + + /** + * @see #name + */ + public VersionPlatform withName(String name) { + this.name = name; + return this; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/VersionTest.java b/src/test/java/com/github/dockerjava/api/model/VersionTest.java index a2da244c5..606420b3c 100644 --- a/src/test/java/com/github/dockerjava/api/model/VersionTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VersionTest.java @@ -5,9 +5,15 @@ import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; /** @@ -37,4 +43,46 @@ public void testSerDer1() throws Exception { assertThat(version.getBuildTime(), is("2016-02-11T20:39:58.688092588+00:00")); } + @Test + public void version_1_38() throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Version.class); + + final Version version = testRoundTrip(RemoteApiVersion.VERSION_1_38, + "/version/lcow.json", + type + ); + + assertThat(version, notNullValue()); + assertThat(version.getApiVersion(), is("1.38")); + assertThat(version.getArch(), is("amd64")); + assertThat(version.getBuildTime(), is("2018-08-21T17:36:40.000000000+00:00")); + + Map details = new LinkedHashMap<>(); + details.put("ApiVersion", "1.38"); + details.put("Arch", "amd64"); + details.put("BuildTime", "2018-08-21T17:36:40.000000000+00:00"); + details.put("Experimental", "true"); + details.put("GitCommit", "e68fc7a"); + details.put("GoVersion", "go1.10.3"); + details.put("KernelVersion", "10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)"); + details.put("MinAPIVersion", "1.24"); + details.put("Os", "windows"); + + List components = Collections.singletonList(new VersionComponent() + .withDetails(details) + .withName("Engine") + .withVersion("18.06.1-ce") + ); + assertThat(version.getComponents(), equalTo(components)); + + assertThat(version.getExperimental(), is(true)); + assertThat(version.getGitCommit(), is("e68fc7a")); + assertThat(version.getGoVersion(), is("go1.10.3")); + assertThat(version.getKernelVersion(), is("10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)")); + assertThat(version.getMinAPIVersion(), is("1.24")); + assertThat(version.getOperatingSystem(), is("windows")); + assertThat(version.getPlatform(), equalTo(new VersionPlatform().withName(""))); + assertThat(version.getVersion(), is("18.06.1-ce")); + } } diff --git a/src/test/resources/samples/1.38/version/lcow.json b/src/test/resources/samples/1.38/version/lcow.json new file mode 100644 index 000000000..21f496823 --- /dev/null +++ b/src/test/resources/samples/1.38/version/lcow.json @@ -0,0 +1,31 @@ +{ + "ApiVersion": "1.38", + "Arch": "amd64", + "BuildTime": "2018-08-21T17:36:40.000000000+00:00", + "Components": [{ + "Details": { + "ApiVersion": "1.38", + "Arch": "amd64", + "BuildTime": "2018-08-21T17:36:40.000000000+00:00", + "Experimental": "true", + "GitCommit": "e68fc7a", + "GoVersion": "go1.10.3", + "KernelVersion": "10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)", + "MinAPIVersion": "1.24", + "Os": "windows" + }, + "Name": "Engine", + "Version": "18.06.1-ce" + } + ], + "Experimental": true, + "GitCommit": "e68fc7a", + "GoVersion": "go1.10.3", + "KernelVersion": "10.0 17134 (17134.1.amd64fre.rs4_release.180410-1804)", + "MinAPIVersion": "1.24", + "Os": "windows", + "Platform": { + "Name": "" + }, + "Version": "18.06.1-ce" +} From 9cd049239ee5ffaacee37728d429e5209881d2b8 Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 14 Sep 2018 11:36:24 +0200 Subject: [PATCH 14/66] Make VersionComponent and VersionPlatform serializable --- .../com/github/dockerjava/api/model/VersionComponent.java | 6 +++++- .../com/github/dockerjava/api/model/VersionPlatform.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/VersionComponent.java b/src/main/java/com/github/dockerjava/api/model/VersionComponent.java index 90561d326..11fff0abc 100644 --- a/src/main/java/com/github/dockerjava/api/model/VersionComponent.java +++ b/src/main/java/com/github/dockerjava/api/model/VersionComponent.java @@ -2,20 +2,24 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.core.RemoteApiVersion; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import javax.annotation.CheckForNull; +import java.io.Serializable; import java.util.Map; /** * Part of {@link Version} * + * @since {@link RemoteApiVersion#VERSION_1_35} * @author Dmitry Tretyakov */ @JsonIgnoreProperties(ignoreUnknown = true) -public class VersionComponent { +public class VersionComponent implements Serializable { + public static final Long serialVersionUID = 1L; @JsonProperty("Details") private Map details; diff --git a/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java b/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java index 1af7d3c55..b3160438f 100644 --- a/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java +++ b/src/main/java/com/github/dockerjava/api/model/VersionPlatform.java @@ -2,19 +2,23 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.core.RemoteApiVersion; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import javax.annotation.CheckForNull; +import java.io.Serializable; /** * Part of {@link Version} * + * @since {@link RemoteApiVersion#VERSION_1_35} * @author Dmitry Tretyakov */ @JsonIgnoreProperties(ignoreUnknown = true) -public class VersionPlatform { +public class VersionPlatform implements Serializable { + public static final Long serialVersionUID = 1L; @JsonProperty("Name") private String name; From 2c2e301b4fae304f495730fd00fb9c61d6c92393 Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Fri, 14 Sep 2018 18:50:49 +0200 Subject: [PATCH 15/66] Add withFilter methods in ListNetworksCmd & ListVolumesCmd --- .../github/dockerjava/api/command/ListNetworksCmd.java | 8 ++++++++ .../github/dockerjava/api/command/ListVolumesCmd.java | 8 ++++++++ .../dockerjava/core/command/ListNetworksCmdImpl.java | 10 ++++++++++ .../dockerjava/core/command/ListVolumesCmdImpl.java | 8 ++++++++ 4 files changed, 34 insertions(+) diff --git a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java index 23d92151c..40e3d421c 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -5,6 +5,7 @@ import javax.annotation.CheckForNull; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -22,6 +23,13 @@ public interface ListNetworksCmd extends SyncDockerCmd> { ListNetworksCmd withIdFilter(String... networkId); + /** + * @param filterName + * @param filterValues + * - Show only networks where the filter matches the given values + */ + ListNetworksCmd withFilter(String filterName, Collection filterValues); + interface Exec extends DockerCmdSyncExec> { } } diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java index 88c6ee291..bd66653eb 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.command; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -21,6 +22,13 @@ public interface ListVolumesCmd extends SyncDockerCmd { */ ListVolumesCmd withDanglingFilter(Boolean dangling); + /** + * @param filterName + * @param filterValues + * - Show only volumes where the filter matches the given values + */ + ListVolumesCmd withFilter(String filterName, Collection filterValues); + interface Exec extends DockerCmdSyncExec { } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java index 44a9d2cfb..65c13e255 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -4,9 +4,12 @@ import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.util.FiltersBuilder; +import java.util.Collection; import java.util.List; import java.util.Map; +import static com.google.common.base.Preconditions.checkNotNull; + public class ListNetworksCmdImpl extends AbstrDockerCmd> implements ListNetworksCmd { private FiltersBuilder filtersBuilder = new FiltersBuilder(); @@ -31,4 +34,11 @@ public ListNetworksCmd withNameFilter(String... networkName) { this.filtersBuilder.withFilter("name", networkName); return this; } + + @Override + public ListNetworksCmd withFilter(String filterName, Collection filterValues) { + checkNotNull(filterValues, filterName + " was not specified"); + this.filtersBuilder.withFilter(filterName, filterValues); + return this; + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java index d9efe7b17..b3a18d776 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -2,6 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -33,4 +34,11 @@ public ListVolumesCmd withDanglingFilter(Boolean dangling) { this.filters.withFilter("dangling", dangling.toString()); return this; } + + @Override + public ListVolumesCmd withFilter(String filterName, Collection filterValues) { + checkNotNull(filterValues, filterName + " was not specified"); + this.filters.withFilter(filterName, filterValues); + return this; + } } From ecef825e3c48819f81bf1a62b24b4eb911dee004 Mon Sep 17 00:00:00 2001 From: Dmitry Tretyakov Date: Tue, 18 Sep 2018 13:19:55 +0200 Subject: [PATCH 16/66] Add missing properties in InspectContainer response --- .../dockerjava/api/command/GraphDriver.java | 2 +- .../api/command/InspectContainerResponse.java | 25 +++ .../dockerjava/api/model/HostConfig.java | 22 +++ .../command/InspectContainerResponseTest.java | 56 ++++++ .../samples/1.38/containers/inspect/lcow.json | 169 ++++++++++++++++++ 5 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/samples/1.38/containers/inspect/lcow.json diff --git a/src/main/java/com/github/dockerjava/api/command/GraphDriver.java b/src/main/java/com/github/dockerjava/api/command/GraphDriver.java index 1394e866e..598061168 100644 --- a/src/main/java/com/github/dockerjava/api/command/GraphDriver.java +++ b/src/main/java/com/github/dockerjava/api/command/GraphDriver.java @@ -10,7 +10,7 @@ import javax.annotation.CheckForNull; /** - * Part of {@link InspectImageResponse} + * Part of {@link InspectImageResponse} and {@link InspectContainerResponse} * * @author Kanstantsin Shautsou * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} 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 7e60b0be3..cc2761abe 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -110,6 +110,15 @@ public class InspectContainerResponse { @JsonProperty("Mounts") private List mounts; + @JsonProperty("GraphDriver") + private GraphDriver graphDriver; + + /** + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + @JsonProperty("Platform") + private String platform; + public String getId() { return id; } @@ -227,6 +236,22 @@ public Node getNode() { return node; } + /** + * @see #graphDriver + */ + @CheckForNull + public GraphDriver getGraphDriver() { + return graphDriver; + } + + /** + * @see #platform + */ + @CheckForNull + public String getPlatform() { + return platform; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); 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 624c4545e..b857725e3 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -225,6 +225,12 @@ public class HostConfig implements Serializable { @JsonProperty("Tmpfs") private Map tmpFs; + /** + * @since ~{@link RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("Isolation") + private String isolation; + @JsonIgnore public Bind[] getBinds() { return (binds == null) ? new Bind[0] : binds.getBinds(); @@ -329,6 +335,14 @@ public String getPidMode() { return pidMode; } + /** + * @see #isolation + */ + @CheckForNull + public String getIsolation() { + return isolation; + } + /** * @see #blkioDeviceReadBps */ @@ -892,6 +906,14 @@ public HostConfig withTmpFs(Map tmpFs) { return this; } + /** + * @see #isolation + */ + public HostConfig withIsolation(String isolation) { + this.isolation = isolation; + return this; + } + // end of auto-generated @Override 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 ce3a6b83e..ee38b70d0 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -17,11 +17,13 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; import java.io.IOException; +import java.util.Collections; import java.util.List; import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip; @@ -30,6 +32,7 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; @@ -131,4 +134,57 @@ public void roundTrip_1_26b_full() throws IOException { public void roundTrip_empty() throws IOException { testRoundTrip(CommandJSONSamples.inspectContainerResponse_empty, InspectContainerResponse[].class); } + + @Test + public void inspect_windows_container() throws IOException { + + final ObjectMapper mapper = new ObjectMapper(); + final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(InspectContainerResponse.class); + + final InspectContainerResponse response = testRoundTrip(RemoteApiVersion.VERSION_1_38, + "/containers/inspect/lcow.json", + type + ); + + assertThat(response, notNullValue()); + + assertThat(response.getConfig(), notNullValue()); + assertThat(response.getConfig().getCmd(), is(new String[]{"cmd"})); + assertThat(response.getConfig().getImage(), is("microsoft/nanoserver")); + + assertThat(response.getDriver(), is("windowsfilter")); + + assertThat(response.getGraphDriver(), notNullValue()); + assertThat(response.getGraphDriver().getName(), is("windowsfilter")); + assertThat(response.getGraphDriver().getData(), is(new GraphData().withDir( + "C:\\ProgramData\\Docker\\windowsfilter\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556" + ))); + + assertThat(response.getHostConfig(), notNullValue()); + assertThat(response.getHostConfig().getIsolation(), is("hyperv")); + + assertThat(response.getImageId(), is("sha256:1381511ec0122f197b6abff5bc0692bef19943ddafd6680eff41197afa3a6dda")); + assertThat(response.getLogPath(), is( + "C:\\ProgramData\\Docker\\containers\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556" + + "\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556-json.log" + )); + assertThat(response.getName(), is("/cranky_clarke")); + + assertThat(response.getNetworkSettings(), notNullValue()); + assertThat(response.getNetworkSettings().getNetworks(), is(Collections.singletonMap("nat", + new ContainerNetwork() + .withEndpointId("493b77d6fe7e3b92435b1eb01461fde669781330deb84a9cbada360db8997ebc") + .withGateway("172.17.18.1") + .withGlobalIPv6Address("") + .withGlobalIPv6PrefixLen(0) + .withIpv4Address("172.17.18.123") + .withIpPrefixLen(16) + .withIpV6Gateway("") + .withMacAddress("00:aa:ff:cf:dd:09") + .withNetworkID("398c0e206dd677ed4a6566f9de458311f5767d8c7a8b963275490ab64c5d10a7") + ))); + + assertThat(response.getPath(), is("cmd")); + assertThat(response.getPlatform(), is("windows")); + } } diff --git a/src/test/resources/samples/1.38/containers/inspect/lcow.json b/src/test/resources/samples/1.38/containers/inspect/lcow.json new file mode 100644 index 000000000..4e7725def --- /dev/null +++ b/src/test/resources/samples/1.38/containers/inspect/lcow.json @@ -0,0 +1,169 @@ +{ + "AppArmorProfile": "", + "Args": [], + "Config": { + "AttachStderr": true, + "AttachStdin": true, + "AttachStdout": true, + "Cmd": [ + "cmd" + ], + "Domainname": "", + "Entrypoint": null, + "Env": null, + "Hostname": "35da02ca897b", + "Image": "microsoft/nanoserver", + "Labels": {}, + "OnBuild": null, + "OpenStdin": true, + "StdinOnce": true, + "Tty": true, + "User": "", + "Volumes": null, + "WorkingDir": "" + }, + "Created": "2018-09-18T10:37:25.0470753Z", + "Driver": "windowsfilter", + "ExecIDs": null, + "GraphDriver": { + "Data": { + "dir": "C:\\ProgramData\\Docker\\windowsfilter\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556" + }, + "Name": "windowsfilter" + }, + "HostConfig": { + "AutoRemove": true, + "Binds": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceWriteIOps": null, + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "CapAdd": null, + "CapDrop": null, + "Cgroup": "", + "CgroupParent": "", + "ConsoleSize": [ + 50, + 173 + ], + "ContainerIDFile": "", + "CpuCount": 0, + "CpuPercent": 0, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpuShares": 0, + "CpusetCpus": "", + "CpusetMems": "", + "DeviceCgroupRules": null, + "Devices": [], + "DiskQuota": 0, + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IOMaximumBandwidth": 0, + "IOMaximumIOps": 0, + "IpcMode": "", + "Isolation": "hyperv", + "KernelMemory": 0, + "Links": null, + "LogConfig": { + "Config": {}, + "Type": "json-file" + }, + "MaskedPaths": null, + "Memory": 0, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "NanoCpus": 0, + "NetworkMode": "default", + "OomKillDisable": false, + "OomScoreAdj": 0, + "PidMode": "", + "PidsLimit": 0, + "PortBindings": {}, + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyPaths": null, + "ReadonlyRootfs": false, + "RestartPolicy": { + "MaximumRetryCount": 0, + "Name": "no" + }, + "SecurityOpt": null, + "ShmSize": 0, + "UTSMode": "", + "Ulimits": null, + "UsernsMode": "", + "VolumeDriver": "", + "VolumesFrom": null + }, + "HostnamePath": "", + "HostsPath": "", + "Id": "35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556", + "Image": "sha256:1381511ec0122f197b6abff5bc0692bef19943ddafd6680eff41197afa3a6dda", + "LogPath": "C:\\ProgramData\\Docker\\containers\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556\\35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556-json.log", + "MountLabel": "", + "Mounts": [], + "Name": "/cranky_clarke", + "NetworkSettings": { + "Bridge": "", + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "HairpinMode": false, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "MacAddress": "", + "Networks": { + "nat": { + "Aliases": null, + "DriverOpts": null, + "EndpointID": "493b77d6fe7e3b92435b1eb01461fde669781330deb84a9cbada360db8997ebc", + "Gateway": "172.17.18.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAMConfig": null, + "IPAddress": "172.17.18.123", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "Links": null, + "MacAddress": "00:aa:ff:cf:dd:09", + "NetworkID": "398c0e206dd677ed4a6566f9de458311f5767d8c7a8b963275490ab64c5d10a7" + } + }, + "Ports": {}, + "SandboxID": "35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556", + "SandboxKey": "35da02ca897bd378ee52be3066c847fee396ba1a28a00b4be36f42c6686bf556", + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null + }, + "Path": "cmd", + "Platform": "windows", + "ProcessLabel": "", + "ResolvConfPath": "", + "RestartCount": 0, + "State": { + "Dead": false, + "Error": "", + "ExitCode": 0, + "FinishedAt": "0001-01-01T00:00:00Z", + "OOMKilled": false, + "Paused": false, + "Pid": 1588, + "Restarting": false, + "Running": true, + "StartedAt": "2018-09-18T10:37:28.3668368Z", + "Status": "running" + } +} \ No newline at end of file From 89d01df4c3c4bdd432edad41826c01c38cf61bcd Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 18 Sep 2018 23:44:24 +0300 Subject: [PATCH 17/66] [maven-release-plugin] prepare release 3.1.0-rc-5 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7f9cefc94..983bd071f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-SNAPSHOT + 3.1.0-rc-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 + 3.1.0-rc-5 From cb7a56da513eda33514c649636668455c0f31fac Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 18 Sep 2018 23:44:40 +0300 Subject: [PATCH 18/66] [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 983bd071f..7f9cefc94 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-rc-5 + 3.1.0-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 - 3.1.0-rc-5 + HEAD From a097fac99c7735c5a703e56fe1a9e07decbce673 Mon Sep 17 00:00:00 2001 From: John Erwin Date: Wed, 26 Sep 2018 17:33:02 -0600 Subject: [PATCH 19/66] Ignore all but specified files (#1105) * Implement fix for ignore all files except specified, with a test * Fix Typo --- .../github/dockerjava/core/dockerfile/Dockerfile.java | 10 ++++------ .../dockerfile/DockerfileAddMultipleFilesTest.java | 11 +++++++++++ .../dockerignore/IgnoreAllBut/.dockerignore | 3 +++ .../buildTests/dockerignore/IgnoreAllBut/Dockerfile | 1 + .../buildTests/dockerignore/IgnoreAllBut/README.MD | 1 + .../dockerignore/IgnoreAllBut/build/libs/foo.jar | 1 + .../buildTests/dockerignore/IgnoreAllBut/test/bar.txt | 1 + 7 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/buildTests/dockerignore/IgnoreAllBut/.dockerignore create mode 100644 src/test/resources/buildTests/dockerignore/IgnoreAllBut/Dockerfile create mode 100644 src/test/resources/buildTests/dockerignore/IgnoreAllBut/README.MD create mode 100644 src/test/resources/buildTests/dockerignore/IgnoreAllBut/build/libs/foo.jar create mode 100644 src/test/resources/buildTests/dockerignore/IgnoreAllBut/test/bar.txt 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 c9931efbd..11ed5fc4e 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -205,12 +205,10 @@ private void addFilesInDirectory(File directory) { if (files.length != 0) { for (File f : files) { - if (effectiveMatchingIgnorePattern(f) == null) { - if (f.isDirectory()) { - addFilesInDirectory(f); - } else { - filesToAdd.add(f); - } + if (f.isDirectory()) { + addFilesInDirectory(f); + } else if (effectiveMatchingIgnorePattern(f) == null) { + filesToAdd.add(f); } } // base directory should at least contains Dockerfile, but better check diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java index ee1f072df..a10990d96 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java @@ -24,6 +24,17 @@ public String apply(File file) { } }; + @Test + public void ignoreAllBut() throws Exception { + File baseDir = fileFromBuildTestResource("dockerignore/IgnoreAllBut"); + Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir); + Dockerfile.ScannedResult result = dockerfile.parse(); + Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES); + + assertThat(filesToAdd, + containsInAnyOrder("Dockerfile", "foo.jar")); + } + @Test public void nestedDirsPatterns() throws Exception { File baseDir = fileFromBuildTestResource("dockerignore/NestedDirsDockerignore"); diff --git a/src/test/resources/buildTests/dockerignore/IgnoreAllBut/.dockerignore b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/.dockerignore new file mode 100644 index 000000000..116300b83 --- /dev/null +++ b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/.dockerignore @@ -0,0 +1,3 @@ +* +!Dockerfile +!build/libs/foo.jar \ No newline at end of file diff --git a/src/test/resources/buildTests/dockerignore/IgnoreAllBut/Dockerfile b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/Dockerfile new file mode 100644 index 000000000..617801170 --- /dev/null +++ b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/Dockerfile @@ -0,0 +1 @@ +FROM ubuntu:18.04 diff --git a/src/test/resources/buildTests/dockerignore/IgnoreAllBut/README.MD b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/README.MD new file mode 100644 index 000000000..ac11abdc4 --- /dev/null +++ b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/README.MD @@ -0,0 +1 @@ +DO NOT WANT THIS IN THE DOCKER diff --git a/src/test/resources/buildTests/dockerignore/IgnoreAllBut/build/libs/foo.jar b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/build/libs/foo.jar new file mode 100644 index 000000000..4d6bf796e --- /dev/null +++ b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/build/libs/foo.jar @@ -0,0 +1 @@ +foo.jar \ No newline at end of file diff --git a/src/test/resources/buildTests/dockerignore/IgnoreAllBut/test/bar.txt b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/test/bar.txt new file mode 100644 index 000000000..c7152c4d8 --- /dev/null +++ b/src/test/resources/buildTests/dockerignore/IgnoreAllBut/test/bar.txt @@ -0,0 +1 @@ +FILE From 5c03371b8875ac3ddc1d04a7f930edd05215e7c6 Mon Sep 17 00:00:00 2001 From: Yuting Liu Date: Thu, 4 Jan 2018 13:41:07 -0800 Subject: [PATCH 20/66] Add the unit test for blkioStats --- .../dockerjava/api/model/StatisticsTest.java | 14 ++++ .../containers/container/stats/stats1.json | 72 ++++++++++++++----- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java index c0bc01d84..ceef34efd 100644 --- a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java @@ -87,6 +87,20 @@ public void serderJson1() throws IOException { assertThat(blkioStats.getIoServiceBytesRecursive().size(), is(2)); assertThat(blkioStats.getIoServiceBytesRecursive().get(0).getValue(), is(26214L)); assertThat(blkioStats.getIoServicedRecursive().size(), is(2)); + assertThat(blkioStats.getIoServiceBytesRecursive(), equalTo(Arrays.asList( + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Read").withValue(823296L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Write").withValue(122880L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Sync").withValue(835584L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Async").withValue(110592L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Total").withValue(946176L) + ))); + assertThat(blkioStats.getIoServicedRecursive(), equalTo(Arrays.asList( + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Read").withValue(145L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Write").withValue(4L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Sync").withValue(148L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Async").withValue(1L), + new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Total").withValue(149L) + ))); assertThat(blkioStats.getIoQueueRecursive(), is(empty())); assertThat(blkioStats.getIoServiceTimeRecursive(), is(empty())); assertThat(blkioStats.getIoWaitTimeRecursive(), is(empty())); diff --git a/src/test/resources/samples/1.27/containers/container/stats/stats1.json b/src/test/resources/samples/1.27/containers/container/stats/stats1.json index cb5f324f0..e351d0cbd 100644 --- a/src/test/resources/samples/1.27/containers/container/stats/stats1.json +++ b/src/test/resources/samples/1.27/containers/container/stats/stats1.json @@ -5,32 +5,68 @@ "current":2 }, "blkio_stats":{ - "io_service_bytes_recursive": [ + "io_service_bytes_recursive":[ { - "major": 8, - "minor": "0", - "op": "Read", - "value": 26214 + "major":259, + "minor":0, + "op":"Read", + "value":823296 }, { - "major": 8, - "minor": "0", - "op": "Write", - "value": 26214 + "major":259, + "minor":0, + "op":"Write", + "value":122880 + }, + { + "major":259, + "minor":0, + "op":"Sync", + "value":835584 + }, + { + "major":259, + "minor":0, + "op":"Async", + "value":110592 + }, + { + "major":259, + "minor":0, + "op":"Total", + "value":946176 } ], - "io_serviced_recursive": [ + "io_serviced_recursive":[ + { + "major":259, + "minor":0, + "op":"Read", + "value":145 + }, + { + "major":259, + "minor":0, + "op":"Write", + "value":4 + }, + { + "major":259, + "minor":0, + "op":"Sync", + "value":148 + }, { - "major": 8, - "minor": 0, - "op": "Read", - "value": 41771 + "major":259, + "minor":0, + "op":"Async", + "value":1 }, { - "major": 8, - "minor": 0, - "op": "Write", - "value": 72796 + "major":259, + "minor":0, + "op":"Total", + "value":149 } ], "io_queue_recursive":[ From d7ccfa6d12f593160d9e99921f0fb878ab09db0b Mon Sep 17 00:00:00 2001 From: Yuting Liu Date: Wed, 10 Jan 2018 10:41:19 -0800 Subject: [PATCH 21/66] Add failcnt into memorystatsconfig --- .../api/model/MemoryStatsConfig.java | 22 ++++++++++++++----- .../dockerjava/api/model/StatisticsTest.java | 8 ++++--- .../containers/container/stats/stats1.json | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/MemoryStatsConfig.java b/src/main/java/com/github/dockerjava/api/model/MemoryStatsConfig.java index 77c9f0b28..4320a89ed 100644 --- a/src/main/java/com/github/dockerjava/api/model/MemoryStatsConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/MemoryStatsConfig.java @@ -15,18 +15,29 @@ public class MemoryStatsConfig implements Serializable { private static final long serialVersionUID = 1L; + @JsonProperty("stats") + private StatsConfig stats; + @JsonProperty("usage") private Long usage; @JsonProperty("max_usage") private Long maxUsage; - @JsonProperty("stats") - private StatsConfig stats; + @JsonProperty("failcnt") + private Long failcnt; @JsonProperty("limit") private Long limit; + /** + * @see #stats + */ + @CheckForNull + public StatsConfig getStats() { + return stats; + } + /** * @see #usage */ @@ -44,11 +55,10 @@ public Long getMaxUsage() { } /** - * @see #stats + * @see #failcnt */ - @CheckForNull - public StatsConfig getStats() { - return stats; + public Long getFailcnt() { + return failcnt; } /** diff --git a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java index ceef34efd..6082731af 100644 --- a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.core.RemoteApiVersion; +import org.hamcrest.Matchers; import org.junit.Test; import java.io.IOException; @@ -82,11 +83,10 @@ public void serderJson1() throws IOException { assertThat(stats.getWriteback(), is(0L)); assertThat(memoryStats.getLimit(), is(2095874048L)); + assertThat(memoryStats.getFailcnt(), is(0L)); final BlkioStatsConfig blkioStats = statistics.getBlkioStats(); - assertThat(blkioStats.getIoServiceBytesRecursive().size(), is(2)); - assertThat(blkioStats.getIoServiceBytesRecursive().get(0).getValue(), is(26214L)); - assertThat(blkioStats.getIoServicedRecursive().size(), is(2)); + assertThat(blkioStats.getIoServiceBytesRecursive(), Matchers.hasSize(5)); assertThat(blkioStats.getIoServiceBytesRecursive(), equalTo(Arrays.asList( new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Read").withValue(823296L), new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Write").withValue(122880L), @@ -94,6 +94,8 @@ public void serderJson1() throws IOException { new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Async").withValue(110592L), new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Total").withValue(946176L) ))); + + assertThat(blkioStats.getIoServicedRecursive(), Matchers.hasSize(5)); assertThat(blkioStats.getIoServicedRecursive(), equalTo(Arrays.asList( new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Read").withValue(145L), new BlkioStatEntry().withMajor(259L).withMinor(0L).withOp("Write").withValue(4L), diff --git a/src/test/resources/samples/1.27/containers/container/stats/stats1.json b/src/test/resources/samples/1.27/containers/container/stats/stats1.json index e351d0cbd..5a80cd99c 100644 --- a/src/test/resources/samples/1.27/containers/container/stats/stats1.json +++ b/src/test/resources/samples/1.27/containers/container/stats/stats1.json @@ -171,7 +171,8 @@ "unevictable":0, "writeback":0 }, - "limit":2095874048 + "limit":2095874048, + "failcnt":0 }, "name":"/gallant_hamilton", "id":"b581d78b03e41d81c9fe941f03f5d35e23733ff96370456b58d2906e002b0deb", From 43cc60161100087e75b87ce4c030ea27b6e54a5c Mon Sep 17 00:00:00 2001 From: Casper Green Date: Fri, 28 Sep 2018 10:46:34 +0200 Subject: [PATCH 22/66] Change since parameter in LogContainerCmd to String --- .../api/command/LogContainerCmd.java | 8 ++--- .../core/command/LogContainerCmdImpl.java | 11 +++--- .../dockerjava/cmd/LogContainerCmdIT.java | 36 ++++++++++++++++++- 3 files changed, 45 insertions(+), 10 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 53674cbaa..7a92c898d 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -23,8 +23,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: - * 0 (unfiltered) + * - UNIX timestamp, RFC 3339 date, or Go duration string to filter logs. + * Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -47,7 +47,7 @@ public interface LogContainerCmd extends AsyncDockerCmd Boolean hasStderrEnabled(); @CheckForNull - Integer getSince(); + String getSince(); LogContainerCmd withContainerId(@Nonnull String containerId); @@ -67,7 +67,7 @@ public interface LogContainerCmd extends AsyncDockerCmd LogContainerCmd withTail(Integer tail); - LogContainerCmd withSince(Integer since); + LogContainerCmd withSince(String since); /** * @throws com.github.dockerjava.api.NotFoundException 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 aa267fc8f..0b18cd938 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -22,8 +22,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: - * 0 (unfiltered) + * - UNIX timestamp, RFC 3339 date, or Go duration string to filter logs. + * Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -31,7 +31,8 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd Date: Fri, 28 Sep 2018 15:17:53 +0200 Subject: [PATCH 23/66] Add HostConfig.StorageOpt API v1.24: "POST /containers/create now takes StorageOpt field." --- .../dockerjava/api/model/HostConfig.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) 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 b857725e3..9974622e9 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -174,6 +174,12 @@ public class HostConfig implements Serializable { @JsonProperty("RestartPolicy") private RestartPolicy restartPolicy; + /** + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + @JsonProperty("StorageOpt") + private Map storageOpt; + @JsonProperty("Ulimits") private Ulimit[] ulimits; @@ -845,6 +851,21 @@ public HostConfig withRestartPolicy(RestartPolicy restartPolicy) { return this; } + /** + * @see #storageOpt + */ + public Map getStorageOpt() { + return storageOpt; + } + + /** + * @see #storageOpt + */ + public HostConfig withStorageOpt(Map storageOpt) { + this.storageOpt = storageOpt; + return this; + } + /** * @see #securityOpts */ From 118c3dc7dd62457adad6cbd8c770b08801ebaf9a Mon Sep 17 00:00:00 2001 From: Silvestre Zabala Date: Fri, 28 Sep 2018 15:51:25 +0200 Subject: [PATCH 24/66] Add ExecCreateCmd.Env API v1.25: "POST /containers/(id or name)/exec now accepts an Env field, which holds a list of environment variables to be set in the context of the command execution." --- .../dockerjava/api/command/ExecCreateCmd.java | 7 +++++++ .../core/command/ExecCreateCmdImpl.java | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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 902d01016..c03a6334a 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.api.command; +import java.util.List; + import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -20,6 +22,9 @@ public interface ExecCreateCmd extends SyncDockerCmd { @CheckForNull Boolean hasTtyEnabled(); + @CheckForNull + List getEnv(); + @CheckForNull String getUser(); @@ -37,6 +42,8 @@ public interface ExecCreateCmd extends SyncDockerCmd { ExecCreateCmd withCmd(String... cmd); + ExecCreateCmd withEnv(List env); + ExecCreateCmd withContainerId(@Nonnull String containerId); ExecCreateCmd withTty(Boolean tty); 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 051a45f0c..ecf208b7e 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -2,6 +2,8 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; @@ -41,6 +43,12 @@ public class ExecCreateCmdImpl extends AbstrDockerCmd env; + /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_35} */ @@ -95,6 +103,12 @@ public ExecCreateCmd withCmd(String... cmd) { return this; } + @Override + public ExecCreateCmd withEnv(List env) { + this.env = env; + return this; + } + @Override public ExecCreateCmd withPrivileged(Boolean privileged) { this.privileged = privileged; @@ -132,6 +146,11 @@ public Boolean hasTtyEnabled() { return tty; } + @Override + public List getEnv() { + return env; + } + @Override public Boolean getPrivileged() { return privileged; From 1138c29618f00922a9ab1af1cc6bc9478bbb79af Mon Sep 17 00:00:00 2001 From: Dean Bradley Date: Wed, 10 Oct 2018 15:22:26 +0200 Subject: [PATCH 25/66] Added GCPLOGS enum LoggingType --- src/main/java/com/github/dockerjava/api/model/LogConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/model/LogConfig.java b/src/main/java/com/github/dockerjava/api/model/LogConfig.java index 2a3301287..6da68d434 100644 --- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java @@ -80,7 +80,8 @@ public enum LoggingType { FLUENTD("fluentd"), AWSLOGS("awslogs"), DB("db"), // Synology specific driver - SPLUNK("splunk"); + SPLUNK("splunk"), + GCPLOGS("gcplogs"); private String type; From 580ea407cc362276e4f5a47b24593b12a0fae26e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 27 Sep 2018 03:16:58 +0300 Subject: [PATCH 26/66] Stop proxying hostconfig calls. --- .../api/command/CreateContainerCmd.java | 283 ----------- .../dockerjava/api/model/HostConfig.java | 91 +++- .../core/command/CreateContainerCmdImpl.java | 459 ------------------ 3 files changed, 85 insertions(+), 748 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 4fc7f5f32..63d53563f 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -3,20 +3,9 @@ import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; -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.LogConfig; -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.Ulimit; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumesFrom; import javax.annotation.CheckForNull; import java.util.List; @@ -30,51 +19,9 @@ public interface CreateContainerCmd extends SyncDockerCmd getAliases(); - @CheckForNull - Bind[] getBinds(); - - /** - * @since 1.19 - */ - @CheckForNull - Integer getBlkioWeight(); - - @CheckForNull - Capability[] getCapAdd(); - - @CheckForNull - Capability[] getCapDrop(); - @CheckForNull String[] getCmd(); - /** - * @since 1.19 - */ - @CheckForNull - Integer getCpuPeriod(); - - @CheckForNull - String getCpusetCpus(); - - /** - * @since 1.19 - */ - @CheckForNull - String getCpusetMems(); - - @CheckForNull - Integer getCpuShares(); - - @CheckForNull - Device[] getDevices(); - - @CheckForNull - String[] getDns(); - - @CheckForNull - String[] getDnsSearch(); - @CheckForNull String getDomainName(); @@ -90,9 +37,6 @@ public interface CreateContainerCmd extends SyncDockerCmd getLabels(); - @CheckForNull - Link[] getLinks(); - - @CheckForNull - LogConfig getLogConfig(); - - @CheckForNull - LxcConf[] getLxcConf(); - @CheckForNull String getMacAddress(); - @CheckForNull - Long getMemory(); - - @CheckForNull - Long getMemorySwap(); - - @CheckForNull - Integer getMemorySwappiness(); - @CheckForNull String getName(); - @CheckForNull - String getNetworkMode(); - - @CheckForNull - Ports getPortBindings(); - @CheckForNull String[] getPortSpecs(); - @CheckForNull - RestartPolicy getRestartPolicy(); - - @CheckForNull - Ulimit[] getUlimits(); - @CheckForNull String getUser(); @CheckForNull Volume[] getVolumes(); - @CheckForNull - VolumesFrom[] getVolumesFrom(); - @CheckForNull String getWorkingDir(); @@ -171,36 +82,15 @@ public interface CreateContainerCmd extends SyncDockerCmd binds); - - /** - * @since 1.19 - */ - CreateContainerCmd withBlkioWeight(Integer blkioWeight); - - /** - * Add linux kernel capability to the container. For example: - * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. - */ - 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. - */ - CreateContainerCmd withCapAdd(List capAdd); - - /** - * Drop linux kernel capability from the container. For example: - * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files. - */ - 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. - */ - CreateContainerCmd withCapDrop(List capDrop); - CreateContainerCmd withCmd(String... cmd); CreateContainerCmd withCmd(List cmd); - CreateContainerCmd withContainerIDFile(String containerIDFile); - - /** - * @since 1.19 - */ - CreateContainerCmd withCpuPeriod(Integer cpuPeriod); - - CreateContainerCmd withCpusetCpus(String cpusetCpus); - - /** - * @since 1.19 - */ - CreateContainerCmd withCpusetMems(String cpusetMems); - - CreateContainerCmd withCpuShares(Integer cpuShares); - - /** - * Add host devices to the container - */ - CreateContainerCmd withDevices(Device... devices); - - /** - * Add host devices to the container - */ - CreateContainerCmd withDevices(List devices); - - /** - * Set custom DNS servers - */ - CreateContainerCmd withDns(String... dns); - - /** - * Set custom DNS servers - */ - CreateContainerCmd withDns(List dns); - - /** - * Set custom DNS search domains - */ - CreateContainerCmd withDnsSearch(String... dnsSearch); - - /** - * Set custom DNS search domains - */ - CreateContainerCmd withDnsSearch(List dnsSearch); - CreateContainerCmd withDomainName(String domainName); CreateContainerCmd withEntrypoint(String... entrypoint); @@ -329,16 +140,6 @@ public interface CreateContainerCmd extends SyncDockerCmd exposedPorts); - /** - * Add hostnames to /etc/hosts in the container - */ - CreateContainerCmd withExtraHosts(String... extraHosts); - - /** - * Add hostnames to /etc/hosts in the container - */ - CreateContainerCmd withExtraHosts(List extraHosts); - CreateContainerCmd withHostName(String hostName); CreateContainerCmd withImage(String image); @@ -349,114 +150,30 @@ public interface CreateContainerCmd extends SyncDockerCmd labels); - /** - * Add link to another container. - */ - CreateContainerCmd withLinks(Link... links); - - /** - * Add link to another container. - */ - CreateContainerCmd withLinks(List links); - - CreateContainerCmd withLogConfig(LogConfig logConfig); - - CreateContainerCmd withLxcConf(LxcConf... lxcConf); - - CreateContainerCmd withLxcConf(List lxcConf); - CreateContainerCmd withMacAddress(String macAddress); - CreateContainerCmd withMemory(Long memory); - - CreateContainerCmd withMemorySwap(Long memorySwap); - - CreateContainerCmd withMemorySwappiness(Integer memorySwappiness); - CreateContainerCmd withName(String name); CreateContainerCmd withNetworkDisabled(Boolean disableNetwork); - /** - * 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.
  • - *
- */ - CreateContainerCmd withNetworkMode(String networkMode); - - /** - * @since 1.19 - */ - CreateContainerCmd withOomKillDisable(Boolean oomKillDisable); - - /** - * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the - * docker run CLI command. - */ - CreateContainerCmd withPortBindings(PortBinding... portBindings); - - /** - * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the - * docker run CLI command. - */ - CreateContainerCmd withPortBindings(List portBindings); - - /** - * Add the port bindings that are contained in the given {@link Ports} object. - * - * @see #withPortBindings(PortBinding...) - */ - CreateContainerCmd withPortBindings(Ports portBindings); - CreateContainerCmd withPortSpecs(String... portSpecs); CreateContainerCmd withPortSpecs(List portSpecs); - CreateContainerCmd withPrivileged(Boolean privileged); - - CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts); - - CreateContainerCmd withReadonlyRootfs(Boolean readonlyRootfs); - - /** - * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()} - */ - CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); - CreateContainerCmd withStdInOnce(Boolean stdInOnce); CreateContainerCmd withStdinOpen(Boolean stdinOpen); CreateContainerCmd withTty(Boolean tty); - CreateContainerCmd withUlimits(Ulimit... ulimits); - - CreateContainerCmd withUlimits(List ulimits); - CreateContainerCmd withUser(String user); CreateContainerCmd withVolumes(Volume... volumes); CreateContainerCmd withVolumes(List volumes); - CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); - - CreateContainerCmd withVolumesFrom(List volumesFrom); - CreateContainerCmd withWorkingDir(String workingDir); - CreateContainerCmd withCgroupParent(String cgroupParent); - - /** - * Set the PID (Process) Namespace mode for the container, 'host': use the host's PID namespace inside the container - */ - CreateContainerCmd withPidMode(String pidMode); - CreateContainerCmd withHostConfig(HostConfig hostConfig); /** 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 b857725e3..f2ed6ab15 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -16,6 +16,8 @@ import java.util.List; import java.util.Map; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Used in `/containers/create`, and in inspect container. * TODO exclude usage for 2 different models. @@ -30,6 +32,9 @@ public class HostConfig implements Serializable { @JsonProperty("Binds") private Binds binds; + /** + * @since 1.19 + */ @JsonProperty("BlkioWeight") private Integer blkioWeight; @@ -78,6 +83,9 @@ public class HostConfig implements Serializable { @JsonProperty("ContainerIDFile") private String containerIDFile; + /** + * @since 1.19 + */ @JsonProperty("CpuPeriod") private Integer cpuPeriod; @@ -93,6 +101,9 @@ public class HostConfig implements Serializable { @JsonProperty("CpusetCpus") private String cpusetCpus; + /** + * @since 1.19 + */ @JsonProperty("CpusetMems") private String cpusetMems; @@ -135,7 +146,7 @@ public class HostConfig implements Serializable { @JsonProperty("MemoryReservation") private Long memoryReservation; - /** + /** * @since {@link RemoteApiVersion#VERSION_1_21} */ @JsonProperty("KernelMemory") @@ -430,12 +441,13 @@ public Integer getMemorySwappiness() { public Boolean getOomKillDisable() { return oomKillDisable; } + /** * @see #autoRemove */ @CheckForNull public Boolean getAutoRemove() { - return autoRemove; + return autoRemove; } /** @@ -510,6 +522,7 @@ public void setLinks(Link... links) { } // auto-generated builder setters + /** * @see #binds */ @@ -567,7 +580,8 @@ public HostConfig withBlkioWeightDevice(List blkioWeightDevice) { } /** - * @see #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 HostConfig withCapAdd(Capability[] capAdd) { this.capAdd = capAdd; @@ -638,6 +652,11 @@ public HostConfig withCpuShares(Integer cpuShares) { return this; } + public HostConfig withDevices(List devices) { + checkNotNull(devices, "devices was not specified"); + return withDevices(devices.toArray(new Device[devices.size()])); + } + /** * @see #devices */ @@ -662,6 +681,11 @@ public HostConfig withDns(String[] dns) { return this; } + public HostConfig withDns(List dns) { + checkNotNull(dns, "dns was not specified"); + return withDns(dns.toArray(new String[dns.size()])); + } + /** * @see #dnsSearch */ @@ -670,6 +694,11 @@ public HostConfig withDnsSearch(String[] dnsSearch) { return this; } + public HostConfig withDnsSearch(List dnsSearch) { + checkNotNull(dnsSearch, "dnsSearch was not specified"); + return withDnsSearch(dnsSearch.toArray(new String[0])); + } + /** * @see #extraHosts */ @@ -678,6 +707,11 @@ public HostConfig withExtraHosts(String[] extraHosts) { return this; } + public HostConfig withExtraHosts(List extraHosts) { + checkNotNull(extraHosts, "extraHosts was not specified"); + return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()])); + } + /** * @see #kernelMemory */ @@ -694,6 +728,12 @@ public HostConfig withLinks(Links links) { return this; } + public HostConfig withLinks(List links) { + checkNotNull(links, "links was not specified"); + setLinks(links.toArray(new Link[links.size()])); + return this; + } + /** * @see #logConfig */ @@ -710,6 +750,11 @@ public HostConfig withLxcConf(LxcConf[] lxcConf) { return this; } + public HostConfig withLxcConf(List lxcConf) { + checkNotNull(lxcConf, "lxcConf was not specified"); + return withLxcConf(lxcConf.toArray(new LxcConf[0])); + } + /** * @see #memory */ @@ -743,6 +788,15 @@ public HostConfig withMemorySwappiness(Integer memorySwappiness) { } /** + * 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.
  • + *
+ * * @see #networkMode */ public HostConfig withNetworkMode(String networkMode) { @@ -757,12 +811,13 @@ public HostConfig withOomKillDisable(Boolean oomKillDisable) { this.oomKillDisable = oomKillDisable; return this; } + /** * @see #autoRemove */ public HostConfig withAutoRemove(Boolean autoRemove) { - this.autoRemove = autoRemove; - return this; + this.autoRemove = autoRemove; + return this; } /** @@ -781,6 +836,19 @@ public HostConfig withPidMode(String pidMode) { return this; } + /** + * @see #portBindings + */ + public HostConfig withPortBindings(PortBinding... portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + return withPortBindings(new Ports(portBindings)); + } + + public HostConfig withPortBindings(List portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + return withPortBindings(portBindings.toArray(new PortBinding[0])); + } + /** * @see #portBindings */ @@ -869,6 +937,11 @@ public HostConfig withUlimits(Ulimit[] ulimits) { return this; } + public HostConfig withUlimits(List ulimits) { + checkNotNull(ulimits, "no ulimits was specified"); + return withUlimits(ulimits.toArray(new Ulimit[ulimits.size()])); + } + /** * @see #volumeDriver */ @@ -880,11 +953,17 @@ public HostConfig withVolumeDriver(String volumeDriver) { /** * @see #volumesFrom */ - public HostConfig withVolumesFrom(VolumesFrom[] volumesFrom) { + public HostConfig withVolumesFrom(VolumesFrom... volumesFrom) { this.volumesFrom = volumesFrom; return this; } + public HostConfig withVolumesFrom(List volumesFrom) { + checkNotNull(volumesFrom, "volumesFrom was not specified"); + return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()])); + } + + /** * @see #pidsLimit */ 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 a1f4090ba..8ec2561eb 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -195,77 +195,11 @@ public List getAliases() { return aliases; } - @Override - @JsonIgnore - public Bind[] getBinds() { - return hostConfig.getBinds(); - } - - @Override - @JsonIgnore - public Integer getBlkioWeight() { - return hostConfig.getBlkioWeight(); - } - - @Override - @JsonIgnore - public Capability[] getCapAdd() { - return hostConfig.getCapAdd(); - } - - @Override - @JsonIgnore - public Capability[] getCapDrop() { - return hostConfig.getCapDrop(); - } - @Override public String[] getCmd() { return cmd; } - @Override - @JsonIgnore - public Integer getCpuPeriod() { - return hostConfig.getCpuPeriod(); - } - - @Override - @JsonIgnore - public String getCpusetCpus() { - return hostConfig.getCpusetCpus(); - } - - @Override - @JsonIgnore - public String getCpusetMems() { - return hostConfig.getCpusetMems(); - } - - @Override - @JsonIgnore - public Integer getCpuShares() { - return hostConfig.getCpuShares(); - } - - @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 getDomainName() { return domainName; @@ -296,12 +230,6 @@ public String getStopSignal() { return stopSignal; } - @Override - @JsonIgnore - public String[] getExtraHosts() { - return hostConfig.getExtraHosts(); - } - @Override public String getHostName() { return hostName; @@ -328,81 +256,21 @@ public Map getLabels() { return labels; } - @Override - @JsonIgnore - public Link[] getLinks() { - return hostConfig.getLinks(); - } - - @Override - @JsonIgnore - public LxcConf[] getLxcConf() { - return hostConfig.getLxcConf(); - } - - @Override - @JsonIgnore - public LogConfig getLogConfig() { - return hostConfig.getLogConfig(); - } - @Override public String getMacAddress() { return macAddress; } - @Override - @JsonIgnore - public Long getMemory() { - return hostConfig.getMemory(); - } - - @Override - @JsonIgnore - public Long getMemorySwap() { - return hostConfig.getMemorySwap(); - } - - @Override - @JsonIgnore - public Integer getMemorySwappiness() { - return hostConfig.getMemorySwappiness(); - } - @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 - @JsonIgnore - public Ulimit[] getUlimits() { - return hostConfig.getUlimits(); - } - @Override public String getUser() { return user; @@ -414,12 +282,6 @@ public Volume[] getVolumes() { return volumes.getVolumes(); } - @Override - @JsonIgnore - public VolumesFrom[] getVolumesFrom() { - return hostConfig.getVolumesFrom(); - } - @Override public String getWorkingDir() { return workingDir; @@ -445,30 +307,6 @@ public Boolean isNetworkDisabled() { return networkDisabled; } - @Override - @JsonIgnore - public Boolean getOomKillDisable() { - return hostConfig.getOomKillDisable(); - } - - @Override - @JsonIgnore - public Boolean getPrivileged() { - return hostConfig.getPrivileged(); - } - - @Override - @JsonIgnore - public Boolean getPublishAllPorts() { - return hostConfig.getPublishAllPorts(); - } - - @Override - @JsonIgnore - public Boolean getReadonlyRootfs() { - return hostConfig.getReadonlyRootfs(); - } - @Override public Boolean isStdInOnce() { return stdInOnce; @@ -484,22 +322,11 @@ public Boolean isTty() { return tty; } - @Override - @JsonIgnore - public String getPidMode() { - return hostConfig.getPidMode(); - } - @Override public HostConfig getHostConfig() { return hostConfig; } - @Override - public String getCgroupParent() { - return hostConfig.getCgroupParent(); - } - @Override public CreateContainerCmd withAliases(String... aliases) { this.aliases = Arrays.asList(aliases); @@ -534,51 +361,6 @@ public CreateContainerCmd withAttachStdout(Boolean attachStdout) { return this; } - @Override - public CreateContainerCmd withBinds(Bind... binds) { - checkNotNull(binds, "binds was not specified"); - hostConfig.setBinds(binds); - return this; - } - - @Override - public CreateContainerCmd withBinds(List binds) { - checkNotNull(binds, "binds was not specified"); - return withBinds(binds.toArray(new Bind[binds.size()])); - } - - @Override - public CreateContainerCmd withBlkioWeight(Integer blkioWeight) { - checkNotNull(blkioWeight, "blkioWeight was not specified"); - hostConfig.withBlkioWeight(blkioWeight); - return this; - } - - @Override - public CreateContainerCmd withCapAdd(Capability... capAdd) { - checkNotNull(capAdd, "capAdd was not specified"); - hostConfig.withCapAdd(capAdd); - return this; - } - - @Override - public CreateContainerCmd withCapAdd(List capAdd) { - checkNotNull(capAdd, "capAdd was not specified"); - return withCapAdd(capAdd.toArray(new Capability[capAdd.size()])); - } - - @Override - public CreateContainerCmd withCapDrop(Capability... capDrop) { - checkNotNull(capDrop, "capDrop was not specified"); - hostConfig.withCapDrop(capDrop); - return this; - } - - @Override - public CreateContainerCmd withCapDrop(List capDrop) { - checkNotNull(capDrop, "capDrop was not specified"); - return withCapDrop(capDrop.toArray(new Capability[capDrop.size()])); - } @Override public CreateContainerCmd withCmd(String... cmd) { @@ -593,80 +375,6 @@ public CreateContainerCmd withCmd(List cmd) { return withCmd(cmd.toArray(new String[cmd.size()])); } - @Override - public CreateContainerCmd withContainerIDFile(String containerIDFile) { - checkNotNull(containerIDFile, "no containerIDFile was specified"); - hostConfig.withContainerIDFile(containerIDFile); - return this; - } - - @Override - public CreateContainerCmd withCpuPeriod(Integer cpuPeriod) { - checkNotNull(cpuPeriod, "cpuPeriod was not specified"); - hostConfig.withCpuPeriod(cpuPeriod); - return this; - } - - @Override - public CreateContainerCmd withCpusetCpus(String cpusetCpus) { - checkNotNull(cpusetCpus, "cpusetCpus was not specified"); - hostConfig.withCpusetCpus(cpusetCpus); - return this; - } - - @Override - public CreateContainerCmd withCpusetMems(String cpusetMems) { - checkNotNull(cpusetMems, "cpusetMems was not specified"); - hostConfig.withCpusetMems(cpusetMems); - return this; - } - - @Override - public CreateContainerCmd withCpuShares(Integer cpuShares) { - checkNotNull(cpuShares, "cpuShares was not specified"); - hostConfig.withCpuShares(cpuShares); - return this; - } - - @Override - public CreateContainerCmd withDevices(Device... devices) { - checkNotNull(devices, "devices was not specified"); - this.hostConfig.withDevices(devices); - return this; - } - - @Override - public CreateContainerCmd withDevices(List devices) { - checkNotNull(devices, "devices was not specified"); - return withDevices(devices.toArray(new Device[devices.size()])); - } - - @Override - public CreateContainerCmd withDns(String... dns) { - checkNotNull(dns, "dns was not specified"); - this.hostConfig.withDns(dns); - return this; - } - - @Override - public CreateContainerCmd withDns(List dns) { - checkNotNull(dns, "dns was not specified"); - return withDns(dns.toArray(new String[dns.size()])); - } - - @Override - public CreateContainerCmd withDnsSearch(String... dnsSearch) { - checkNotNull(dnsSearch, "dnsSearch was not specified"); - this.hostConfig.withDnsSearch(dnsSearch); - return this; - } - - @Override - public CreateContainerCmd withDnsSearch(List dnsSearch) { - checkNotNull(dnsSearch, "dnsSearch was not specified"); - return withDnsSearch(dnsSearch.toArray(new String[0])); - } - @Override public CreateContainerCmd withDomainName(String domainName) { checkNotNull(domainName, "no domainName was specified"); @@ -720,19 +428,6 @@ public CreateContainerCmd withExposedPorts(List exposedPorts) { return withExposedPorts(exposedPorts.toArray(new ExposedPort[exposedPorts.size()])); } - @Override - public CreateContainerCmd withExtraHosts(String... extraHosts) { - checkNotNull(extraHosts, "extraHosts was not specified"); - this.hostConfig.withExtraHosts(extraHosts); - return this; - } - - @Override - public CreateContainerCmd withExtraHosts(List extraHosts) { - checkNotNull(extraHosts, "extraHosts was not specified"); - return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()])); - } - @Override public CreateContainerCmd withHostName(String hostName) { checkNotNull(hostConfig, "no hostName was specified"); @@ -768,39 +463,6 @@ public CreateContainerCmd withLabels(Map labels) { return this; } - @Override - public CreateContainerCmd withLinks(Link... links) { - checkNotNull(links, "links was not specified"); - this.hostConfig.setLinks(links); - return this; - } - - @Override - public CreateContainerCmd withLinks(List links) { - checkNotNull(links, "links was not specified"); - return withLinks(links.toArray(new Link[links.size()])); - } - - @Override - public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - this.hostConfig.withLxcConf(lxcConf); - return this; - } - - @Override - public CreateContainerCmd withLxcConf(List lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - return withLxcConf(lxcConf.toArray(new LxcConf[0])); - } - - @Override - public CreateContainerCmd withLogConfig(LogConfig logConfig) { - checkNotNull(logConfig, "logConfig was not specified"); - this.hostConfig.withLogConfig(logConfig); - return this; - } - @Override public CreateContainerCmd withMacAddress(String macAddress) { checkNotNull(macAddress, "macAddress was not specified"); @@ -808,27 +470,6 @@ public CreateContainerCmd withMacAddress(String macAddress) { return this; } - @Override - public CreateContainerCmd withMemory(Long memory) { - checkNotNull(memory, "memory was not specified"); - hostConfig.withMemory(memory); - return this; - } - - @Override - public CreateContainerCmd withMemorySwap(Long memorySwap) { - checkNotNull(memorySwap, "memorySwap was not specified"); - hostConfig.withMemorySwap(memorySwap); - return this; - } - - @Override - public CreateContainerCmd withMemorySwappiness(Integer memorySwappiness) { - checkNotNull(memorySwappiness, "memorySwappiness was not specified"); - hostConfig.withMemorySwappiness(memorySwappiness); - return this; - } - @Override public CreateContainerCmd withName(String name) { checkNotNull(name, "name was not specified"); @@ -843,40 +484,6 @@ public CreateContainerCmd withNetworkDisabled(Boolean disableNetwork) { return this; } - @Override - public CreateContainerCmd withNetworkMode(String networkMode) { - checkNotNull(networkMode, "networkMode was not specified"); - this.hostConfig.withNetworkMode(networkMode); - return this; - } - - @Override - public CreateContainerCmd withOomKillDisable(Boolean oomKillDisable) { - checkNotNull(oomKillDisable, "oomKillDisable was not specified"); - hostConfig.withOomKillDisable(oomKillDisable); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(PortBinding... portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.withPortBindings(new Ports(portBindings)); - return this; - } - - @Override - public CreateContainerCmd withPortBindings(List portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - return withPortBindings(portBindings.toArray(new PortBinding[0])); - } - - @Override - public CreateContainerCmd withPortBindings(Ports portBindings) { - checkNotNull(portBindings, "portBindings was not specified"); - this.hostConfig.withPortBindings(portBindings); - return this; - } - @Override public CreateContainerCmd withPortSpecs(String... portSpecs) { checkNotNull(portSpecs, "portSpecs was not specified"); @@ -890,34 +497,6 @@ public CreateContainerCmd withPortSpecs(List portSpecs) { return withPortSpecs(portSpecs.toArray(new String[portSpecs.size()])); } - @Override - public CreateContainerCmd withPrivileged(Boolean privileged) { - checkNotNull(privileged, "no privileged was specified"); - this.hostConfig.withPrivileged(privileged); - return this; - } - - @Override - public CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts) { - checkNotNull(publishAllPorts, "no publishAllPorts was specified"); - this.hostConfig.withPublishAllPorts(publishAllPorts); - return this; - } - - @Override - public CreateContainerCmd withReadonlyRootfs(Boolean readonlyRootfs) { - checkNotNull(readonlyRootfs, "no readonlyRootfs was specified"); - hostConfig.withReadonlyRootfs(readonlyRootfs); - return this; - } - - @Override - public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { - checkNotNull(restartPolicy, "restartPolicy was not specified"); - this.hostConfig.withRestartPolicy(restartPolicy); - return this; - } - @Override public CreateContainerCmd withStdInOnce(Boolean stdInOnce) { checkNotNull(stdInOnce, "no stdInOnce was specified"); @@ -939,18 +518,6 @@ public CreateContainerCmd withTty(Boolean tty) { return this; } - @Override - public CreateContainerCmd withUlimits(Ulimit... ulimits) { - checkNotNull(ulimits, "no ulimits was specified"); - hostConfig.withUlimits(ulimits); - return this; - } - - @Override - public CreateContainerCmd withUlimits(List ulimits) { - checkNotNull(ulimits, "no ulimits was specified"); - return withUlimits(ulimits.toArray(new Ulimit[ulimits.size()])); - } @Override public CreateContainerCmd withUser(String user) { @@ -972,19 +539,6 @@ public CreateContainerCmd withVolumes(List volumes) { return withVolumes(volumes.toArray(new Volume[volumes.size()])); } - @Override - public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) { - checkNotNull(volumesFrom, "volumesFrom was not specified"); - this.hostConfig.withVolumesFrom(volumesFrom); - return this; - } - - @Override - public CreateContainerCmd withVolumesFrom(List volumesFrom) { - checkNotNull(volumesFrom, "volumesFrom was not specified"); - return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()])); - } - @Override public CreateContainerCmd withWorkingDir(String workingDir) { checkNotNull(workingDir, "workingDir was not specified"); @@ -992,19 +546,6 @@ public CreateContainerCmd withWorkingDir(String workingDir) { return this; } - @Override - public CreateContainerCmd withCgroupParent(final String cgroupParent) { - checkNotNull(cgroupParent, "cgroupParent was not specified"); - this.hostConfig.withCgroupParent(cgroupParent); - return this; - } - - @Override - public CreateContainerCmd withPidMode(String pidMode) { - checkNotNull(pidMode, "pidMode was not specified"); - this.hostConfig.withPidMode(pidMode); - return this; - } @Override public CreateContainerCmd withHostConfig(HostConfig hostConfig) { From 0b1850949c6eff18c9e260444b4616c8743c5053 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 2 Oct 2018 01:24:41 +0300 Subject: [PATCH 27/66] Fix import --- .../core/command/CreateContainerCmdImpl.java | 11 ----------- 1 file changed, 11 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 8ec2561eb..bb1dc1573 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -9,23 +9,12 @@ import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Capability; import com.github.dockerjava.api.model.ContainerNetwork; -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.LogConfig; -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.Ulimit; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; -import com.github.dockerjava.api.model.VolumesFrom; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; From d31db0618d10e5927f6ce248eda731f47fc739e2 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 2 Oct 2018 02:44:25 +0300 Subject: [PATCH 28/66] fix tests --- .../dockerjava/api/model/HostConfig.java | 30 +++-- .../dockerjava/cmd/CreateContainerCmdIT.java | 78 +++++++++---- .../cmd/DisconnectFromNetworkCmdIT.java | 4 +- .../dockerjava/cmd/ListContainersCmdIT.java | 9 +- .../dockerjava/cmd/StartContainerCmdIT.java | 104 +++++++++++++----- .../dockerjava/cmd/swarm/SwarmCmdIT.java | 15 ++- .../dockerjava/utils/RegistryUtils.java | 4 +- 7 files changed, 175 insertions(+), 69 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 f2ed6ab15..fbb30f187 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -242,6 +242,10 @@ public class HostConfig implements Serializable { @JsonProperty("Isolation") private String isolation; + public static HostConfig newHostConfig() { + return new HostConfig(); + } + @JsonIgnore public Bind[] getBinds() { return (binds == null) ? new Bind[0] : binds.getBinds(); @@ -531,6 +535,12 @@ public HostConfig withBinds(Binds binds) { return this; } + public HostConfig withBinds(Bind... binds) { + checkNotNull(binds, "binds was not specified"); + setBinds(binds); + return this; + } + /** * @see #blkioDeviceReadBps */ @@ -583,7 +593,7 @@ public HostConfig withBlkioWeightDevice(List blkioWeightDevice) { * 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 HostConfig withCapAdd(Capability[] capAdd) { + public HostConfig withCapAdd(Capability... capAdd) { this.capAdd = capAdd; return this; } @@ -591,7 +601,7 @@ public HostConfig withCapAdd(Capability[] capAdd) { /** * @see #capDrop */ - public HostConfig withCapDrop(Capability[] capDrop) { + public HostConfig withCapDrop(Capability... capDrop) { this.capDrop = capDrop; return this; } @@ -660,7 +670,7 @@ public HostConfig withDevices(List devices) { /** * @see #devices */ - public HostConfig withDevices(Device[] devices) { + public HostConfig withDevices(Device... devices) { this.devices = devices; return this; } @@ -676,7 +686,7 @@ public HostConfig withDiskQuota(Long diskQuota) { /** * @see #dns */ - public HostConfig withDns(String[] dns) { + public HostConfig withDns(String... dns) { this.dns = dns; return this; } @@ -689,7 +699,7 @@ public HostConfig withDns(List dns) { /** * @see #dnsSearch */ - public HostConfig withDnsSearch(String[] dnsSearch) { + public HostConfig withDnsSearch(String... dnsSearch) { this.dnsSearch = dnsSearch; return this; } @@ -702,7 +712,7 @@ public HostConfig withDnsSearch(List dnsSearch) { /** * @see #extraHosts */ - public HostConfig withExtraHosts(String[] extraHosts) { + public HostConfig withExtraHosts(String... extraHosts) { this.extraHosts = extraHosts; return this; } @@ -734,6 +744,12 @@ public HostConfig withLinks(List links) { return this; } + public HostConfig withLinks(Link... links) { + checkNotNull(links, "links was not specified"); + setLinks(links); + return this; + } + /** * @see #logConfig */ @@ -993,8 +1009,6 @@ public HostConfig withIsolation(String isolation) { return this; } - // end of auto-generated - @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index c49cbd8d4..f01e60019 100644 --- a/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -48,6 +48,7 @@ import static com.github.dockerjava.api.model.Capability.MKNOD; import static com.github.dockerjava.api.model.Capability.NET_ADMIN; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.cmd.CmdIT.FactoryType.JERSEY; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_23; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_24; @@ -160,7 +161,8 @@ public void createContainerWithVolumesFrom() throws DockerException { CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") .withName(container1Name) - .withBinds(bind1, bind2) + .withHostConfig(newHostConfig() + .withBinds(bind1, bind2)) .exec(); LOG.info("Created container1 {}", container1.toString()); @@ -175,7 +177,8 @@ public void createContainerWithVolumesFrom() throws DockerException { // create a second container with volumes from first container CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") - .withVolumesFrom(new VolumesFrom(container1Name)) + .withHostConfig(newHostConfig() + .withVolumesFrom(new VolumesFrom(container1Name))) .exec(); LOG.info("Created container2 {}", container2.toString()); @@ -285,7 +288,10 @@ public void createContainerWithLink() throws DockerException { assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withName(containerName2) - .withCmd("env").withLinks(new Link(containerName1, "container1Link")).exec(); + .withCmd("env") + .withHostConfig(newHostConfig() + .withLinks(new Link(containerName1, "container1Link"))) + .exec(); LOG.info("Created container {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); @@ -299,7 +305,8 @@ public void createContainerWithLink() throws DockerException { public void createContainerWithMemorySwappiness() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") - .withMemorySwappiness(42) + .withHostConfig(newHostConfig() + .withMemorySwappiness(42)) .exec(); assertThat(container.getId(), not(isEmptyString())); LOG.info("Created container {}", container.toString()); @@ -328,8 +335,9 @@ public void createContainerWithLinkInCustomNetwork() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withNetworkMode(networkName) .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withNetworkMode(networkName)) .withName(containerName1) .exec(); @@ -343,10 +351,12 @@ public void createContainerWithLinkInCustomNetwork() throws DockerException { assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withNetworkMode(networkName) + .withHostConfig(newHostConfig() + .withNetworkMode(networkName) + .withLinks(new Link(containerName1, containerName1 + "Link")) + ) .withName(containerName2) .withCmd("env") - .withLinks(new Link(containerName1, containerName1 + "Link")) .exec(); LOG.info("Created container {}", container2.toString()); @@ -377,10 +387,11 @@ public void createContainerWithCustomIp() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withNetworkMode(networkName) .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withNetworkMode(networkName)) .withName(containerName1) - .withIpv4Address(subnetPrefix +".100") + .withIpv4Address(subnetPrefix + ".100") .exec(); assertThat(container.getId(), not(isEmptyString())); @@ -410,8 +421,9 @@ public void createContainerWithAlias() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withNetworkMode(networkName) .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withNetworkMode(networkName)) .withName(containerName1) .withAliases("server" + dockerRule.getKind()) .exec(); @@ -430,8 +442,11 @@ public void createContainerWithAlias() throws DockerException { @Test public void createContainerWithCapAddAndCapDrop() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCapAdd(NET_ADMIN) - .withCapDrop(MKNOD).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withHostConfig(newHostConfig() + .withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -451,7 +466,9 @@ public void createContainerWithDns() throws DockerException { String anotherDnsServer = "8.8.4.4"; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withDns(aDnsServer, anotherDnsServer).exec(); + .withHostConfig(newHostConfig() + .withDns(aDnsServer, anotherDnsServer)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -487,7 +504,9 @@ public void createContainerWithExtraHosts() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withName("containerextrahosts" + dockerRule.getKind()) - .withExtraHosts(extraHosts).exec(); + .withHostConfig(newHostConfig() + .withExtraHosts(extraHosts)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -503,7 +522,8 @@ public void createContainerWithExtraHosts() throws DockerException { public void createContainerWithDevices() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); + .withHostConfig(newHostConfig() + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))).exec(); LOG.info("Created container {}", container.toString()); @@ -517,7 +537,7 @@ public void createContainerWithDevices() throws DockerException { @Test public void createContainerWithPortBindings() throws DockerException { - int baseport = getFactoryType() == FactoryType.JERSEY? 11000: 12000; + int baseport = getFactoryType() == FactoryType.JERSEY ? 11000 : 12000; ExposedPort tcp22 = ExposedPort.tcp(22); ExposedPort tcp23 = ExposedPort.tcp(23); @@ -528,7 +548,8 @@ public void createContainerWithPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(baseport + 24)); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + .withExposedPorts(tcp22, tcp23).withHostConfig(newHostConfig() + .withPortBindings(portBindings)).exec(); LOG.info("Created container {}", container.toString()); @@ -581,7 +602,8 @@ public void createContainerWithLinking() throws DockerException { CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") .withName(containerName2) - .withLinks(new Link(containerName1, containerName1 + "Link")).exec(); + .withHostConfig(newHostConfig() + .withLinks(new Link(containerName1, containerName1 + "Link"))).exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); @@ -608,7 +630,8 @@ public void createContainerWithRestartPolicy() throws DockerException { RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") - .withRestartPolicy(restartPolicy).exec(); + .withHostConfig(newHostConfig() + .withRestartPolicy(restartPolicy)).exec(); LOG.info("Created container {}", container.toString()); @@ -623,7 +646,8 @@ public void createContainerWithRestartPolicy() throws DockerException { public void createContainerWithPidMode() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withPidMode("host").exec(); + .withHostConfig(newHostConfig() + .withPidMode("host")).exec(); LOG.info("Created container {}", container.toString()); @@ -644,7 +668,8 @@ public void createContainerWithPidMode() throws DockerException { public void createContainerWithNetworkMode() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withNetworkMode("host").exec(); + .withHostConfig(newHostConfig() + .withNetworkMode("host")).exec(); LOG.info("Created container {}", container.toString()); @@ -677,7 +702,8 @@ public void createContainerWithULimits() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withName(containerName) - .withUlimits(ulimits).exec(); + .withHostConfig(newHostConfig() + .withUlimits(ulimits)).exec(); LOG.info("Created container {}", container.toString()); @@ -720,7 +746,10 @@ public void createContainerWithLabels() throws DockerException { public void createContainerWithLogConfig() throws DockerException { LogConfig logConfig = new LogConfig(LogConfig.LoggingType.NONE, null); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withLogConfig(logConfig).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withHostConfig(newHostConfig() + .withLogConfig(logConfig)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -789,7 +818,8 @@ public void onNext(Frame item) { @Test public void createContainerWithCgroupParent() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCgroupParent("/parent").exec(); + .withHostConfig(newHostConfig() + .withCgroupParent("/parent")).exec(); LOG.info("Created container {}", container.toString()); diff --git a/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java b/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java index 51faa2ea8..220ad89ef 100644 --- a/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java @@ -5,6 +5,7 @@ import com.github.dockerjava.api.model.Network; import org.junit.Test; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.junit.DockerAssume.assumeNotSwarm; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -40,8 +41,9 @@ public void forceDisconnectFromNetwork() throws InterruptedException { CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("testNetwork2" + dockerRule.getKind()).exec(); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withNetworkMode("testNetwork2" + dockerRule.getKind()) .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withNetworkMode("testNetwork2" + dockerRule.getKind())) .exec(); dockerRule.getClient().startContainerCmd(container.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index b5210c171..098c592b8 100644 --- a/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.command.PullImageResultCallback; import com.github.dockerjava.core.command.WaitContainerResultCallback; @@ -257,7 +258,9 @@ public void testVolumeFilter() throws Exception { id = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) - .withBinds(new Bind("TestFilterVolume", new Volume("/test"))) + .withHostConfig(HostConfig.newHostConfig() + .withBinds(new Bind("TestFilterVolume", new Volume("/test"))) + ) .exec() .getId(); @@ -285,7 +288,9 @@ public void testNetworkFilter() throws Exception { id = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) - .withNetworkMode("TestFilterNetwork") + .withHostConfig(HostConfig.newHostConfig() + .withNetworkMode("TestFilterNetwork") + ) .exec() .getId(); diff --git a/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java index f55e43247..bd0a53f50 100644 --- a/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java @@ -10,6 +10,7 @@ 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.Ports.Binding; @@ -29,6 +30,7 @@ import static com.github.dockerjava.api.model.AccessMode.ro; import static com.github.dockerjava.api.model.Capability.MKNOD; import static com.github.dockerjava.api.model.Capability.NET_ADMIN; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.junit.DockerMatchers.mountedVolumes; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -53,8 +55,12 @@ public void startContainerWithVolumes() throws DockerException { Volume volume2 = new Volume("/opt/webapp2"); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withVolumes(volume1, volume2) - .withCmd("true").withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)) + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withVolumes(volume1, volume2) + .withCmd("true") + .withHostConfig(newHostConfig() + .withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)) + ) .exec(); LOG.info("Created container {}", container.toString()); @@ -95,7 +101,9 @@ public void startContainerWithVolumesFrom() throws DockerException { CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") .withName(container1Name) - .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + .withHostConfig(newHostConfig() + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2))) + .exec(); LOG.info("Created container1 {}", container1.toString()); dockerRule.getClient().startContainerCmd(container1.getId()).exec(); @@ -107,7 +115,9 @@ public void startContainerWithVolumesFrom() throws DockerException { assertThat(inspectContainerResponse1, mountedVolumes(containsInAnyOrder(volume1, volume2))); CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withVolumesFrom(new VolumesFrom(container1Name)).exec(); + .withHostConfig(newHostConfig() + .withVolumesFrom(new VolumesFrom(container1Name))) + .exec(); LOG.info("Created container2 {}", container2.toString()); dockerRule.getClient().startContainerCmd(container2.getId()).exec(); @@ -125,8 +135,11 @@ public void startContainerWithDns() throws DockerException { String aDnsServer = "8.8.8.8"; String anotherDnsServer = "8.8.4.4"; - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withDns(aDnsServer, anotherDnsServer).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("true") + .withHostConfig(newHostConfig() + .withDns(aDnsServer, anotherDnsServer)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -145,8 +158,11 @@ public void startContainerWithDnsSearch() throws DockerException { String dnsSearch = "example.com"; - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withDnsSearch(dnsSearch).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("true") + .withHostConfig(newHostConfig() + .withDnsSearch(dnsSearch)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -163,7 +179,7 @@ public void startContainerWithDnsSearch() throws DockerException { @Test public void startContainerWithPortBindings() throws DockerException { - int baseport = getFactoryType() == FactoryType.JERSEY? 13000: 14000; + int baseport = getFactoryType() == FactoryType.JERSEY ? 13000 : 14000; ExposedPort tcp22 = ExposedPort.tcp(22); ExposedPort tcp23 = ExposedPort.tcp(23); @@ -173,8 +189,12 @@ public void startContainerWithPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(baseport + 23)); portBindings.bind(tcp23, Binding.bindPort(baseport + 24)); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("true") + .withExposedPorts(tcp22, tcp23) + .withHostConfig(newHostConfig() + .withPortBindings(portBindings)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -210,7 +230,11 @@ public void startContainerWithRandomPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.empty()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).exec(); + .withExposedPorts(tcp22, tcp23) + .withHostConfig(newHostConfig() + .withPortBindings(portBindings) + .withPublishAllPorts(true)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -241,7 +265,10 @@ public void startContainerWithConflictingPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(11022)); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + .withExposedPorts(tcp22, tcp23) + .withHostConfig(newHostConfig() + .withPortBindings(portBindings)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -283,8 +310,12 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); } - CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container2Name).withLinks(new Link(container1Name, container1Name + "Link")).exec(); + CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sleep", "9999") + .withName(container2Name) + .withHostConfig(newHostConfig() + .withLinks(new Link(container1Name, container1Name + "Link"))) + .exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); @@ -299,7 +330,7 @@ public void startContainerWithLinkingDeprecated() throws DockerException { 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(container1Name, + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[]{new Link(container1Name, container1Name + "Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/" + container2Name)); @@ -343,7 +374,10 @@ public void startContainerWithLinking() throws DockerException { } CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container2Name).withLinks(new Link(container1Name, container1Name + "Link")).exec(); + .withName(container2Name) + .withHostConfig(newHostConfig() + .withLinks(new Link(container1Name, container1Name + "Link"))) + .exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); @@ -358,7 +392,7 @@ public void startContainerWithLinking() throws DockerException { 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(container1Name, + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[]{new Link(container1Name, container1Name + "Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/" + container2Name)); @@ -371,7 +405,7 @@ public void startContainerWithLinking() throws DockerException { @Test public void startContainer() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd(new String[] {"top"}) + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd(new String[]{"top"}) .exec(); LOG.info("Created container {}", container.toString()); @@ -400,7 +434,7 @@ public void startContainer() throws DockerException { @Test(expected = NotFoundException.class) public void testStartNonExistingContainer() throws DockerException { - dockerRule.getClient().startContainerCmd("non-existing").exec(); + dockerRule.getClient().startContainerCmd("non-existing").exec(); } /** @@ -412,8 +446,11 @@ public void testStartNonExistingContainer() throws DockerException { @Test public void startContainerWithNetworkMode() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withNetworkMode("host").exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("true") + .withHostConfig(newHostConfig() + .withNetworkMode("host")) + .exec(); LOG.info("Created container {}", container.toString()); @@ -431,8 +468,12 @@ public void startContainerWithNetworkMode() throws DockerException { @Test public void startContainerWithCapAddAndCapDrop() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withCapAdd(NET_ADMIN).withCapDrop(MKNOD).exec(); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -453,7 +494,9 @@ public void startContainerWithCapAddAndCapDrop() throws DockerException { public void startContainerWithDevices() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); + .withHostConfig(newHostConfig() + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))) + .exec(); LOG.info("Created container {}", container.toString()); @@ -473,7 +516,9 @@ public void startContainerWithDevices() throws DockerException { public void startContainerWithExtraHosts() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withExtraHosts("dockerhost:127.0.0.1").exec(); + .withHostConfig(newHostConfig() + .withExtraHosts("dockerhost:127.0.0.1")) + .exec(); LOG.info("Created container {}", container.toString()); @@ -495,7 +540,8 @@ public void startContainerWithRestartPolicy() throws DockerException { RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withRestartPolicy(restartPolicy).exec(); + .withHostConfig(newHostConfig() + .withRestartPolicy(restartPolicy)).exec(); LOG.info("Created container {}", container.toString()); @@ -516,7 +562,9 @@ public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerExceptio String dnsServer = "8.8.8.8"; // prepare a container with custom DNS - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withDns(dnsServer) + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withHostConfig(newHostConfig() + .withDns(dnsServer)) .withCmd("true").exec(); LOG.info("Created container {}", container.toString()); diff --git a/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java b/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java index 112a8e689..79759cdd2 100644 --- a/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java @@ -7,6 +7,7 @@ import com.github.dockerjava.api.exception.NotAcceptableException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.cmd.CmdIT; @@ -22,6 +23,7 @@ import org.junit.BeforeClass; import org.junit.experimental.categories.Category; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_24; import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.junit.Assume.assumeThat; @@ -102,14 +104,17 @@ protected DockerClient startDockerInDocker() { int port = PORT_START + (numberOfDockersInDocker - 1); CreateContainerResponse response = dockerRule.getClient() .createContainerCmd(DOCKER_IN_DOCKER_IMAGE_REPOSITORY + ":" + DOCKER_IN_DOCKER_IMAGE_TAG) - .withPrivileged(true) + .withHostConfig(newHostConfig() + .withPrivileged(true) + .withNetworkMode(NETWORK_NAME) + .withPortBindings(new PortBinding( + Ports.Binding.bindIpAndPort("127.0.0.1", port), + ExposedPort.tcp(2375) + ))) .withName(name) - .withNetworkMode(NETWORK_NAME) .withAliases(name) - .withPortBindings(new PortBinding( - Ports.Binding.bindIpAndPort("127.0.0.1", port), - ExposedPort.tcp(2375))) .exec(); + dockerRule.getClient().startContainerCmd(response.getId()).exec(); return initializeDockerClient(port); diff --git a/src/test/java/com/github/dockerjava/utils/RegistryUtils.java b/src/test/java/com/github/dockerjava/utils/RegistryUtils.java index ea78795a2..e0251023c 100644 --- a/src/test/java/com/github/dockerjava/utils/RegistryUtils.java +++ b/src/test/java/com/github/dockerjava/utils/RegistryUtils.java @@ -15,6 +15,7 @@ import java.io.File; import java.util.concurrent.TimeUnit; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.junit.DockerRule.DEFAULT_IMAGE; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; @@ -64,7 +65,8 @@ public static synchronized AuthConfig runPrivateRegistry(DockerClient dockerClie CreateContainerResponse testregistry = dockerClient .createContainerCmd(imageName + ":2") .withName(containerName) - .withPortBindings(new PortBinding(Ports.Binding.bindPort(port), ExposedPort.tcp(5000))) + .withHostConfig(newHostConfig() + .withPortBindings(new PortBinding(Ports.Binding.bindPort(port), ExposedPort.tcp(5000)))) .withEnv("REGISTRY_AUTH=htpasswd", "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm", "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd", "REGISTRY_LOG_LEVEL=debug", "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt", "REGISTRY_HTTP_TLS_KEY=/certs/domain.key") From 935981c69e6380437b3c80fba90ee26c8410c9d4 Mon Sep 17 00:00:00 2001 From: Artem Krivonozhko Date: Thu, 1 Nov 2018 15:13:17 +0300 Subject: [PATCH 29/66] Add missing import line for BuildImageResultCallback --- .../com/github/dockerjava/core/command/DockerfileFixture.java | 1 + 1 file changed, 1 insertion(+) 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 874684e3e..b17947c30 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.command.BuildImageResultCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 1d13e5b216f0f0938ab00d05ecdce29fe00a115d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 25 Nov 2018 03:50:18 +0300 Subject: [PATCH 30/66] Update versions --- pom.xml | 8 ++++---- .../github/dockerjava/api/model/ServiceModeConfig.java | 2 +- .../java/com/github/dockerjava/api/model/VersionTest.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 7f9cefc94..b04042770 100644 --- a/pom.xml +++ b/pom.xml @@ -58,9 +58,9 @@ 1.7 2.27 - 2.6.7 + 2.9.7 4.5.6 - 1.17 + 1.18 1.11 2.6 2.6 @@ -72,7 +72,7 @@ 1.2.3 - 4.1.27.Final + 4.1.31.Final 1.3 1.8 2.3.3 @@ -164,7 +164,7 @@ org.slf4j jcl-over-slf4j - 1.7.21 + ${slf4j-api.version} diff --git a/src/main/java/com/github/dockerjava/api/model/ServiceModeConfig.java b/src/main/java/com/github/dockerjava/api/model/ServiceModeConfig.java index d2ffe3d95..9aeec2e1c 100644 --- a/src/main/java/com/github/dockerjava/api/model/ServiceModeConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ServiceModeConfig.java @@ -14,7 +14,7 @@ * @since {@link RemoteApiVersion#VERSION_1_24} */ public class ServiceModeConfig implements Serializable { - public static final Long serialVersionUID = 1L; + public static final long serialVersionUID = 1L; /** * @since 1.24 diff --git a/src/test/java/com/github/dockerjava/api/model/VersionTest.java b/src/test/java/com/github/dockerjava/api/model/VersionTest.java index 606420b3c..1c3e55c5c 100644 --- a/src/test/java/com/github/dockerjava/api/model/VersionTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VersionTest.java @@ -24,7 +24,7 @@ public class VersionTest { @Test public void testSerDer1() throws Exception { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Version.class); + final JavaType type = mapper.getTypeFactory().constructType(Version.class); final Version version = testRoundTrip(RemoteApiVersion.VERSION_1_22, "/version/1.json", @@ -46,7 +46,7 @@ public void testSerDer1() throws Exception { @Test public void version_1_38() throws Exception { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Version.class); + final JavaType type = mapper.getTypeFactory().constructType(Version.class); final Version version = testRoundTrip(RemoteApiVersion.VERSION_1_38, "/version/lcow.json", From ab1a0696b4856667fc9ef3e770cfafb83b57bee7 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 25 Nov 2018 05:42:56 +0300 Subject: [PATCH 31/66] Fix tests --- .../api/command/InspectContainerResponseTest.java | 4 ++-- .../dockerjava/api/command/InspectExecResponseTest.java | 2 +- .../com/github/dockerjava/api/model/AuthConfigTest.java | 8 ++++---- .../java/com/github/dockerjava/api/model/EventsTest.java | 2 +- .../com/github/dockerjava/api/model/StatisticsTest.java | 2 +- .../com/github/dockerjava/cmd/UpdateContainerCmdIT.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) 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 ee38b70d0..6b4a5ec72 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -68,7 +68,7 @@ public void roundTrip_full() throws IOException { public void roundTrip_full_healthcheck() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(InspectContainerResponse.class); + final JavaType type = mapper.getTypeFactory().constructType(InspectContainerResponse.class); final InspectContainerResponse response = testRoundTrip(RemoteApiVersion.VERSION_1_24, "/containers/inspect/1.json", @@ -139,7 +139,7 @@ public void roundTrip_empty() throws IOException { public void inspect_windows_container() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(InspectContainerResponse.class); + final JavaType type = mapper.getTypeFactory().constructType(InspectContainerResponse.class); final InspectContainerResponse response = testRoundTrip(RemoteApiVersion.VERSION_1_38, "/containers/inspect/lcow.json", diff --git a/src/test/java/com/github/dockerjava/api/command/InspectExecResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectExecResponseTest.java index 7290f121b..9c2641885 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectExecResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectExecResponseTest.java @@ -21,7 +21,7 @@ public class InspectExecResponseTest { @Test public void test_1_22_SerDer1() throws Exception { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(InspectExecResponse.class); + final JavaType type = mapper.getTypeFactory().constructType(InspectExecResponse.class); final InspectExecResponse execResponse = testRoundTrip(RemoteApiVersion.VERSION_1_22, "/exec/ID/1.json", diff --git a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index add1e7a25..d470ff1d7 100644 --- a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -25,7 +25,7 @@ public void defaultServerAddress() throws Exception { @Test public void serderDocs1() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final JavaType type = mapper.getTypeFactory().constructType(AuthConfig.class); final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_22, "/other/AuthConfig/docs1.json", @@ -47,7 +47,7 @@ public void serderDocs1() throws IOException { @Test public void serderDocs2() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final JavaType type = mapper.getTypeFactory().constructType(AuthConfig.class); final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_22, "/other/AuthConfig/docs2.json", @@ -66,7 +66,7 @@ public void serderDocs2() throws IOException { @Test public void compatibleWithIdentitytoken() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final JavaType type = mapper.getTypeFactory().constructType(AuthConfig.class); final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_23, "/other/AuthConfig/docs1.json", type @@ -83,7 +83,7 @@ public void compatibleWithIdentitytoken() throws IOException { @Test public void shouldNotFailWithStackOrchestratorInConfig() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(AuthConfig.class); + final JavaType type = mapper.getTypeFactory().constructType(AuthConfig.class); final AuthConfig authConfig = testRoundTrip(RemoteApiVersion.VERSION_1_25, "/other/AuthConfig/orchestrators.json", type diff --git a/src/test/java/com/github/dockerjava/api/model/EventsTest.java b/src/test/java/com/github/dockerjava/api/model/EventsTest.java index c517b80a9..05b6a7a1d 100644 --- a/src/test/java/com/github/dockerjava/api/model/EventsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/EventsTest.java @@ -24,7 +24,7 @@ public class EventsTest { @Test public void serderDocs1() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Event.class); + final JavaType type = mapper.getTypeFactory().constructType(Event.class); final Event event = testRoundTrip(RemoteApiVersion.VERSION_1_24, "/events/docs1.json", diff --git a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java index 6082731af..261fe7d1b 100644 --- a/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/StatisticsTest.java @@ -23,7 +23,7 @@ public class StatisticsTest { @Test public void serderJson1() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Statistics.class); + final JavaType type = mapper.getTypeFactory().constructType(Statistics.class); final Statistics statistics = testRoundTrip(RemoteApiVersion.VERSION_1_27, "containers/container/stats/stats1.json", diff --git a/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java index d63f6aaa2..238a0da73 100644 --- a/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java @@ -84,7 +84,7 @@ public void updateContainer() throws DockerException, IOException { @Test public void serDerDocs1() throws IOException { final ObjectMapper mapper = new ObjectMapper(); - final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(UpdateContainerCmdImpl.class); + final JavaType type = mapper.getTypeFactory().constructType(UpdateContainerCmdImpl.class); final UpdateContainerCmdImpl upd = testRoundTrip(VERSION_1_22, "/containers/container/update/docs.json", From d394513adc12ea094814437fee5c89d4efafbd72 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 27 Sep 2018 03:37:09 +0300 Subject: [PATCH 32/66] Fixup --- .../dockerjava/api/command/BuildImageCmd.java | 17 ++--- .../core/exec/BuildImageCmdExec.java | 4 +- .../core/util/CacheFromEncoder.java | 5 +- .../dockerjava/core/util/FiltersEncoder.java | 10 +-- .../core/util/ServiceFiltersBuilder.java | 67 ------------------- .../dockerjava/jaxrs/BuildImageCmdExec.java | 1 - 6 files changed, 19 insertions(+), 85 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/core/util/ServiceFiltersBuilder.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 9cf3296ce..e38d1c1d5 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -19,7 +19,7 @@ * TODO: http://docs.docker.com/reference/builder/#dockerignore * * @see build-image-from-a-dockerfile + * href="https://docs.docker.com/reference/api/docker_remote_api_v1.20/#build-image-from-a-dockerfile">build-image-from-a-dockerfile */ public interface BuildImageCmd extends AsyncDockerCmd { @@ -45,6 +45,7 @@ public interface BuildImageCmd extends AsyncDockerCmd getBuildArgs(); /** - *@since {@link RemoteApiVersion#VERSION_1_22} + * @since {@link RemoteApiVersion#VERSION_1_22} */ @CheckForNull Long getShmsize(); @@ -135,7 +136,7 @@ public interface BuildImageCmd extends AsyncDockerCmd)} + * specified so use {@link BuildImageCmd#withTags(java.util.Set)} */ @Deprecated BuildImageCmd withTag(String tag); @@ -185,17 +186,17 @@ public interface BuildImageCmd extends AsyncDockerCmd labels); /** - *@since {@link RemoteApiVersion#VERSION_1_25} + * @since {@link RemoteApiVersion#VERSION_1_25} */ BuildImageCmd withNetworkMode(String networkMode); diff --git a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java index d229a9732..ef7fb9e5d 100644 --- a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java @@ -9,10 +9,10 @@ import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.MediaType; import com.github.dockerjava.core.WebTarget; -import com.github.dockerjava.core.util.CacheFromEncoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.github.dockerjava.core.util.CacheFromEncoder.jsonEncode; import static org.apache.commons.lang.StringUtils.isNotBlank; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements @@ -59,7 +59,7 @@ protected Void execute0(BuildImageCmd command, ResultCallback } if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) { - webTarget = webTarget.queryParam("cachefrom", CacheFromEncoder.jsonEncode(command.getCacheFrom())); + webTarget = webTarget.queryParam("cachefrom", jsonEncode(command.getCacheFrom())); } if (command.getRemote() != null) { diff --git a/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java b/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java index 59da5e406..2a24f76ae 100644 --- a/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java +++ b/src/main/java/com/github/dockerjava/core/util/CacheFromEncoder.java @@ -11,15 +11,16 @@ * JSON Encoder for the docker --cache-from parameter. */ public class CacheFromEncoder { + private CacheFromEncoder() { } - private static final ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Collection.class, + private static final ObjectMapper MAPPER = new JacksonJaxbJsonProvider().locateMapper(Collection.class, MediaType.APPLICATION_JSON_TYPE); public static String jsonEncode(Collection imageIds) { try { - return OBJECT_MAPPER.writeValueAsString(imageIds); + return MAPPER.writeValueAsString(imageIds); } catch (JsonProcessingException e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java index 280daad45..fd4c0d5ab 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -13,20 +13,20 @@ * JSON Encoder for docker filters. * * @author Carlos Sanchez - * */ public class FiltersEncoder { + private FiltersEncoder() { } - private static final ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, - MediaType.APPLICATION_JSON_TYPE); + private static final ObjectMapper MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, MediaType.APPLICATION_JSON_TYPE); - public static String jsonEncode(Map> filters) { + public static String jsonEncode(Map> mapStringListString) { try { - return OBJECT_MAPPER.writeValueAsString(filters); + return MAPPER.writeValueAsString(mapStringListString); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } + } diff --git a/src/main/java/com/github/dockerjava/core/util/ServiceFiltersBuilder.java b/src/main/java/com/github/dockerjava/core/util/ServiceFiltersBuilder.java deleted file mode 100644 index db52df73f..000000000 --- a/src/main/java/com/github/dockerjava/core/util/ServiceFiltersBuilder.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.dockerjava.core.util; - -import org.apache.commons.lang.builder.EqualsBuilder; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Representation of filters to service lists. - */ -@Deprecated -public class ServiceFiltersBuilder { - - private Map> filters = new HashMap<>(); - - public ServiceFiltersBuilder() { - } - - public ServiceFiltersBuilder withFilter(String key, String... value) { - filters.put(key, Arrays.asList(value)); - return this; - } - - public ServiceFiltersBuilder withFilter(String key, List value) { - filters.put(key, value); - return this; - } - - public List getFilter(String key) { - return filters.get(key); - } - - public ServiceFiltersBuilder withIds(List ids) { - withFilter("id", ids); - return this; - } - - public List getIds() { - return getFilter("id"); - } - - public ServiceFiltersBuilder withNames(List names) { - withFilter("name", names); - return this; - } - - public List getNames() { - return getFilter("names"); - } - - @Override - public boolean equals(Object o) { - return EqualsBuilder.reflectionEquals(this, o); - - } - - @Override - public int hashCode() { - return filters.hashCode(); - } - - public Map> build() { - return filters; - } -} diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index a741e0a61..9aab5dffa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -7,7 +7,6 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.core.util.CacheFromEncoder; From 536805767df705c384495af890d761064c42a6df Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 26 Nov 2018 21:02:53 +0300 Subject: [PATCH 33/66] Upd apis (#1135) * WIP * Update part of apis to 1.37 * Fix test * Fix test --- .../api/command/CreateContainerCmd.java | 184 +++---- .../dockerjava/api/model/AuthConfig.java | 6 +- .../dockerjava/api/model/BlkioRateDevice.java | 54 +++ .../api/model/BlkioWeightDevice.java | 54 +++ .../github/dockerjava/api/model/Device.java | 12 +- .../dockerjava/api/model/HealthCheck.java | 30 +- .../dockerjava/api/model/HostConfig.java | 438 ++++++++++++----- .../dockerjava/api/model/Isolation.java | 41 ++ .../dockerjava/api/model/LogConfig.java | 63 +-- .../github/dockerjava/api/model/Ulimit.java | 2 - .../core/command/CreateContainerCmdImpl.java | 454 ++++++++++-------- .../command/InspectContainerResponseTest.java | 3 +- .../dockerjava/cmd/CreateContainerCmdIT.java | 43 +- .../cmd/DisconnectFromNetworkCmdIT.java | 2 +- .../dockerjava/cmd/ListContainersCmdIT.java | 12 +- .../dockerjava/cmd/StartContainerCmdIT.java | 46 +- .../dockerjava/cmd/UpdateContainerCmdIT.java | 4 +- .../dockerjava/cmd/swarm/SwarmCmdIT.java | 8 +- .../inspectContainerResponse_full_1_26a.json | 2 +- 19 files changed, 942 insertions(+), 516 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java create mode 100644 src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java create mode 100644 src/main/java/com/github/dockerjava/api/model/Isolation.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 63d53563f..4fa5dd2e2 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; @@ -16,171 +17,192 @@ public interface CreateContainerCmd extends SyncDockerCmd getAliases(); + /** + * Add network-scoped alias for the container + * + * @param aliases on ore more aliases + */ + CreateContainerCmd withAliases(List aliases); + + /** + * Add network-scoped alias for the container + * + * @param aliases on ore more aliases + */ + CreateContainerCmd withAliases(String... aliases); + @CheckForNull String[] getCmd(); + CreateContainerCmd withCmd(String... cmd); + + CreateContainerCmd withCmd(List cmd); + + @CheckForNull + HealthCheck getHealthcheck(); + + CreateContainerCmd withHealthcheck(HealthCheck healthCheck); + + @CheckForNull + Boolean getArgsEscaped(); + + CreateContainerCmd withArgsEscaped(Boolean argsEscaped); + @CheckForNull String getDomainName(); + CreateContainerCmd withDomainName(String domainName); + @CheckForNull String[] getEntrypoint(); + CreateContainerCmd withEntrypoint(String... entrypoint); + + CreateContainerCmd withEntrypoint(List entrypoint); + @CheckForNull String[] getEnv(); + CreateContainerCmd withEnv(String... env); + + CreateContainerCmd withEnv(List env); + @CheckForNull ExposedPort[] getExposedPorts(); + CreateContainerCmd withExposedPorts(List exposedPorts); + + CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); + @CheckForNull String getStopSignal(); + CreateContainerCmd withStopSignal(String stopSignal); + + @CheckForNull + Integer getStopTimeout(); + + CreateContainerCmd withStopTimeout(Integer stopTimeout); + @CheckForNull String getHostName(); + CreateContainerCmd withHostName(String hostName); + @CheckForNull String getImage(); + CreateContainerCmd withImage(String image); + @CheckForNull String getIpv4Address(); + CreateContainerCmd withIpv4Address(String ipv4Address); + @CheckForNull String getIpv6Address(); + CreateContainerCmd withIpv6Address(String ipv6Address); + @CheckForNull Map getLabels(); + CreateContainerCmd withLabels(Map labels); + @CheckForNull String getMacAddress(); + CreateContainerCmd withMacAddress(String macAddress); + @CheckForNull String getName(); + CreateContainerCmd withName(String name); + @CheckForNull String[] getPortSpecs(); + CreateContainerCmd withPortSpecs(String... portSpecs); + + CreateContainerCmd withPortSpecs(List portSpecs); + @CheckForNull String getUser(); + CreateContainerCmd withUser(String user); + @CheckForNull Volume[] getVolumes(); + CreateContainerCmd withVolumes(Volume... volumes); + + CreateContainerCmd withVolumes(List volumes); + @CheckForNull String getWorkingDir(); + CreateContainerCmd withWorkingDir(String workingDir); + @CheckForNull Boolean isAttachStderr(); + CreateContainerCmd withAttachStderr(Boolean attachStderr); + @CheckForNull Boolean isAttachStdin(); + CreateContainerCmd withAttachStdin(Boolean attachStdin); + @CheckForNull Boolean isAttachStdout(); + CreateContainerCmd withAttachStdout(Boolean attachStdout); + @CheckForNull Boolean isNetworkDisabled(); + CreateContainerCmd withNetworkDisabled(Boolean disableNetwork); + @CheckForNull Boolean isStdInOnce(); + CreateContainerCmd withStdInOnce(Boolean stdInOnce); + @CheckForNull Boolean isStdinOpen(); - @CheckForNull - HostConfig getHostConfig(); + CreateContainerCmd withStdinOpen(Boolean stdinOpen); @CheckForNull Boolean isTty(); - /** - * While using swarm classic, you can provide an optional auth config which will be used to pull images from a private registry, - * if the swarm node does not already have the docker image. - * Note: This option does not have any effect in normal docker - * @param authConfig The optional auth config - */ - CreateContainerCmd withAuthConfig(AuthConfig authConfig); - - /** - * Add network-scoped alias for the container - * @param aliases on ore more aliases - */ - CreateContainerCmd withAliases(String... aliases); - - /** - * Add network-scoped alias for the container - * @param aliases on ore more aliases - */ - CreateContainerCmd withAliases(List aliases); - - CreateContainerCmd withAttachStderr(Boolean attachStderr); - - CreateContainerCmd withAttachStdin(Boolean attachStdin); - - CreateContainerCmd withAttachStdout(Boolean attachStdout); - - CreateContainerCmd withCmd(String... cmd); - - CreateContainerCmd withCmd(List cmd); - - CreateContainerCmd withDomainName(String domainName); - - CreateContainerCmd withEntrypoint(String... entrypoint); - - CreateContainerCmd withEntrypoint(List entrypoint); - - CreateContainerCmd withEnv(String... env); - - CreateContainerCmd withEnv(List env); - - CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); - - CreateContainerCmd withStopSignal(String stopSignal); - - CreateContainerCmd withExposedPorts(List exposedPorts); - - CreateContainerCmd withHostName(String hostName); - - CreateContainerCmd withImage(String image); - - CreateContainerCmd withIpv4Address(String ipv4Address); - - CreateContainerCmd withIpv6Address(String ipv6Address); - - CreateContainerCmd withLabels(Map labels); - - CreateContainerCmd withMacAddress(String macAddress); - - CreateContainerCmd withName(String name); - - CreateContainerCmd withNetworkDisabled(Boolean disableNetwork); - - CreateContainerCmd withPortSpecs(String... portSpecs); - - CreateContainerCmd withPortSpecs(List portSpecs); - - CreateContainerCmd withStdInOnce(Boolean stdInOnce); - - CreateContainerCmd withStdinOpen(Boolean stdinOpen); - CreateContainerCmd withTty(Boolean tty); - CreateContainerCmd withUser(String user); - - CreateContainerCmd withVolumes(Volume... volumes); + @CheckForNull + List getOnBuild(); - CreateContainerCmd withVolumes(List volumes); + CreateContainerCmd withOnBuild(List onBuild); - CreateContainerCmd withWorkingDir(String workingDir); + @CheckForNull + HostConfig getHostConfig(); CreateContainerCmd withHostConfig(HostConfig hostConfig); /** - * @throws NotFoundException - * No such container - * @throws ConflictException - * Named container already exists + * @throws NotFoundException No such container + * @throws ConflictException Named container already exists */ @Override CreateContainerResponse exec() throws NotFoundException, ConflictException; 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 72bf4ef04..d2ecd7d90 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -21,13 +21,13 @@ public class AuthConfig implements Serializable { */ public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/"; - @JsonProperty + @JsonProperty("username") private String username; - @JsonProperty + @JsonProperty("password") private String password; - @JsonProperty + @JsonProperty("email") private String email; @JsonProperty("serveraddress") diff --git a/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java b/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java new file mode 100644 index 000000000..4e171417f --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java @@ -0,0 +1,54 @@ +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 org.apache.commons.lang.builder.ToStringBuilder; + +import java.io.Serializable; + +import static org.apache.commons.lang.builder.ToStringStyle.SHORT_PREFIX_STYLE; + +public class BlkioRateDevice implements Serializable { + public static final long serialVersionUID = 1L; + + @JsonProperty("Path") + private String path; + + @JsonProperty("Rate") + private Long rate; + + public String getPath() { + return path; + } + + public BlkioRateDevice withPath(String path) { + this.path = path; + return this; + } + + public Long getRate() { + return rate; + } + + public BlkioRateDevice withRate(Long rate) { + this.rate = rate; + return this; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, SHORT_PREFIX_STYLE); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java b/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java new file mode 100644 index 000000000..1c8e5cd08 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java @@ -0,0 +1,54 @@ +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 org.apache.commons.lang.builder.ToStringBuilder; + +import java.io.Serializable; + +import static org.apache.commons.lang.builder.ToStringStyle.SHORT_PREFIX_STYLE; + +public class BlkioWeightDevice implements Serializable { + public static final long serialVersionUID = 1L; + + @JsonProperty("Path") + private String path; + + @JsonProperty("Weight") + private Integer weight; + + public String getPath() { + return path; + } + + public BlkioWeightDevice withPath(String path) { + this.path = path; + return this; + } + + public Integer getWeight() { + return weight; + } + + public BlkioWeightDevice withWeight(Integer weight) { + this.weight = weight; + return this; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, SHORT_PREFIX_STYLE); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(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 7d73710fd..32155271c 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -127,8 +127,10 @@ private static boolean validDeviceMode(String deviceMode) { 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()) + return new EqualsBuilder() + .append(cGroupPermissions, other.getcGroupPermissions()) + .append(pathInContainer, other.getPathInContainer()) + .append(pathOnHost, other.getPathOnHost()) .isEquals(); } else { return super.equals(obj); @@ -137,7 +139,11 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return new HashCodeBuilder().append(cGroupPermissions).append(pathInContainer).append(pathOnHost).toHashCode(); + return new HashCodeBuilder() + .append(cGroupPermissions) + .append(pathInContainer) + .append(pathOnHost) + .toHashCode(); } } diff --git a/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index d9057c11a..a6581f261 100644 --- a/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -18,6 +18,9 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; import java.io.Serializable; import java.util.List; @@ -47,13 +50,13 @@ public class HealthCheck implements Serializable { * @since 1.26 */ @JsonProperty("Retries") - private Long retries; + private Integer retries; /** * @since 1.26 */ @JsonProperty("StartPeriod") - private Long startPeriod; + private Integer startPeriod; public Long getInterval() { return interval; @@ -82,21 +85,36 @@ public HealthCheck withTest(List test) { return this; } - public Long getRetries() { + public Integer getRetries() { return retries; } - public HealthCheck withRetries(Long retries) { + public HealthCheck withRetries(Integer retries) { this.retries = retries; return this; } - public Long getStartPeriod() { + public Integer getStartPeriod() { return startPeriod; } - public HealthCheck withStartPeriod(Long startPeriod) { + public HealthCheck withStartPeriod(Integer startPeriod) { this.startPeriod = startPeriod; return this; } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } } 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 240ea237e..1eb0594b6 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -29,12 +29,13 @@ public class HostConfig implements Serializable { private static final List PREDEFINED_NETWORKS = Arrays.asList("bridge", "host", "none"); + public static HostConfig newHostConfig() { + return new HostConfig(); + } + @JsonProperty("Binds") private Binds binds; - /** - * @since 1.19 - */ @JsonProperty("BlkioWeight") private Integer blkioWeight; @@ -42,37 +43,40 @@ public class HostConfig implements Serializable { * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} */ @JsonProperty("BlkioWeightDevice") - private List blkioWeightDevice; + private List blkioWeightDevice; /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} */ @JsonProperty("BlkioDeviceReadBps") - private List blkioDeviceReadBps; + private List blkioDeviceReadBps; /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} */ - @JsonProperty("BlkioDeviceReadIOps") - private List blkioDeviceReadIOps; + @JsonProperty("BlkioDeviceWriteBps") + private List blkioDeviceWriteBps; /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} */ - @JsonProperty("BlkioDeviceWriteBps") - private List blkioDeviceWriteBps; + @JsonProperty("BlkioDeviceReadIOps") + private List blkioDeviceReadIOps; /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} */ @JsonProperty("BlkioDeviceWriteIOps") - private List blkioDeviceWriteIOps; + private List blkioDeviceWriteIOps; /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_20} */ @JsonProperty("MemorySwappiness") - private Integer memorySwappiness; + private Long memorySwappiness; + + @JsonProperty("NanoCPUs") + private Long nanoCPUs; @JsonProperty("CapAdd") private Capability[] capAdd; @@ -83,11 +87,14 @@ public class HostConfig implements Serializable { @JsonProperty("ContainerIDFile") private String containerIDFile; - /** - * @since 1.19 - */ @JsonProperty("CpuPeriod") - private Integer cpuPeriod; + private Long cpuPeriod; + + @JsonProperty("CpuRealtimePeriod") + private Long cpuRealtimePeriod; + + @JsonProperty("CpuRealtimeRuntime") + private Long cpuRealtimeRuntime; @JsonProperty("CpuShares") private Integer cpuShares; @@ -96,20 +103,20 @@ public class HostConfig implements Serializable { * @since ~{@link RemoteApiVersion#VERSION_1_20} */ @JsonProperty("CpuQuota") - private Integer cpuQuota; + private Long cpuQuota; @JsonProperty("CpusetCpus") private String cpusetCpus; - /** - * @since 1.19 - */ @JsonProperty("CpusetMems") private String cpusetMems; @JsonProperty("Devices") private Device[] devices; + @JsonProperty("DeviceCgroupRules") + private List deviceCgroupRules; + /** * @since {@link RemoteApiVersion#VERSION_1_25} */ @@ -119,12 +126,24 @@ public class HostConfig implements Serializable { @JsonProperty("Dns") private String[] dns; + @JsonProperty("DnsOptions") + private List dnsOptions; + @JsonProperty("DnsSearch") private String[] dnsSearch; @JsonProperty("ExtraHosts") private String[] extraHosts; + @JsonProperty("GroupAdd") + private List groupAdd; + + @JsonProperty("IpcMode") + private String ipcMode; + + @JsonProperty("Cgroup") + private String cgroup; + @JsonProperty("Links") private Links links; @@ -158,6 +177,9 @@ public class HostConfig implements Serializable { @JsonProperty("OomKillDisable") private Boolean oomKillDisable; + @JsonProperty("Init") + private Boolean init; + /** * @since {@link RemoteApiVersion#VERSION_1_25} */ @@ -168,7 +190,7 @@ public class HostConfig implements Serializable { * @since {@link RemoteApiVersion#VERSION_1_22} */ @JsonProperty("OomScoreAdj") - private Boolean oomScoreAdj; + private Integer oomScoreAdj; @JsonProperty("PortBindings") private Ports portBindings; @@ -185,27 +207,42 @@ public class HostConfig implements Serializable { @JsonProperty("RestartPolicy") private RestartPolicy restartPolicy; - /** - * @since {@link RemoteApiVersion#VERSION_1_24} - */ - @JsonProperty("StorageOpt") - private Map storageOpt; - @JsonProperty("Ulimits") private Ulimit[] ulimits; + @JsonProperty("CpuCount") + private Long cpuCount; + + @JsonProperty("CpuPercent") + private Long cpuPercent; + + @JsonProperty("IOMaximumIOps") + private Long ioMaximumIOps; + + @JsonProperty("IOMaximumBandwidth") + private Long ioMaximumBandwidth; + @JsonProperty("VolumesFrom") private VolumesFrom[] volumesFrom; + @JsonProperty("Mounts") + private List mounts; + @JsonProperty("PidMode") private String pidMode; + @JsonProperty("Isolation") + private Isolation isolation; + /** * @since {@link RemoteApiVersion#VERSION_1_20} */ @JsonProperty("SecurityOpt") private List securityOpts; + @JsonProperty("StorageOpt") + private Map storageOpt; + /** * @since {@link RemoteApiVersion#VERSION_1_20} */ @@ -242,15 +279,17 @@ public class HostConfig implements Serializable { @JsonProperty("Tmpfs") private Map tmpFs; - /** - * @since ~{@link RemoteApiVersion#VERSION_1_22} - */ - @JsonProperty("Isolation") - private String isolation; + @JsonProperty("UTSMode") + private String utSMode; - public static HostConfig newHostConfig() { - return new HostConfig(); - } + @JsonProperty("UsernsMode") + private String usernsMode; + + @JsonProperty("Sysctls") + private Map sysctls; + + @JsonProperty("ConsoleSize") + private List consoleSize; @JsonIgnore public Bind[] getBinds() { @@ -273,10 +312,11 @@ public String getContainerIDFile() { return containerIDFile; } - public Integer getCpuPeriod() { + public Long getCpuPeriod() { return cpuPeriod; } + public Integer getCpuShares() { return cpuShares; } @@ -356,19 +396,11 @@ public String getPidMode() { return pidMode; } - /** - * @see #isolation - */ - @CheckForNull - public String getIsolation() { - return isolation; - } - /** * @see #blkioDeviceReadBps */ @CheckForNull - public List getBlkioDeviceReadBps() { + public List getBlkioDeviceReadBps() { return blkioDeviceReadBps; } @@ -376,7 +408,7 @@ public List getBlkioDeviceReadBps() { * @see #blkioDeviceReadIOps */ @CheckForNull - public List getBlkioDeviceReadIOps() { + public List getBlkioDeviceReadIOps() { return blkioDeviceReadIOps; } @@ -384,7 +416,7 @@ public List getBlkioDeviceReadIOps() { * @see #blkioDeviceWriteBps */ @CheckForNull - public List getBlkioDeviceWriteBps() { + public List getBlkioDeviceWriteBps() { return blkioDeviceWriteBps; } @@ -392,7 +424,7 @@ public List getBlkioDeviceWriteBps() { * @see #blkioDeviceWriteIOps */ @CheckForNull - public List getBlkioDeviceWriteIOps() { + public List getBlkioDeviceWriteIOps() { return blkioDeviceWriteIOps; } @@ -400,7 +432,7 @@ public List getBlkioDeviceWriteIOps() { * @see #blkioWeightDevice */ @CheckForNull - public List getBlkioWeightDevice() { + public List getBlkioWeightDevice() { return blkioWeightDevice; } @@ -408,7 +440,7 @@ public List getBlkioWeightDevice() { * @see #oomScoreAdj */ @CheckForNull - public Boolean getOomScoreAdj() { + public Integer getOomScoreAdj() { return oomScoreAdj; } @@ -416,7 +448,7 @@ public Boolean getOomScoreAdj() { * @see #cpuQuota */ @CheckForNull - public Integer getCpuQuota() { + public Long getCpuQuota() { return cpuQuota; } @@ -440,7 +472,7 @@ public Long getMemoryReservation() { * @see #memorySwappiness */ @CheckForNull - public Integer getMemorySwappiness() { + public Long getMemorySwappiness() { return memorySwappiness; } @@ -547,10 +579,15 @@ public HostConfig withBinds(Bind... binds) { return this; } + public HostConfig withBinds(List binds) { + checkNotNull(binds, "binds was not specified"); + return withBinds(binds.toArray(new Bind[binds.size()])); + } + /** * @see #blkioDeviceReadBps */ - public HostConfig withBlkioDeviceReadBps(List blkioDeviceReadBps) { + public HostConfig withBlkioDeviceReadBps(List blkioDeviceReadBps) { this.blkioDeviceReadBps = blkioDeviceReadBps; return this; } @@ -558,7 +595,7 @@ public HostConfig withBlkioDeviceReadBps(List blkioDeviceReadBps) { /** * @see #blkioDeviceReadIOps */ - public HostConfig withBlkioDeviceReadIOps(List blkioDeviceReadIOps) { + public HostConfig withBlkioDeviceReadIOps(List blkioDeviceReadIOps) { this.blkioDeviceReadIOps = blkioDeviceReadIOps; return this; } @@ -566,7 +603,7 @@ public HostConfig withBlkioDeviceReadIOps(List blkioDeviceReadIOps) { /** * @see #blkioDeviceWriteBps */ - public HostConfig withBlkioDeviceWriteBps(List blkioDeviceWriteBps) { + public HostConfig withBlkioDeviceWriteBps(List blkioDeviceWriteBps) { this.blkioDeviceWriteBps = blkioDeviceWriteBps; return this; } @@ -574,7 +611,7 @@ public HostConfig withBlkioDeviceWriteBps(List blkioDeviceWriteBps) { /** * @see #blkioDeviceWriteIOps */ - public HostConfig withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps) { + public HostConfig withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps) { this.blkioDeviceWriteIOps = blkioDeviceWriteIOps; return this; } @@ -590,14 +627,13 @@ public HostConfig withBlkioWeight(Integer blkioWeight) { /** * @see #blkioWeightDevice */ - public HostConfig withBlkioWeightDevice(List blkioWeightDevice) { + public HostConfig withBlkioWeightDevice(List blkioWeightDevice) { this.blkioWeightDevice = blkioWeightDevice; return this; } /** - * Add linux kernel capability to the container. For example: - * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. + * @see #capAdd */ public HostConfig withCapAdd(Capability... capAdd) { this.capAdd = capAdd; @@ -631,7 +667,7 @@ public HostConfig withContainerIDFile(String containerIDFile) { /** * @see #cpuPeriod */ - public HostConfig withCpuPeriod(Integer cpuPeriod) { + public HostConfig withCpuPeriod(Long cpuPeriod) { this.cpuPeriod = cpuPeriod; return this; } @@ -639,7 +675,7 @@ public HostConfig withCpuPeriod(Integer cpuPeriod) { /** * @see #cpuQuota */ - public HostConfig withCpuQuota(Integer cpuQuota) { + public HostConfig withCpuQuota(Long cpuQuota) { this.cpuQuota = cpuQuota; return this; } @@ -668,11 +704,6 @@ public HostConfig withCpuShares(Integer cpuShares) { return this; } - public HostConfig withDevices(List devices) { - checkNotNull(devices, "devices was not specified"); - return withDevices(devices.toArray(new Device[devices.size()])); - } - /** * @see #devices */ @@ -681,6 +712,11 @@ public HostConfig withDevices(Device... devices) { return this; } + public HostConfig withDevices(List devices) { + checkNotNull(devices, "devices was not specified"); + return withDevices(devices.toArray(new Device[0])); + } + /** * @see #diskQuota */ @@ -699,7 +735,7 @@ public HostConfig withDns(String... dns) { public HostConfig withDns(List dns) { checkNotNull(dns, "dns was not specified"); - return withDns(dns.toArray(new String[dns.size()])); + return withDns(dns.toArray(new String[0])); } /** @@ -723,11 +759,6 @@ public HostConfig withExtraHosts(String... extraHosts) { return this; } - public HostConfig withExtraHosts(List extraHosts) { - checkNotNull(extraHosts, "extraHosts was not specified"); - return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()])); - } - /** * @see #kernelMemory */ @@ -744,18 +775,18 @@ public HostConfig withLinks(Links links) { return this; } - public HostConfig withLinks(List links) { + public HostConfig withLinks(Link... links) { checkNotNull(links, "links was not specified"); - setLinks(links.toArray(new Link[links.size()])); + setLinks(links); return this; } - public HostConfig withLinks(Link... links) { + public HostConfig withLinks(List links) { checkNotNull(links, "links was not specified"); - setLinks(links); - return this; + return withLinks(links.toArray(new Link[0])); } + /** * @see #logConfig */ @@ -772,11 +803,6 @@ public HostConfig withLxcConf(LxcConf[] lxcConf) { return this; } - public HostConfig withLxcConf(List lxcConf) { - checkNotNull(lxcConf, "lxcConf was not specified"); - return withLxcConf(lxcConf.toArray(new LxcConf[0])); - } - /** * @see #memory */ @@ -804,7 +830,7 @@ public HostConfig withMemorySwap(Long memorySwap) { /** * @see #memorySwappiness */ - public HostConfig withMemorySwappiness(Integer memorySwappiness) { + public HostConfig withMemorySwappiness(Long memorySwappiness) { this.memorySwappiness = memorySwappiness; return this; } @@ -818,8 +844,6 @@ public HostConfig withMemorySwappiness(Integer memorySwappiness) { *
  • '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.
  • * - * - * @see #networkMode */ public HostConfig withNetworkMode(String networkMode) { this.networkMode = networkMode; @@ -828,6 +852,7 @@ public HostConfig withNetworkMode(String networkMode) { /** * @see #oomKillDisable + * @since 1.19 */ public HostConfig withOomKillDisable(Boolean oomKillDisable) { this.oomKillDisable = oomKillDisable; @@ -845,12 +870,14 @@ public HostConfig withAutoRemove(Boolean autoRemove) { /** * @see #oomScoreAdj */ - public HostConfig withOomScoreAdj(Boolean oomScoreAdj) { + public HostConfig withOomScoreAdj(Integer oomScoreAdj) { this.oomScoreAdj = oomScoreAdj; return this; } /** + * Set the PID (Process) Namespace mode for the container, 'host': use the host's PID namespace inside the container + * * @see #pidMode */ public HostConfig withPidMode(String pidMode) { @@ -859,11 +886,18 @@ public HostConfig withPidMode(String pidMode) { } /** - * @see #portBindings + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the + * docker run CLI command. */ + public HostConfig withPortBindings(Ports portBindings) { + this.portBindings = portBindings; + return this; + } + public HostConfig withPortBindings(PortBinding... portBindings) { checkNotNull(portBindings, "portBindings was not specified"); - return withPortBindings(new Ports(portBindings)); + withPortBindings(new Ports(portBindings)); + return this; } public HostConfig withPortBindings(List portBindings) { @@ -871,14 +905,6 @@ public HostConfig withPortBindings(List portBindings) { return withPortBindings(portBindings.toArray(new PortBinding[0])); } - /** - * @see #portBindings - */ - public HostConfig withPortBindings(Ports portBindings) { - this.portBindings = portBindings; - return this; - } - /** * @see #privileged */ @@ -928,28 +954,13 @@ public HostConfig withReadonlyRootfs(Boolean readonlyRootfs) { } /** - * @see #restartPolicy + * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()} */ public HostConfig withRestartPolicy(RestartPolicy restartPolicy) { this.restartPolicy = restartPolicy; return this; } - /** - * @see #storageOpt - */ - public Map getStorageOpt() { - return storageOpt; - } - - /** - * @see #storageOpt - */ - public HostConfig withStorageOpt(Map storageOpt) { - this.storageOpt = storageOpt; - return this; - } - /** * @see #securityOpts */ @@ -976,7 +987,7 @@ public HostConfig withUlimits(Ulimit[] ulimits) { public HostConfig withUlimits(List ulimits) { checkNotNull(ulimits, "no ulimits was specified"); - return withUlimits(ulimits.toArray(new Ulimit[ulimits.size()])); + return withUlimits(ulimits.toArray(new Ulimit[0])); } /** @@ -997,10 +1008,9 @@ public HostConfig withVolumesFrom(VolumesFrom... volumesFrom) { public HostConfig withVolumesFrom(List volumesFrom) { checkNotNull(volumesFrom, "volumesFrom was not specified"); - return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()])); + return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[0])); } - /** * @see #pidsLimit */ @@ -1022,14 +1032,206 @@ public HostConfig withTmpFs(Map tmpFs) { return this; } - /** - * @see #isolation - */ - public HostConfig withIsolation(String isolation) { + @CheckForNull + public List getDeviceCgroupRules() { + return deviceCgroupRules; + } + + public HostConfig withDeviceCgroupRules(List deviceCgroupRules) { + this.deviceCgroupRules = deviceCgroupRules; + return this; + } + + @CheckForNull + public Long getNanoCPUs() { + return nanoCPUs; + } + + public HostConfig withNanoCPUs(Long nanoCPUs) { + this.nanoCPUs = nanoCPUs; + return this; + } + + @CheckForNull + public Boolean getInit() { + return init; + } + + public HostConfig withInit(Boolean init) { + this.init = init; + return this; + } + + @CheckForNull + public Long getCpuCount() { + return cpuCount; + } + + public HostConfig withCpuCount(Long cpuCount) { + this.cpuCount = cpuCount; + return this; + } + + @CheckForNull + public Long getCpuPercent() { + return cpuPercent; + } + + public HostConfig withCpuPercent(Long cpuPercent) { + this.cpuPercent = cpuPercent; + return this; + } + + @CheckForNull + public Long getIoMaximumIOps() { + return ioMaximumIOps; + } + + public HostConfig withIoMaximumIOps(Long ioMaximumIOps) { + this.ioMaximumIOps = ioMaximumIOps; + return this; + } + + @CheckForNull + public Long getIoMaximumBandwidth() { + return ioMaximumBandwidth; + } + + public HostConfig withIoMaximumBandwidth(Long ioMaximumBandwidth) { + this.ioMaximumBandwidth = ioMaximumBandwidth; + return this; + } + + @CheckForNull + public List getMounts() { + return mounts; + } + + public HostConfig withMounts(List mounts) { + this.mounts = mounts; + return this; + } + + @CheckForNull + public List getDnsOptions() { + return dnsOptions; + } + + public HostConfig withDnsOptions(List dnsOptions) { + this.dnsOptions = dnsOptions; + return this; + } + + @CheckForNull + public List getGroupAdd() { + return groupAdd; + } + + public HostConfig withGroupAdd(List groupAdd) { + this.groupAdd = groupAdd; + return this; + } + + @CheckForNull + public String getIpcMode() { + return ipcMode; + } + + public HostConfig withIpcMode(String ipcMode) { + this.ipcMode = ipcMode; + return this; + } + + @CheckForNull + public String getCgroup() { + return cgroup; + } + + public HostConfig withCgroup(String cgroup) { + this.cgroup = cgroup; + return this; + } + + @CheckForNull + public Map getStorageOpt() { + return storageOpt; + } + + public HostConfig withStorageOpt(Map storageOpt) { + this.storageOpt = storageOpt; + return this; + } + + @CheckForNull + public String getUtSMode() { + return utSMode; + } + + public HostConfig withUtSMode(String utSMode) { + this.utSMode = utSMode; + return this; + } + + @CheckForNull + public String getUsernsMode() { + return usernsMode; + } + + public HostConfig withUsernsMode(String usernsMode) { + this.usernsMode = usernsMode; + return this; + } + + @CheckForNull + public Map getSysctls() { + return sysctls; + } + + public HostConfig withSysctls(Map sysctls) { + this.sysctls = sysctls; + return this; + } + + @CheckForNull + public List getConsoleSize() { + return consoleSize; + } + + public HostConfig withConsoleSize(List consoleSize) { + this.consoleSize = consoleSize; + return this; + } + + @CheckForNull + public Isolation getIsolation() { + return isolation; + } + + public HostConfig withIsolation(Isolation isolation) { this.isolation = isolation; return this; } + @CheckForNull + public Long getCpuRealtimePeriod() { + return cpuRealtimePeriod; + } + + public HostConfig withCpuRealtimePeriod(Long cpuRealtimePeriod) { + this.cpuRealtimePeriod = cpuRealtimePeriod; + return this; + } + + @CheckForNull + public Long getCpuRealtimeRuntime() { + return cpuRealtimeRuntime; + } + + public HostConfig withCpuRealtimeRuntime(Long cpuRealtimeRuntime) { + this.cpuRealtimeRuntime = cpuRealtimeRuntime; + return this; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); diff --git a/src/main/java/com/github/dockerjava/api/model/Isolation.java b/src/main/java/com/github/dockerjava/api/model/Isolation.java new file mode 100644 index 000000000..c59c8848f --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Isolation.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.io.Serializable; + +public enum Isolation implements Serializable { + DEFAULT("default"), + + PROCESS("process"), + + HYPERV("hyperv"); + + private String value; + + Isolation(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @JsonCreator + public static Isolation fromValue(String text) { + for (Isolation b : Isolation.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + return null; + } + + @Override + public String toString() { + return String.valueOf(value); + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/LogConfig.java b/src/main/java/com/github/dockerjava/api/model/LogConfig.java index 6da68d434..4ea19041e 100644 --- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java @@ -1,28 +1,19 @@ package com.github.dockerjava.api.model; -import java.io.IOException; -import java.io.Serializable; -import java.util.Map; - +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -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.annotation.JsonValue; + +import javax.annotation.CheckForNull; +import java.io.Serializable; +import java.util.Map; /** * Log driver to use for a created/running container. The available types are: - * + *

    * json-file (default) syslog journald none - * + *

    * If a driver is specified that is NOT supported,docker will default to null. If configs are supplied that are not supported by the type * docker will ignore them. In most cases setting the config option to null will suffice. Consult the docker remote API for a more detailed * and up-to-date explanation of the available types and their options. @@ -68,12 +59,11 @@ public LogConfig setConfig(Map config) { return this; } - @JsonDeserialize(using = LoggingType.Deserializer.class) - @JsonSerialize(using = LoggingType.Serializer.class) public enum LoggingType { + NONE("none"), DEFAULT("json-file"), + ETWLOGS("etwlogs"), JSON_FILE("json-file"), - NONE("none"), SYSLOG("syslog"), JOURNALD("journald"), GELF("gelf"), @@ -89,34 +79,25 @@ public enum LoggingType { this.type = type; } + @JsonValue public String getType() { return type; } - public static final class Serializer extends JsonSerializer { - @Override - public void serialize(LoggingType value, JsonGenerator jgen, SerializerProvider provider) - throws IOException, JsonProcessingException { - jgen.writeString(value.getType()); + @JsonCreator + @CheckForNull + public static LoggingType fromValue(String text) { + for (LoggingType b : LoggingType.values()) { + if (String.valueOf(b.type).equals(text)) { + return b; + } } + return null; } - public static final class Deserializer extends JsonDeserializer { - @Override - public LoggingType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { - - ObjectCodec oc = jsonParser.getCodec(); - JsonNode node = oc.readTree(jsonParser); - - for (LoggingType loggingType : values()) { - if (loggingType.getType().equals(node.asText())) { - return loggingType; - } - } - - throw new IllegalArgumentException("No enum constant " + LoggingType.class + "." + node.asText()); - } + @Override + public String toString() { + return String.valueOf(type); } } } 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 abcf298bd..5a37810a4 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -25,12 +25,10 @@ public class Ulimit implements Serializable { private Integer 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; 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 bb1dc1573..1819be0c3 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.ExposedPorts; +import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; @@ -19,6 +20,7 @@ import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import javax.annotation.CheckForNull; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -72,6 +74,12 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd onBuild; + @JsonProperty("NetworkDisabled") private Boolean networkDisabled; @@ -99,12 +110,18 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd labels; + @JsonProperty("Shell") + private List shell; + @JsonProperty("NetworkingConfig") private NetworkingConfig networkingConfig; @@ -134,336 +151,322 @@ public CreateContainerCmd withAuthConfig(AuthConfig authConfig) { return this; } - /** - * @throws NotFoundException - * No such container - * @throws ConflictException - * Named container already exists - */ @Override - public CreateContainerResponse exec() throws NotFoundException, ConflictException { - //code flow taken from https://github.com/docker/docker/blob/master/runconfig/opts/parse.go - ContainerNetwork containerNetwork = null; - - if (ipv4Address != null || ipv6Address != null) { - containerNetwork = new ContainerNetwork() - .withIpamConfig(new ContainerNetwork.Ipam() - .withIpv4Address(ipv4Address) - .withIpv6Address(ipv6Address) - ); - - } - - if (hostConfig.isUserDefinedNetwork() && hostConfig.getLinks().length > 0) { - if (containerNetwork == null) { - containerNetwork = new ContainerNetwork(); - } - - containerNetwork.withLinks(hostConfig.getLinks()); - } - - if (aliases != null) { - if (containerNetwork == null) { - containerNetwork = new ContainerNetwork(); - } - - containerNetwork.withAliases(aliases); - } - - if (containerNetwork != null) { - networkingConfig = new NetworkingConfig() - .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork)); - } + @JsonIgnore + public List getAliases() { + return aliases; + } - return super.exec(); + @Override + public CreateContainerCmd withAliases(String... aliases) { + this.aliases = Arrays.asList(aliases); + return this; } @Override - @JsonIgnore - public List getAliases() { - return aliases; + public CreateContainerCmd withAliases(List aliases) { + checkNotNull(aliases, "aliases was not specified"); + this.aliases = aliases; + return this; } + @Override public String[] getCmd() { return cmd; } @Override - public String getDomainName() { - return domainName; + public CreateContainerCmd withCmd(String... cmd) { + checkNotNull(cmd, "cmd was not specified"); + this.cmd = cmd; + return this; } @Override - public String[] getEntrypoint() { - return entrypoint; + public CreateContainerCmd withCmd(List cmd) { + checkNotNull(cmd, "cmd was not specified"); + return withCmd(cmd.toArray(new String[0])); } - @Override - public String[] getEnv() { - return env; + @CheckForNull + public HealthCheck getHealthcheck() { + return healthcheck; } - @Override - @JsonIgnore - public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); + public CreateContainerCmdImpl withHealthcheck(HealthCheck healthcheck) { + this.healthcheck = healthcheck; + return this; } - /** - * @see #stopSignal - */ - @JsonIgnore - @Override - public String getStopSignal() { - return stopSignal; + public Boolean getArgsEscaped() { + return argsEscaped; } - @Override - public String getHostName() { - return hostName; + public CreateContainerCmdImpl withArgsEscaped(Boolean argsEscaped) { + this.argsEscaped = argsEscaped; + return this; } @Override - public String getImage() { - return image; + public String getDomainName() { + return domainName; } @Override - public String getIpv4Address() { - return ipv4Address; + public CreateContainerCmd withDomainName(String domainName) { + checkNotNull(domainName, "no domainName was specified"); + this.domainName = domainName; + return this; } @Override - public String getIpv6Address() { - return ipv6Address; + public String[] getEntrypoint() { + return entrypoint; } @Override - @JsonIgnore - public Map getLabels() { - return labels; + public CreateContainerCmd withEntrypoint(String... entrypoint) { + checkNotNull(entrypoint, "entrypoint was not specified"); + this.entrypoint = entrypoint; + return this; } @Override - public String getMacAddress() { - return macAddress; + public CreateContainerCmd withEntrypoint(List entrypoint) { + checkNotNull(entrypoint, "entrypoint was not specified"); + return withEntrypoint(entrypoint.toArray(new String[0])); } @Override - public String getName() { - return name; + public String[] getEnv() { + return env; } @Override - public String[] getPortSpecs() { - return portSpecs; + public CreateContainerCmd withEnv(String... env) { + checkNotNull(env, "env was not specified"); + this.env = env; + return this; } @Override - public String getUser() { - return user; + public CreateContainerCmd withEnv(List env) { + checkNotNull(env, "env was not specified"); + return withEnv(env.toArray(new String[0])); } @Override @JsonIgnore - public Volume[] getVolumes() { - return volumes.getVolumes(); + public ExposedPort[] getExposedPorts() { + return exposedPorts.getExposedPorts(); } @Override - public String getWorkingDir() { - return workingDir; + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts) { + checkNotNull(exposedPorts, "exposedPorts was not specified"); + this.exposedPorts = new ExposedPorts(exposedPorts); + return this; } @Override - public Boolean isAttachStderr() { - return attachStderr; + public CreateContainerCmd withExposedPorts(List exposedPorts) { + checkNotNull(exposedPorts, "exposedPorts was not specified"); + return withExposedPorts(exposedPorts.toArray(new ExposedPort[0])); } + /** + * @see #stopSignal + */ + @JsonIgnore @Override - public Boolean isAttachStdin() { - return attachStdin; + public String getStopSignal() { + return stopSignal; } @Override - public Boolean isAttachStdout() { - return attachStdout; + public CreateContainerCmd withStopSignal(String stopSignal) { + checkNotNull(stopSignal, "stopSignal wasn't specified."); + this.stopSignal = stopSignal; + return this; } @Override - public Boolean isNetworkDisabled() { - return networkDisabled; + public Integer getStopTimeout() { + return stopTimeout; } @Override - public Boolean isStdInOnce() { - return stdInOnce; + public CreateContainerCmd withStopTimeout(Integer stopTimeout) { + this.stopTimeout = stopTimeout; + return this; } @Override - public Boolean isStdinOpen() { - return stdinOpen; + public String getHostName() { + return hostName; } @Override - public Boolean isTty() { - return tty; + public CreateContainerCmd withHostName(String hostName) { + checkNotNull(hostName, "no hostName was specified"); + this.hostName = hostName; + return this; } @Override - public HostConfig getHostConfig() { - return hostConfig; + public String getImage() { + return image; } @Override - public CreateContainerCmd withAliases(String... aliases) { - this.aliases = Arrays.asList(aliases); + public CreateContainerCmd withImage(String image) { + checkNotNull(image, "no image was specified"); + this.image = image; return this; } @Override - public CreateContainerCmd withAliases(List aliases) { - checkNotNull(aliases, "aliases was not specified"); - this.aliases = aliases; - return this; + @JsonIgnore + public Map getLabels() { + return labels; } @Override - public CreateContainerCmd withAttachStderr(Boolean attachStderr) { - checkNotNull(attachStderr, "attachStderr was not specified"); - this.attachStderr = attachStderr; + public CreateContainerCmd withLabels(Map labels) { + checkNotNull(labels, "labels was not specified"); + this.labels = labels; return this; } @Override - public CreateContainerCmd withAttachStdin(Boolean attachStdin) { - checkNotNull(attachStdin, "attachStdin was not specified"); - this.attachStdin = attachStdin; - return this; + public String getMacAddress() { + return macAddress; } @Override - public CreateContainerCmd withAttachStdout(Boolean attachStdout) { - checkNotNull(attachStdout, "attachStdout was not specified"); - this.attachStdout = attachStdout; + public CreateContainerCmd withMacAddress(String macAddress) { + checkNotNull(macAddress, "macAddress was not specified"); + this.macAddress = macAddress; return this; } + @Override + public String getName() { + return name; + } @Override - public CreateContainerCmd withCmd(String... cmd) { - checkNotNull(cmd, "cmd was not specified"); - this.cmd = cmd; + public CreateContainerCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; return this; } @Override - public CreateContainerCmd withCmd(List cmd) { - checkNotNull(cmd, "cmd was not specified"); - return withCmd(cmd.toArray(new String[cmd.size()])); + public String[] getPortSpecs() { + return portSpecs; } @Override - public CreateContainerCmd withDomainName(String domainName) { - checkNotNull(domainName, "no domainName was specified"); - this.domainName = domainName; + public CreateContainerCmd withPortSpecs(String... portSpecs) { + checkNotNull(portSpecs, "portSpecs was not specified"); + this.portSpecs = portSpecs; return this; } @Override - public CreateContainerCmd withEntrypoint(String... entrypoint) { - checkNotNull(entrypoint, "entrypoint was not specified"); - this.entrypoint = entrypoint; - return this; + public CreateContainerCmd withPortSpecs(List portSpecs) { + checkNotNull(portSpecs, "portSpecs was not specified"); + return withPortSpecs(portSpecs.toArray(new String[0])); } @Override - public CreateContainerCmd withEntrypoint(List entrypoint) { - checkNotNull(entrypoint, "entrypoint was not specified"); - return withEntrypoint(entrypoint.toArray(new String[entrypoint.size()])); + public String getUser() { + return user; } @Override - public CreateContainerCmd withEnv(String... env) { - checkNotNull(env, "env was not specified"); - this.env = env; + public CreateContainerCmd withUser(String user) { + checkNotNull(user, "user was not specified"); + this.user = user; return this; } + @Override - public CreateContainerCmd withEnv(List env) { - checkNotNull(env, "env was not specified"); - return withEnv(env.toArray(new String[env.size()])); + public Boolean isAttachStderr() { + return attachStderr; } @Override - public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts) { - checkNotNull(exposedPorts, "exposedPorts was not specified"); - this.exposedPorts = new ExposedPorts(exposedPorts); + public CreateContainerCmd withAttachStderr(Boolean attachStderr) { + checkNotNull(attachStderr, "attachStderr was not specified"); + this.attachStderr = attachStderr; return this; } + @Override - public CreateContainerCmd withStopSignal(String stopSignal) { - checkNotNull(stopSignal, "stopSignal wasn't specified."); - this.stopSignal = stopSignal; + public Boolean isAttachStdin() { + return attachStdin; + } + + @Override + public CreateContainerCmd withAttachStdin(Boolean attachStdin) { + checkNotNull(attachStdin, "attachStdin was not specified"); + this.attachStdin = attachStdin; return this; } + @Override - public CreateContainerCmd withExposedPorts(List exposedPorts) { - checkNotNull(exposedPorts, "exposedPorts was not specified"); - return withExposedPorts(exposedPorts.toArray(new ExposedPort[exposedPorts.size()])); + public Boolean isAttachStdout() { + return attachStdout; } @Override - public CreateContainerCmd withHostName(String hostName) { - checkNotNull(hostConfig, "no hostName was specified"); - this.hostName = hostName; + public CreateContainerCmd withAttachStdout(Boolean attachStdout) { + checkNotNull(attachStdout, "attachStdout was not specified"); + this.attachStdout = attachStdout; return this; } + @Override - public CreateContainerCmd withImage(String image) { - checkNotNull(image, "no image was specified"); - this.image = image; - return this; + @JsonIgnore + public Volume[] getVolumes() { + return volumes.getVolumes(); } @Override - public CreateContainerCmd withIpv4Address(String ipv4Address) { - checkNotNull(ipv4Address, "no ipv4Address was specified"); - this.ipv4Address = ipv4Address; + public CreateContainerCmd withVolumes(Volume... volumes) { + checkNotNull(volumes, "volumes was not specified"); + this.volumes = new Volumes(volumes); return this; } @Override - public CreateContainerCmd withIpv6Address(String ipv6Address) { - checkNotNull(ipv6Address, "no ipv6Address was specified"); - this.ipv6Address = ipv6Address; - return this; + public CreateContainerCmd withVolumes(List volumes) { + checkNotNull(volumes, "volumes was not specified"); + return withVolumes(volumes.toArray(new Volume[0])); } @Override - public CreateContainerCmd withLabels(Map labels) { - checkNotNull(labels, "labels was not specified"); - this.labels = labels; - return this; + public String getWorkingDir() { + return workingDir; } @Override - public CreateContainerCmd withMacAddress(String macAddress) { - checkNotNull(macAddress, "macAddress was not specified"); - this.macAddress = macAddress; + public CreateContainerCmd withWorkingDir(String workingDir) { + checkNotNull(workingDir, "workingDir was not specified"); + this.workingDir = workingDir; return this; } @Override - public CreateContainerCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; - return this; + public Boolean isNetworkDisabled() { + return networkDisabled; } @Override @@ -473,17 +476,10 @@ public CreateContainerCmd withNetworkDisabled(Boolean disableNetwork) { return this; } - @Override - public CreateContainerCmd withPortSpecs(String... portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); - this.portSpecs = portSpecs; - return this; - } @Override - public CreateContainerCmd withPortSpecs(List portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); - return withPortSpecs(portSpecs.toArray(new String[portSpecs.size()])); + public Boolean isStdInOnce() { + return stdInOnce; } @Override @@ -493,6 +489,11 @@ public CreateContainerCmd withStdInOnce(Boolean stdInOnce) { return this; } + @Override + public Boolean isStdinOpen() { + return stdinOpen; + } + @Override public CreateContainerCmd withStdinOpen(Boolean stdinOpen) { checkNotNull(stdinOpen, "no stdinOpen was specified"); @@ -500,6 +501,12 @@ public CreateContainerCmd withStdinOpen(Boolean stdinOpen) { return this; } + + @Override + public Boolean isTty() { + return tty; + } + @Override public CreateContainerCmd withTty(Boolean tty) { checkNotNull(tty, "no tty was specified"); @@ -507,41 +514,94 @@ public CreateContainerCmd withTty(Boolean tty) { return this; } + @Override + public HostConfig getHostConfig() { + return hostConfig; + } @Override - public CreateContainerCmd withUser(String user) { - checkNotNull(user, "user was not specified"); - this.user = user; + public CreateContainerCmd withHostConfig(HostConfig hostConfig) { + this.hostConfig = hostConfig; return this; } @Override - public CreateContainerCmd withVolumes(Volume... volumes) { - checkNotNull(volumes, "volumes was not specified"); - this.volumes = new Volumes(volumes); + public String getIpv4Address() { + return ipv4Address; + } + + @Override + public CreateContainerCmd withIpv4Address(String ipv4Address) { + checkNotNull(ipv4Address, "no ipv4Address was specified"); + this.ipv4Address = ipv4Address; return this; } @Override - public CreateContainerCmd withVolumes(List volumes) { - checkNotNull(volumes, "volumes was not specified"); - return withVolumes(volumes.toArray(new Volume[volumes.size()])); + public String getIpv6Address() { + return ipv6Address; } @Override - public CreateContainerCmd withWorkingDir(String workingDir) { - checkNotNull(workingDir, "workingDir was not specified"); - this.workingDir = workingDir; + public CreateContainerCmd withIpv6Address(String ipv6Address) { + checkNotNull(ipv6Address, "no ipv6Address was specified"); + this.ipv6Address = ipv6Address; return this; } + @CheckForNull + public List getOnBuild() { + return onBuild; + } - @Override - public CreateContainerCmd withHostConfig(HostConfig hostConfig) { - this.hostConfig = hostConfig; + public CreateContainerCmdImpl withOnBuild(List onBuild) { + this.onBuild = onBuild; return this; } + /** + * @throws NotFoundException No such container + * @throws ConflictException Named container already exists + */ + @Override + public CreateContainerResponse exec() throws NotFoundException, ConflictException { + //code flow taken from https://github.com/docker/docker/blob/master/runconfig/opts/parse.go + ContainerNetwork containerNetwork = null; + + if (ipv4Address != null || ipv6Address != null) { + containerNetwork = new ContainerNetwork() + .withIpamConfig(new ContainerNetwork.Ipam() + .withIpv4Address(ipv4Address) + .withIpv6Address(ipv6Address) + ); + + } + + if (hostConfig.isUserDefinedNetwork() && hostConfig.getLinks().length > 0) { + if (containerNetwork == null) { + containerNetwork = new ContainerNetwork(); + } + + containerNetwork.withLinks(hostConfig.getLinks()); + } + + if (aliases != null) { + if (containerNetwork == null) { + containerNetwork = new ContainerNetwork(); + } + + containerNetwork.withAliases(aliases); + } + + if (containerNetwork != null) { + networkingConfig = new NetworkingConfig() + .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork)); + } + + return super.exec(); + } + + @Override public String toString() { return ToStringBuilder.reflectionToString(this); 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 6b4a5ec72..c8fed9cce 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.ContainerNetwork; +import com.github.dockerjava.api.model.Isolation; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; @@ -161,7 +162,7 @@ public void inspect_windows_container() throws IOException { ))); assertThat(response.getHostConfig(), notNullValue()); - assertThat(response.getHostConfig().getIsolation(), is("hyperv")); + assertThat(response.getHostConfig().getIsolation(), is(Isolation.HYPERV)); assertThat(response.getImageId(), is("sha256:1381511ec0122f197b6abff5bc0692bef19943ddafd6680eff41197afa3a6dda")); assertThat(response.getLogPath(), is( diff --git a/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index f01e60019..570f20f64 100644 --- a/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -306,7 +306,7 @@ public void createContainerWithMemorySwappiness() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") .withHostConfig(newHostConfig() - .withMemorySwappiness(42)) + .withMemorySwappiness(42L)) .exec(); assertThat(container.getId(), not(isEmptyString())); LOG.info("Created container {}", container.toString()); @@ -318,7 +318,7 @@ public void createContainerWithMemorySwappiness() throws DockerException { .inspectContainerCmd(container.getId()) .exec(); LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - assertSame(42, inspectContainerResponse.getHostConfig().getMemorySwappiness()); + assertSame(42L, inspectContainerResponse.getHostConfig().getMemorySwappiness()); } @Test @@ -335,9 +335,9 @@ public void createContainerWithLinkInCustomNetwork() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sleep", "9999") .withHostConfig(newHostConfig() .withNetworkMode(networkName)) + .withCmd("sleep", "9999") .withName(containerName1) .exec(); @@ -352,9 +352,8 @@ public void createContainerWithLinkInCustomNetwork() throws DockerException { CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withHostConfig(newHostConfig() - .withNetworkMode(networkName) .withLinks(new Link(containerName1, containerName1 + "Link")) - ) + .withNetworkMode(networkName)) .withName(containerName2) .withCmd("env") .exec(); @@ -387,9 +386,9 @@ public void createContainerWithCustomIp() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sleep", "9999") .withHostConfig(newHostConfig() .withNetworkMode(networkName)) + .withCmd("sleep", "9999") .withName(containerName1) .withIpv4Address(subnetPrefix + ".100") .exec(); @@ -421,9 +420,9 @@ public void createContainerWithAlias() throws DockerException { assertNotNull(createNetworkResponse.getId()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sleep", "9999") .withHostConfig(newHostConfig() .withNetworkMode(networkName)) + .withCmd("sleep", "9999") .withName(containerName1) .withAliases("server" + dockerRule.getKind()) .exec(); @@ -505,8 +504,7 @@ public void createContainerWithExtraHosts() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withName("containerextrahosts" + dockerRule.getKind()) .withHostConfig(newHostConfig() - .withExtraHosts(extraHosts)) - .exec(); + .withExtraHosts(extraHosts)).exec(); LOG.info("Created container {}", container.toString()); @@ -523,7 +521,8 @@ public void createContainerWithDevices() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") .withHostConfig(newHostConfig() - .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))).exec(); + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))) + .exec(); LOG.info("Created container {}", container.toString()); @@ -548,8 +547,10 @@ public void createContainerWithPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(baseport + 24)); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withExposedPorts(tcp22, tcp23).withHostConfig(newHostConfig() - .withPortBindings(portBindings)).exec(); + .withExposedPorts(tcp22, tcp23) + .withHostConfig(newHostConfig() + .withPortBindings(portBindings)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -603,7 +604,8 @@ public void createContainerWithLinking() throws DockerException { CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") .withName(containerName2) .withHostConfig(newHostConfig() - .withLinks(new Link(containerName1, containerName1 + "Link"))).exec(); + .withLinks(new Link(containerName1, containerName1 + "Link"))) + .exec(); LOG.info("Created container2 {}", container2.toString()); assertThat(container2.getId(), not(isEmptyString())); @@ -630,8 +632,7 @@ public void createContainerWithRestartPolicy() throws DockerException { RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") - .withHostConfig(newHostConfig() - .withRestartPolicy(restartPolicy)).exec(); + .withHostConfig(newHostConfig().withRestartPolicy(restartPolicy)).exec(); LOG.info("Created container {}", container.toString()); @@ -646,8 +647,7 @@ public void createContainerWithRestartPolicy() throws DockerException { public void createContainerWithPidMode() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") - .withHostConfig(newHostConfig() - .withPidMode("host")).exec(); + .withHostConfig(newHostConfig().withPidMode("host")).exec(); LOG.info("Created container {}", container.toString()); @@ -669,7 +669,8 @@ public void createContainerWithNetworkMode() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("true") .withHostConfig(newHostConfig() - .withNetworkMode("host")).exec(); + .withNetworkMode("host")) + .exec(); LOG.info("Created container {}", container.toString()); @@ -703,7 +704,8 @@ public void createContainerWithULimits() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withName(containerName) .withHostConfig(newHostConfig() - .withUlimits(ulimits)).exec(); + .withUlimits(ulimits)) + .exec(); LOG.info("Created container {}", container.toString()); @@ -819,7 +821,8 @@ public void onNext(Frame item) { public void createContainerWithCgroupParent() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withHostConfig(newHostConfig() - .withCgroupParent("/parent")).exec(); + .withCgroupParent("/parent")) + .exec(); LOG.info("Created container {}", container.toString()); diff --git a/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java b/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java index 220ad89ef..3c9451545 100644 --- a/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java @@ -41,9 +41,9 @@ public void forceDisconnectFromNetwork() throws InterruptedException { CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("testNetwork2" + dockerRule.getKind()).exec(); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("sleep", "9999") .withHostConfig(newHostConfig() .withNetworkMode("testNetwork2" + dockerRule.getKind())) + .withCmd("sleep", "9999") .exec(); dockerRule.getClient().startContainerCmd(container.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index 098c592b8..50ba4ca40 100644 --- a/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -4,7 +4,6 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.command.PullImageResultCallback; import com.github.dockerjava.core.command.WaitContainerResultCallback; @@ -22,6 +21,7 @@ import java.util.UUID; import static ch.lambdaj.Lambda.filter; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.hamcrest.MatcherAssert.assertThat; @@ -258,9 +258,8 @@ public void testVolumeFilter() throws Exception { id = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) - .withHostConfig(HostConfig.newHostConfig() - .withBinds(new Bind("TestFilterVolume", new Volume("/test"))) - ) + .withHostConfig(newHostConfig() + .withBinds(new Bind("TestFilterVolume", new Volume("/test")))) .exec() .getId(); @@ -288,9 +287,8 @@ public void testNetworkFilter() throws Exception { id = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) - .withHostConfig(HostConfig.newHostConfig() - .withNetworkMode("TestFilterNetwork") - ) + .withHostConfig(newHostConfig() + .withNetworkMode("TestFilterNetwork")) .exec() .getId(); diff --git a/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java index bd0a53f50..5fde7bc03 100644 --- a/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java @@ -10,7 +10,6 @@ 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.Ports.Binding; @@ -55,12 +54,10 @@ public void startContainerWithVolumes() throws DockerException { Volume volume2 = new Volume("/opt/webapp2"); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withVolumes(volume1, volume2) + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withVolumes(volume1, volume2) .withCmd("true") .withHostConfig(newHostConfig() - .withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)) - ) + .withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2))) .exec(); LOG.info("Created container {}", container.toString()); @@ -135,8 +132,7 @@ public void startContainerWithDns() throws DockerException { String aDnsServer = "8.8.8.8"; String anotherDnsServer = "8.8.4.4"; - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("true") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") .withHostConfig(newHostConfig() .withDns(aDnsServer, anotherDnsServer)) .exec(); @@ -158,8 +154,7 @@ public void startContainerWithDnsSearch() throws DockerException { String dnsSearch = "example.com"; - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("true") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") .withHostConfig(newHostConfig() .withDnsSearch(dnsSearch)) .exec(); @@ -189,12 +184,10 @@ public void startContainerWithPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(baseport + 23)); portBindings.bind(tcp23, Binding.bindPort(baseport + 24)); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("true") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23) .withHostConfig(newHostConfig() - .withPortBindings(portBindings)) - .exec(); + .withPortBindings(portBindings)).exec(); LOG.info("Created container {}", container.toString()); @@ -230,8 +223,7 @@ public void startContainerWithRandomPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.empty()); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withExposedPorts(tcp22, tcp23) - .withHostConfig(newHostConfig() + .withExposedPorts(tcp22, tcp23).withHostConfig(newHostConfig() .withPortBindings(portBindings) .withPublishAllPorts(true)) .exec(); @@ -265,8 +257,7 @@ public void startContainerWithConflictingPortBindings() throws DockerException { portBindings.bind(tcp23, Binding.bindPort(11022)); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") - .withExposedPorts(tcp22, tcp23) - .withHostConfig(newHostConfig() + .withExposedPorts(tcp22, tcp23).withHostConfig(newHostConfig() .withPortBindings(portBindings)) .exec(); @@ -310,10 +301,8 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); } - CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("sleep", "9999") - .withName(container2Name) - .withHostConfig(newHostConfig() + CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container2Name).withHostConfig(newHostConfig() .withLinks(new Link(container1Name, container1Name + "Link"))) .exec(); @@ -374,8 +363,7 @@ public void startContainerWithLinking() throws DockerException { } CreateContainerResponse container2 = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") - .withName(container2Name) - .withHostConfig(newHostConfig() + .withName(container2Name).withHostConfig(newHostConfig() .withLinks(new Link(container1Name, container1Name + "Link"))) .exec(); @@ -446,8 +434,7 @@ public void testStartNonExistingContainer() throws DockerException { @Test public void startContainerWithNetworkMode() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withCmd("true") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true") .withHostConfig(newHostConfig() .withNetworkMode("host")) .exec(); @@ -493,7 +480,8 @@ public void startContainerWithCapAddAndCapDrop() throws DockerException { @Test public void startContainerWithDevices() throws DockerException { - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sleep", "9999") .withHostConfig(newHostConfig() .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero"))) .exec(); @@ -539,9 +527,11 @@ public void startContainerWithRestartPolicy() throws DockerException { RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); - CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999") + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sleep", "9999") .withHostConfig(newHostConfig() - .withRestartPolicy(restartPolicy)).exec(); + .withRestartPolicy(restartPolicy)) + .exec(); LOG.info("Created container {}", container.toString()); diff --git a/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java b/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java index 238a0da73..51d967db5 100644 --- a/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java @@ -71,8 +71,8 @@ public void updateContainer() throws DockerException, IOException { // assertThat(afterHostConfig.getBlkioWeight(), is(300)); assertThat(afterHostConfig.getCpuShares(), is(512)); - assertThat(afterHostConfig.getCpuPeriod(), is(100000)); - assertThat(afterHostConfig.getCpuQuota(), is(50000)); + assertThat(afterHostConfig.getCpuPeriod(), is(100000L)); + assertThat(afterHostConfig.getCpuQuota(), is(50000L)); assertThat(afterHostConfig.getCpusetMems(), is("0")); // assertThat(afterHostConfig.getMemoryReservation(), is(209715200L)); diff --git a/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java b/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java index 79759cdd2..686c24794 100644 --- a/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java @@ -7,7 +7,6 @@ import com.github.dockerjava.api.exception.NotAcceptableException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.cmd.CmdIT; @@ -20,7 +19,6 @@ import com.github.dockerjava.netty.NettyDockerCmdExecFactory; import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.experimental.categories.Category; import static com.github.dockerjava.api.model.HostConfig.newHostConfig; @@ -105,14 +103,14 @@ protected DockerClient startDockerInDocker() { CreateContainerResponse response = dockerRule.getClient() .createContainerCmd(DOCKER_IN_DOCKER_IMAGE_REPOSITORY + ":" + DOCKER_IN_DOCKER_IMAGE_TAG) .withHostConfig(newHostConfig() - .withPrivileged(true) .withNetworkMode(NETWORK_NAME) .withPortBindings(new PortBinding( Ports.Binding.bindIpAndPort("127.0.0.1", port), - ExposedPort.tcp(2375) - ))) + ExposedPort.tcp(2375))) + .withPrivileged(true)) .withName(name) .withAliases(name) + .exec(); dockerRule.getClient().startContainerCmd(response.getId()).exec(); diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json index 9c505c04b..2f3428d7a 100644 --- a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json +++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json @@ -36,7 +36,7 @@ "Memory" : 0, "MemorySwap" : 0, "CpuQuota" : 0, - "OomScoreAdj" : false, + "OomScoreAdj" : 500, "MemoryReservation" : 0 }, "Id" : "58fd1abe8e43a65fb6231b76a9678e7bb4e91686f838945e782a4b74119ce959", From a57b94b0c06d4e4d61ce4fcfc8ce037192fc4fd9 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 27 Nov 2018 15:08:19 +0300 Subject: [PATCH 34/66] Revert "Change since parameter in LogContainerCmd to String" --- .../api/command/LogContainerCmd.java | 8 ++--- .../core/command/LogContainerCmdImpl.java | 11 +++--- .../dockerjava/cmd/LogContainerCmdIT.java | 36 +------------------ 3 files changed, 10 insertions(+), 45 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 7a92c898d..53674cbaa 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -23,8 +23,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp, RFC 3339 date, or Go duration string to filter logs. - * Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: + * 0 (unfiltered) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -47,7 +47,7 @@ public interface LogContainerCmd extends AsyncDockerCmd Boolean hasStderrEnabled(); @CheckForNull - String getSince(); + Integer getSince(); LogContainerCmd withContainerId(@Nonnull String containerId); @@ -67,7 +67,7 @@ public interface LogContainerCmd extends AsyncDockerCmd LogContainerCmd withTail(Integer tail); - LogContainerCmd withSince(String since); + LogContainerCmd withSince(Integer since); /** * @throws com.github.dockerjava.api.NotFoundException 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 0b18cd938..aa267fc8f 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -22,8 +22,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp, RFC 3339 date, or Go duration string to filter logs. - * Specifying a timestamp will only output log-entries since that timestamp. Default: 0 (unfiltered) + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: + * 0 (unfiltered) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -31,8 +31,7 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd Date: Tue, 27 Nov 2018 21:42:04 +0300 Subject: [PATCH 35/66] Bump findbugs plugin --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b04042770..d9ec8eccb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-SNAPSHOT + 3.1.0-rc-6 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 + 3.1.0-rc-6 @@ -512,7 +512,7 @@ org.codehaus.mojo findbugs-maven-plugin - 3.0.3 + 3.0.5 Max Low From 0c553f140ea1c3e420e3195d9be54d31b5ff7d32 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 27 Nov 2018 21:43:10 +0300 Subject: [PATCH 36/66] [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 d9ec8eccb..ae3627e59 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-rc-6 + 3.1.0-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 - 3.1.0-rc-6 + HEAD From 80cae550de7a4664e4838de3126e7f228b03af41 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 28 Nov 2018 00:17:21 +0300 Subject: [PATCH 37/66] Fix NPE when file doesn't exist. Such use case existed before. related to #727 --- .../core/DefaultDockerClientConfig.java | 6 ++++- .../dockerjava/core/DockerConfigFile.java | 26 +++++++++++++------ .../core/exec/AbstrDockerCmdExec.java | 18 +++++++++---- .../core/exec/BuildImageCmdExec.java | 7 +++-- .../core/exec/PullImageCmdExec.java | 5 ++-- .../dockerjava/core/DockerConfigFileTest.java | 2 +- 6 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java index 8517d89a9..c77cbb5b7 100644 --- a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java @@ -11,6 +11,8 @@ import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -231,14 +233,16 @@ public String getRegistryUrl() { return registryUrl; } + @CheckForNull public String getDockerConfigPath() { return dockerConfigPath; } + @Nonnull public DockerConfigFile getDockerConfig() { if (dockerConfig == null) { try { - dockerConfig = DockerConfigFile.loadConfig(new File(getDockerConfigPath())); + dockerConfig = DockerConfigFile.loadConfig(getDockerConfigPath()); } catch (IOException e) { throw new DockerClientException("Failed to parse docker configuration file", e); } diff --git a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java index 01cacb5c8..df4fd6541 100644 --- a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java @@ -10,6 +10,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -27,7 +29,7 @@ public class DockerConfigFile { private static final TypeReference> CONFIG_MAP_TYPE = new TypeReference>() { }; - @JsonProperty() + @JsonProperty private final Map auths; public DockerConfigFile() { @@ -38,6 +40,7 @@ private DockerConfigFile(Map authConfigMap) { auths = authConfigMap; } + @Nonnull public Map getAuths() { return auths; } @@ -46,7 +49,8 @@ void addAuthConfig(AuthConfig config) { auths.put(config.getRegistryAddress(), config); } - public AuthConfig resolveAuthConfig(String hostname) { + @CheckForNull + public AuthConfig resolveAuthConfig(@Nonnull String hostname) { if (StringUtils.isEmpty(hostname) || AuthConfig.DEFAULT_SERVER_ADDRESS.equals(hostname)) { return auths.get(AuthConfig.DEFAULT_SERVER_ADDRESS); } @@ -70,6 +74,7 @@ public AuthConfig resolveAuthConfig(String hostname) { return null; } + @Nonnull public AuthConfigurations getAuthConfigurations() { final AuthConfigurations authConfigurations = new AuthConfigurations(); for (Map.Entry authConfigEntry : auths.entrySet()) { @@ -112,9 +117,12 @@ public String toString() { return "DockerConfigFile [auths=" + auths + "]"; } - public static DockerConfigFile loadConfig(File dockerConfigPath) throws IOException { + @Nonnull + public static DockerConfigFile loadConfig(@CheckForNull String dockerConfigPath) throws IOException { + DockerConfigFile dockerConfig; + //parse new docker config file format - DockerConfigFile dockerConfig = loadCurrentConfig(dockerConfigPath); + dockerConfig = loadCurrentConfig(dockerConfigPath); //parse old auth config file format if (dockerConfig == null) { @@ -136,8 +144,9 @@ public static DockerConfigFile loadConfig(File dockerConfigPath) throws IOExcept return dockerConfig; } - private static DockerConfigFile loadCurrentConfig(File dockerConfigPath) throws IOException { - File dockerCfgFile = new File(dockerConfigPath, File.separator + DOCKER_CFG); + @CheckForNull + private static DockerConfigFile loadCurrentConfig(String dockerConfigPath) throws IOException { + File dockerCfgFile = new File(dockerConfigPath, DOCKER_CFG); if (!dockerCfgFile.exists() || !dockerCfgFile.isFile()) { return null; @@ -150,8 +159,9 @@ private static DockerConfigFile loadCurrentConfig(File dockerConfigPath) throws } } - private static DockerConfigFile loadLegacyConfig(File dockerConfigPath) throws IOException { - File dockerLegacyCfgFile = new File(dockerConfigPath, File.separator + DOCKER_LEGACY_CFG); + @CheckForNull + private static DockerConfigFile loadLegacyConfig(String dockerConfigPath) throws IOException { + File dockerLegacyCfgFile = new File(dockerConfigPath, DOCKER_LEGACY_CFG); if (!dockerLegacyCfgFile.exists() || !dockerLegacyCfgFile.isFile()) { return null; diff --git a/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java index 9b28ddd75..25f6c1f5d 100644 --- a/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java @@ -5,11 +5,13 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.InvocationBuilder; +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.WebTarget; import org.apache.commons.codec.binary.Base64; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import java.io.IOException; import static com.github.dockerjava.core.RemoteApiVersion.UNKNOWN_VERSION; @@ -33,11 +35,12 @@ protected WebTarget getBaseResource() { return baseResource; } + @CheckForNull protected AuthConfigurations getBuildAuthConfigs() { return dockerClientConfig.getAuthConfigurations(); } - protected String registryAuth(AuthConfig authConfig) { + protected String registryAuth(@Nonnull AuthConfig authConfig) { try { return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); } catch (IOException e) { @@ -45,7 +48,8 @@ protected String registryAuth(AuthConfig authConfig) { } } - protected String registryConfigs(AuthConfigurations authConfigs) { + @Nonnull + protected String registryConfigs(@Nonnull AuthConfigurations authConfigs) { try { final String json; final ObjectMapper objectMapper = new ObjectMapper(); @@ -68,11 +72,15 @@ protected String registryConfigs(AuthConfigurations authConfigs) { } } - protected InvocationBuilder resourceWithAuthConfig(AuthConfig authConfig, InvocationBuilder request) { + @Nonnull + protected InvocationBuilder resourceWithAuthConfig(@Nonnull AuthConfig authConfig, + @Nonnull InvocationBuilder request) { return request.header("X-Registry-Auth", registryAuth(authConfig)); } - protected InvocationBuilder resourceWithOptionalAuthConfig(AuthConfig authConfig, InvocationBuilder request) { + @Nonnull + protected InvocationBuilder resourceWithOptionalAuthConfig(@CheckForNull AuthConfig authConfig, + @Nonnull InvocationBuilder request) { if (authConfig != null) { request = resourceWithAuthConfig(authConfig, request); } diff --git a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java index bc37273cb..d05be2b3c 100644 --- a/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/BuildImageCmdExec.java @@ -12,6 +12,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.CheckForNull; + import static com.github.dockerjava.core.util.CacheFromEncoder.jsonEncode; import static org.apache.commons.lang.StringUtils.isNotBlank; @@ -31,8 +33,9 @@ private InvocationBuilder resourceWithOptionalAuthConfig(BuildImageCmd command, return request; } - private static AuthConfigurations firstNonNull(final AuthConfigurations fromCommand, - final AuthConfigurations fromConfig) { + @CheckForNull + private static AuthConfigurations firstNonNull(@CheckForNull final AuthConfigurations fromCommand, + @CheckForNull final AuthConfigurations fromConfig) { if (fromCommand != null) { return fromCommand; } diff --git a/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java index cafb4ac30..1ba0fd8c2 100644 --- a/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/PullImageCmdExec.java @@ -30,8 +30,9 @@ protected Void execute0(PullImageCmd command, ResultCallback r } LOGGER.trace("POST: {}", webResource); - resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request()).accept(MediaType.APPLICATION_OCTET_STREAM).post( - null, new TypeReference() { + resourceWithOptionalAuthConfig(command.getAuthConfig(), webResource.request()) + .accept(MediaType.APPLICATION_OCTET_STREAM) + .post(null, new TypeReference() { }, resultCallback); return null; diff --git a/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java b/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java index 7f121c69a..b7edb3001 100644 --- a/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java @@ -156,7 +156,7 @@ public void nonExistent() throws IOException { } private DockerConfigFile runTest(String testFileName) throws IOException { - return DockerConfigFile.loadConfig(new File(FILESROOT, testFileName)); + return DockerConfigFile.loadConfig(new File(FILESROOT, testFileName).getAbsolutePath()); } } From 92fb19bd6086ad741c01606483145415e5a06bd6 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 28 Nov 2018 00:35:56 +0300 Subject: [PATCH 38/66] Don't work with files --- .../java/com/github/dockerjava/core/DockerConfigFile.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java index df4fd6541..0cfaef1c0 100644 --- a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java @@ -119,6 +119,11 @@ public String toString() { @Nonnull public static DockerConfigFile loadConfig(@CheckForNull String dockerConfigPath) throws IOException { + // no any configs, but for empty auths return non null object + if (dockerConfigPath == null) { + return new DockerConfigFile(); + } + DockerConfigFile dockerConfig; //parse new docker config file format @@ -145,7 +150,7 @@ public static DockerConfigFile loadConfig(@CheckForNull String dockerConfigPath) } @CheckForNull - private static DockerConfigFile loadCurrentConfig(String dockerConfigPath) throws IOException { + private static DockerConfigFile loadCurrentConfig(@CheckForNull String dockerConfigPath) throws IOException { File dockerCfgFile = new File(dockerConfigPath, DOCKER_CFG); if (!dockerCfgFile.exists() || !dockerCfgFile.isFile()) { From 289fb1eb69a14deab1344433c5df4607282579ec Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 28 Nov 2018 00:37:07 +0300 Subject: [PATCH 39/66] in fact it could be null --- .../java/com/github/dockerjava/core/DockerConfigFile.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java index 0cfaef1c0..ac1e3cf28 100644 --- a/src/main/java/com/github/dockerjava/core/DockerConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/DockerConfigFile.java @@ -50,7 +50,7 @@ void addAuthConfig(AuthConfig config) { } @CheckForNull - public AuthConfig resolveAuthConfig(@Nonnull String hostname) { + public AuthConfig resolveAuthConfig(@CheckForNull String hostname) { if (StringUtils.isEmpty(hostname) || AuthConfig.DEFAULT_SERVER_ADDRESS.equals(hostname)) { return auths.get(AuthConfig.DEFAULT_SERVER_ADDRESS); } @@ -124,10 +124,8 @@ public static DockerConfigFile loadConfig(@CheckForNull String dockerConfigPath) return new DockerConfigFile(); } - DockerConfigFile dockerConfig; - //parse new docker config file format - dockerConfig = loadCurrentConfig(dockerConfigPath); + DockerConfigFile dockerConfig = loadCurrentConfig(dockerConfigPath); //parse old auth config file format if (dockerConfig == null) { From ef7843476b48b1fd9cabc5273376415b65650fc7 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 28 Nov 2018 00:46:37 +0300 Subject: [PATCH 40/66] [maven-release-plugin] prepare release 3.1.0-rc-7 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ae3627e59..6a52eab70 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-SNAPSHOT + 3.1.0-rc-7 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 + 3.1.0-rc-7 From eecc9045e1576a014180d747649d24e56f804a2b Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 28 Nov 2018 00:46:49 +0300 Subject: [PATCH 41/66] [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 6a52eab70..ae3627e59 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-rc-7 + 3.1.0-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 - 3.1.0-rc-7 + HEAD From 3d29559f5d5330b32c40236b864c6c102c99bc3a Mon Sep 17 00:00:00 2001 From: PawelJ-PL Date: Wed, 9 Jan 2019 18:00:43 +0100 Subject: [PATCH 42/66] Use Base64Url instead of Base64 (#1146) * Use Base64Url instead of Base64 * Replaced Base64 from Apache Commons with Guava --- .../github/dockerjava/core/exec/AbstrDockerCmdExec.java | 7 +++---- .../com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java index 25f6c1f5d..1ec333416 100644 --- a/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/AbstrDockerCmdExec.java @@ -8,7 +8,7 @@ import com.github.dockerjava.core.InvocationBuilder; import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.WebTarget; -import org.apache.commons.codec.binary.Base64; +import com.google.common.io.BaseEncoding; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -42,7 +42,7 @@ protected AuthConfigurations getBuildAuthConfigs() { protected String registryAuth(@Nonnull AuthConfig authConfig) { try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + return BaseEncoding.base64Url().encode(new ObjectMapper().writeValueAsString(authConfig).getBytes()); } catch (IOException e) { throw new RuntimeException(e); } @@ -65,8 +65,7 @@ protected String registryConfigs(@Nonnull AuthConfigurations authConfigs) { } else { json = objectMapper.writeValueAsString(authConfigs); } - - return Base64.encodeBase64String(json.getBytes()); + return BaseEncoding.base64Url().encode(json.getBytes()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index e5852f5ea..47681e20c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -6,7 +6,7 @@ import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.RemoteApiVersion; -import org.apache.commons.codec.binary.Base64; +import com.google.common.io.BaseEncoding; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; @@ -39,7 +39,7 @@ protected AuthConfigurations getBuildAuthConfigs() { protected String registryAuth(AuthConfig authConfig) { try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + return BaseEncoding.base64Url().encode(new ObjectMapper().writeValueAsString(authConfig).getBytes()); } catch (IOException e) { throw new RuntimeException(e); } @@ -74,7 +74,7 @@ protected String registryConfigs(AuthConfigurations authConfigs) { json = objectMapper.writeValueAsString(authConfigs); } - return Base64.encodeBase64String(json.getBytes()); + return BaseEncoding.base64Url().encode(json.getBytes()); } catch (IOException e) { throw new RuntimeException(e); } From 76053ab0d5423f089ee9f13ec49b3a0ca69a3146 Mon Sep 17 00:00:00 2001 From: Piotr Skowronek Date: Thu, 17 Jan 2019 21:59:18 +0100 Subject: [PATCH 43/66] Ignore exception while closing stream to let awaitCompletion finish before time-out (#1149) * Ignore exception while closing stream to let awaitCompletion finish before time-out * Ensure completed#countDown is called even if exception is thrown while closing stream --- .../dockerjava/core/async/ResultCallbackTemplate.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 f624eccd3..727c91164 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -74,10 +74,13 @@ public void onComplete() { public void close() throws IOException { if (!closed) { closed = true; - if (stream != null) { - stream.close(); + try { + if (stream != null) { + stream.close(); + } + } finally { + completed.countDown(); } - completed.countDown(); } } From ff3952c0f08c265c64c773b13b67e386dadb96ef Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 18 Jan 2019 01:21:48 +0300 Subject: [PATCH 44/66] [maven-release-plugin] prepare release 3.1.0-rc-8 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ae3627e59..7edd08c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-SNAPSHOT + 3.1.0-rc-8 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 + 3.1.0-rc-8 From 7e217028836e473c75906bb69c77c54f1ab33665 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 18 Jan 2019 01:21:57 +0300 Subject: [PATCH 45/66] [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 7edd08c5d..ae3627e59 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-rc-8 + 3.1.0-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 - 3.1.0-rc-8 + HEAD From 78bfa7a73b8052ff3b5c7462c058c37caccfa79e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 18 Jan 2019 02:16:11 +0300 Subject: [PATCH 46/66] Update CHANGELOG.md --- CHANGELOG.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f76b34dd..1f33d52b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,69 @@ Change Log === + +## 3.1.0-rc-8 +- Do awaitCompletion upon socket close exception +- Fix `X-Registry-Auth` base64 encoding + +## 3.1.0-rc-7 +- Fix NPE when docker config file doesn't exist + +## 3.1.0-rc-6 +- Add resize feature to container and exec +- Update part of apis to 1.37 +- Update dependencies +- Fix No serializer found for class com.githubdockerjava.api.model.ServiceGlobalModeOptions +- Add HostConfig.StorageOpt and ExecCreateCmd.Env +- Added GCPLOGS enum LoggingType +- Stop proxying HostConfig class (static helper provided) +- Add ExecCreateCmd.Env +- Add failcnt into memorystatsconfig +- Support some missing Engine APIs +- Added memory swappiness to create container command. +- Fix for ignore all files except specified + +## 3.1.0-rc-5 +- Add missing properties in InspectContainer response +- Add withFilter methods in ListNetworksCmd & ListVolumesCmd +- Add WorkingDir property in containers exec +- Add isolation property support in Info response +- Support platform option in image build/create/pull commands +- Add OSVersion and RootFS support in InspectImageResponse +- Fix double-marshalling of cachefrom +- make AuthConfig compatible with indentitytoken +- Allow netty to handle compressed response bodies + +## 3.1.0-rc-4 +- Update deps +- fix HTTP/1.1 compliance (missing Host header) +- support rollback_completed value in ServiceUpdateState +- Add Privileged property to ExecCreateCmd +- Encode spaces as %20 rather than + in URL params +- Add tmpfs mount support since v1.29 +- Add support for swarm service/task logs +- Add mapping annotations to custom constructor +- Support network mode as part of the docker build +- support "rollback" as value for UpdateFailureAction +- Add "Pid" field to InspectExecResponse +- Add DiskQuota to HostConfig and CreateContainerCmd +- Add AutoRemove to HostConfig +- follow symbolic links when walking dir +- Use path from the configured docker host instead of hardcoded "/var/run/docker.sock" in netty factory +- Configure JerseyDockerCmdExecFactory to avoid chunked encoding + +## 3.1.0-rc-3 +- export TmpFs configuration for HostConfig and DockerClient +- avoid double encoding for url query string + +## 3.1.0-rc-2 +- https://github.com/docker-java/docker-java/pulls?q=is%3Apr+milestone%3A3.1.0-rc-2+is%3Aclosed + ## 3.1.0-rc-1 A lot of changes... - Swarm Mode support. - Classic swarm support. - various netty improvements +- Implement AbstractDockerCmdExecFactory ## 3.0.14 From f47a373f8b532f175d7e0d1af111099f1e4a8c1b Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 19 Jan 2019 23:42:57 +0300 Subject: [PATCH 47/66] [maven-release-plugin] prepare release 3.1.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ae3627e59..7b4d6f117 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0-SNAPSHOT + 3.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 + 3.1.0 From 48726ea4c25d6390a77192cc5439c4d1395164c5 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 19 Jan 2019 23:43:09 +0300 Subject: [PATCH 48/66] [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 7b4d6f117..68ed60d7d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.0 + 3.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 - 3.1.0 + HEAD From b2dc629a74c06e084c60541b9cf4d9579df0283d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 20 Jan 2019 17:42:56 +0300 Subject: [PATCH 49/66] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c3dc39825..de96156a5 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ For secure tls (https) communication: DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2 ### Latest release version -Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x +Supports a subset of the Docker Remote API [v1.37](https://docs.docker.com/engine/api/v1.37/), Docker Server version since 1.12.6 com.github.docker-java @@ -62,7 +62,7 @@ Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/doc ### Latest development version -Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x +May contain new features while they are not released. You can find the latest development version including javadoc and source files on [Sonatypes OSS repository](https://oss.sonatype.org/content/groups/public/com/github/docker-java/docker-java/). @@ -101,7 +101,7 @@ In your application, e.g. .withDockerTlsVerify(true) .withDockerCertPath("/home/user/.docker/certs") .withDockerConfig("/home/user/.docker") - .withApiVersion("1.23") + .withApiVersion("1.30") // optional .withRegistryUrl("https://index.docker.io/v1/") .withRegistryUsername("dockeruser") .withRegistryPassword("ilovedocker") From a2df1fc9c40e4d40fb1e577131b5c9fa789c9a68 Mon Sep 17 00:00:00 2001 From: Benjamin Leber Date: Mon, 21 Jan 2019 13:17:07 +0100 Subject: [PATCH 50/66] ! [api/healthcheck] startPeriod is now a long As it is saved in nanoseconds, int is to small to save sensible values --- .../java/com/github/dockerjava/api/model/HealthCheck.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index a6581f261..2b0269770 100644 --- a/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -56,7 +56,7 @@ public class HealthCheck implements Serializable { * @since 1.26 */ @JsonProperty("StartPeriod") - private Integer startPeriod; + private Long startPeriod; public Long getInterval() { return interval; @@ -94,11 +94,11 @@ public HealthCheck withRetries(Integer retries) { return this; } - public Integer getStartPeriod() { + public Long getStartPeriod() { return startPeriod; } - public HealthCheck withStartPeriod(Integer startPeriod) { + public HealthCheck withStartPeriod(Long startPeriod) { this.startPeriod = startPeriod; return this; } From bac5740616352e1f2530c83488474294ec1c55ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gillouard=20Fr=C3=A9d=C3=A9ric?= Date: Wed, 23 Mar 2016 16:59:16 +0100 Subject: [PATCH 51/66] Patch save image with tag --- .../core/exec/SaveImageCmdExec.java | 20 ++++++++++++------- .../dockerjava/jaxrs/SaveImageCmdExec.java | 10 ++++++++-- .../github/dockerjava/cmd/SaveImageCmdIT.java | 4 ++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/exec/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/SaveImageCmdExec.java index d79d3539a..94001bd5c 100644 --- a/src/main/java/com/github/dockerjava/core/exec/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/core/exec/SaveImageCmdExec.java @@ -1,14 +1,14 @@ package com.github.dockerjava.core.exec; -import java.io.InputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.MediaType; import com.github.dockerjava.core.WebTarget; +import com.google.common.base.Strings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.InputStream; public class SaveImageCmdExec extends AbstrSyncDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); @@ -19,8 +19,14 @@ public SaveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientC @Override protected InputStream execute(SaveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get").queryParam("tag", - command.getTag()); + + String name = command.getName(); + if (!Strings.isNullOrEmpty(command.getTag())) { + name += ":" + command.getTag(); + } + + WebTarget webResource = getBaseResource(). + path("/images/" + name + "/get"); LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index f3f9a0d35..c386ea3a0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import com.google.common.base.Strings; public class SaveImageCmdExec extends AbstrSyncDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); @@ -22,8 +23,13 @@ public SaveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientC @Override protected InputStream execute(SaveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get").queryParam("tag", - command.getTag()); + // If tag is present, only tar the specific image + // else tar all the images with the same name + String name = command.getName(); + if (!Strings.isNullOrEmpty(command.getTag())) { + name += ":" + command.getTag(); + } + WebTarget webResource = getBaseResource().path("/images/" + name + "/get"); LOGGER.trace("GET: {}", webResource); Response response = webResource.request().accept(MediaType.APPLICATION_JSON).get(); diff --git a/src/test/java/com/github/dockerjava/cmd/SaveImageCmdIT.java b/src/test/java/com/github/dockerjava/cmd/SaveImageCmdIT.java index 81abfcd9a..a9ba8ac25 100644 --- a/src/test/java/com/github/dockerjava/cmd/SaveImageCmdIT.java +++ b/src/test/java/com/github/dockerjava/cmd/SaveImageCmdIT.java @@ -19,6 +19,10 @@ public void saveImage() throws Exception { InputStream image = IOUtils.toBufferedInputStream(dockerRule.getClient().saveImageCmd("busybox").exec()); assertThat(image.available(), greaterThan(0)); + InputStream image2 = IOUtils.toBufferedInputStream(dockerRule.getClient().saveImageCmd("busybox").withTag("latest").exec()); + assertThat(image2.available(), greaterThan(0)); + + } } From 0180514dd515feadf5bf2b546f3ea61ee462d32d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 29 Jan 2019 01:32:21 +0300 Subject: [PATCH 52/66] [maven-release-plugin] prepare release 3.1.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 68ed60d7d..7505c524f 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.1-SNAPSHOT + 3.1.1 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 + 3.1.1 From 4eef5ed7171ef6657d93bf72d6560028bb2c3c93 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Tue, 29 Jan 2019 01:32:30 +0300 Subject: [PATCH 53/66] [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 7505c524f..d13ae83e7 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.1 + 3.1.2-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 - 3.1.1 + HEAD From 7b249adec97b16956cd13e94c5bb9f1bd70ef6c9 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 6 Feb 2019 14:31:37 +0300 Subject: [PATCH 54/66] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f33d52b9..1c635aa69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Change Log === +## 3.1.1 +- Patch save image with tag +- [api/healthcheck] startPeriod is now a long + +## 3.1.0 +- Release + ## 3.1.0-rc-8 - Do awaitCompletion upon socket close exception - Fix `X-Registry-Auth` base64 encoding From 9434b6e5357c6bf0fd635c801891f974e2a2e498 Mon Sep 17 00:00:00 2001 From: Matt Wright Date: Fri, 15 Feb 2019 15:14:23 -0500 Subject: [PATCH 55/66] Add support for `target` parameter in BuildImgCmd --- .../dockerjava/api/command/BuildImageCmd.java | 11 +++++++++++ .../dockerjava/core/command/BuildImageCmdImpl.java | 13 +++++++++++++ .../dockerjava/core/exec/BuildImageCmdExec.java | 4 ++++ .../github/dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++++ 4 files changed, 32 insertions(+) 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 3545f116a..89d20f531 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -140,6 +140,12 @@ public interface BuildImageCmd extends AsyncDockerCmd { } 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 97be7d1c0..2bafce8c8 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -70,6 +70,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd webTarget = webTarget.queryParam("platform", command.getPlatform()); } + if (command.getTarget() != null) { + webTarget = webTarget.queryParam("target", command.getTarget()); + } + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index d1211c930..49d83eaf9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -128,6 +128,10 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("platform", command.getPlatform()); } + if (command.getTarget() != null) { + webTarget = webTarget.queryParam("target", command.getTarget()); + } + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); From 2cdefd90289c90db80fa70c9756bf94e5008fffb Mon Sep 17 00:00:00 2001 From: John Bergqvist Date: Mon, 18 Feb 2019 08:51:09 +0000 Subject: [PATCH 56/66] Add unit tests for netty.handler.FramedResponseStreamHandler These tests were written with the aid of Diffblue Cover. --- .../FramedResponseStreamHandlerTest.java | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java diff --git a/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java b/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java new file mode 100644 index 000000000..7724b666a --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java @@ -0,0 +1,184 @@ +package com.github.dockerjava.netty.handler; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.netty.handler.FramedResponseStreamHandler; +import java.io.Closeable; +import java.util.ArrayList; +import java.util.List; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class FramedResponseStreamHandlerTest { + + public class MockedResponseHandler implements ResultCallback { + + public List frames = new ArrayList(); + public List exceptions = new ArrayList(); + + @Override + public void close() { + } + + @Override + public void onStart(Closeable closeable) { + } + + @Override + public void onNext(Frame object) { + frames.add(object); + } + + @Override + public void onError(Throwable throwable) { + exceptions.add(throwable); + } + + @Override + public void onComplete() { + } + } + + + @Test + public void channelRead0emptyHeaderCount() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertTrue(responseHandler.frames.isEmpty()); + } + + @Test + public void channelRead0headerTooSmall() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertTrue(responseHandler.frames.isEmpty()); + } + + @Test + public void channelRead0rawStream() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {3, 0, 0, 0, 0, 0, 0, 0, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertEquals(responseHandler.frames.get(0).toString(), "RAW: "); + } + + @Test + public void channelRead0emptyNonRaw() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertTrue(responseHandler.frames.isEmpty()); + } + + @Test + public void channelRead0stdIn() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {0, 0, 0, 0, 0, 0, 0, 1, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertEquals(responseHandler.frames.get(0).toString(), "STDIN: "); + } + + @Test + public void channelRead0stdOut() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {1, 0, 0, 0, 0, 0, 0, 1, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertEquals(responseHandler.frames.get(0).toString(), "STDOUT: "); + } + + @Test + public void channelRead0stdErr() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {2, 0, 0, 0, 0, 0, 0, 1, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertEquals(responseHandler.frames.get(0).toString(), "STDERR: "); + } + + @Test + public void channelRead0largePayload() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + byte[] msg = {1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0}; + + // Act + objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); + + // Assert result + assertEquals(responseHandler.frames.get(0).toString(), "STDOUT: "); + } + + @Test + public void exceptionCaught() throws Exception { + + // Arrange + final MockedResponseHandler responseHandler = new MockedResponseHandler(); + final FramedResponseStreamHandler objectUnderTest = new FramedResponseStreamHandler(responseHandler); + final Exception exception = new Exception(); + final Throwable throwable = new Throwable(); + throwable.initCause(exception); + + // Act + objectUnderTest.exceptionCaught(Mockito.mock(ChannelHandlerContext.class), throwable); + + // Assert result + assertEquals(responseHandler.exceptions.get(0).getCause(), exception); + } +} From 89b80a969cdaec294bb6d14986cdcd5966e460da Mon Sep 17 00:00:00 2001 From: padas2 Date: Wed, 20 Feb 2019 00:55:58 +0530 Subject: [PATCH 57/66] Feature/upgrade to latest junix socket dependency to 2.2.0 (#1159) * Upgrading docker-java from 2.0.4 to 2.1.0 * Logged the changes in ChangeLog.md as well * Added AFUNIXSocketException class which is missing in 2.1.0 version of junixsocket-common * Adding whitespaces to appease the maven checkstyle plugin * Removing AFUNIXSocketImpl and AFUNIXSocketException classes * Update pom.xml --- pom.xml | 2 +- .../newsclub/net/unix/AFUNIXSocketImpl.java | 415 ------------------ 2 files changed, 1 insertion(+), 416 deletions(-) delete mode 100644 src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java diff --git a/pom.xml b/pom.xml index d13ae83e7..37b44b412 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ 1.7.25 1.60 - 2.0.4 + 2.1.2 19.0 diff --git a/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java b/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java deleted file mode 100644 index 869d987f2..000000000 --- a/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java +++ /dev/null @@ -1,415 +0,0 @@ -// Modified version (see https://github.com/docker-java/docker-java/pull/697) -/** - * junixsocket - * - * Copyright (c) 2009,2014 Christian Kohlschütter - * - * The author 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. - */ -package org.newsclub.net.unix; - -import java.io.FileDescriptor; -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.net.SocketImpl; -import java.net.SocketOptions; - -/** - * The Java-part of the {@link AFUNIXSocket} implementation. - * - * @author Christian Kohlschütter - */ -class AFUNIXSocketImpl extends SocketImpl { - private static final int SHUT_RD = 0; - private static final int SHUT_WR = 1; - private static final int SHUT_RD_WR = 2; - - private String socketFile; - private boolean closed = false; - private boolean bound = false; - private boolean connected = false; - - private boolean closedInputStream = false; - private boolean closedOutputStream = false; - - private final AFUNIXInputStream in = new AFUNIXInputStream(); - private final AFUNIXOutputStream out = new AFUNIXOutputStream(); - - AFUNIXSocketImpl() { - super(); - this.fd = new FileDescriptor(); - } - - FileDescriptor getFD() { - return fd; - } - - @Override - protected void accept(SocketImpl socket) throws IOException { - final AFUNIXSocketImpl si = (AFUNIXSocketImpl) socket; - NativeUnixSocket.accept(socketFile, fd, si.fd); - si.socketFile = socketFile; - si.connected = true; - } - - @Override - protected int available() throws IOException { - return NativeUnixSocket.available(fd); - } - - protected void bind(SocketAddress addr) throws IOException { - bind(0, addr); - } - - protected void bind(int backlog, SocketAddress addr) throws IOException { - if (!(addr instanceof AFUNIXSocketAddress)) { - throw new SocketException("Cannot bind to this type of address: " + addr.getClass()); - } - final AFUNIXSocketAddress socketAddress = (AFUNIXSocketAddress) addr; - socketFile = socketAddress.getSocketFile(); - NativeUnixSocket.bind(socketFile, fd, backlog); - bound = true; - this.localport = socketAddress.getPort(); - } - - @Override - @SuppressWarnings("hiding") - protected void bind(InetAddress host, int port) throws IOException { - throw new SocketException("Cannot bind to this type of address: " + InetAddress.class); - } - - private void checkClose() throws IOException { - //if (closedInputStream && closedOutputStream) { - // close(); - //} - } - - @Override - protected synchronized void close() throws IOException { - if (closed) { - return; - } - closed = true; - if (fd.valid()) { - NativeUnixSocket.shutdown(fd, SHUT_RD_WR); - NativeUnixSocket.close(fd); - } - if (bound) { - NativeUnixSocket.unlink(socketFile); - } - connected = false; - } - - @Override - @SuppressWarnings("hiding") - protected void connect(String host, int port) throws IOException { - throw new SocketException("Cannot bind to this type of address: " + InetAddress.class); - } - - @Override - @SuppressWarnings("hiding") - protected void connect(InetAddress address, int port) throws IOException { - throw new SocketException("Cannot bind to this type of address: " + InetAddress.class); - } - - @Override - protected void connect(SocketAddress addr, int timeout) throws IOException { - if (!(addr instanceof AFUNIXSocketAddress)) { - throw new SocketException("Cannot bind to this type of address: " + addr.getClass()); - } - final AFUNIXSocketAddress socketAddress = (AFUNIXSocketAddress) addr; - socketFile = socketAddress.getSocketFile(); - NativeUnixSocket.connect(socketFile, fd); - this.address = socketAddress.getAddress(); - this.port = socketAddress.getPort(); - this.localport = 0; - this.connected = true; - } - - @Override - protected void create(boolean stream) throws IOException { - } - - @Override - protected InputStream getInputStream() throws IOException { - if (!connected && !bound) { - throw new IOException("Not connected/not bound"); - } - return in; - } - - @Override - protected OutputStream getOutputStream() throws IOException { - if (!connected && !bound) { - throw new IOException("Not connected/not bound"); - } - return out; - } - - @Override - protected void listen(int backlog) throws IOException { - NativeUnixSocket.listen(fd, backlog); - } - - @Override - protected void sendUrgentData(int data) throws IOException { - NativeUnixSocket.write(fd, new byte[] {(byte) (data & 0xFF)}, 0, 1); - } - - private final class AFUNIXInputStream extends InputStream { - private boolean streamClosed = false; - - @Override - public int read(byte[] buf, int off, int len) throws IOException { - if (streamClosed) { - throw new IOException("This InputStream has already been closed."); - } - if (len == 0) { - return 0; - } - if (closed) { - return -1; - } - int maxRead = buf.length - off; - if (len > maxRead) { - len = maxRead; - } - try { - return NativeUnixSocket.read(fd, buf, off, len); - } catch (final IOException e) { - throw (IOException) new IOException(e.getMessage() + " at " - + AFUNIXSocketImpl.this.toString()).initCause(e); - } - } - - @Override - public int read() throws IOException { - final byte[] buf1 = new byte[1]; - final int numRead = read(buf1, 0, 1); - if (numRead <= 0) { - return -1; - } else { - return buf1[0] & 0xFF; - } - } - - @Override - public void close() throws IOException { - if (streamClosed) { - return; - } - streamClosed = true; - if (fd.valid()) { - NativeUnixSocket.shutdown(fd, SHUT_RD); - } - - closedInputStream = true; - checkClose(); - } - - @Override - public int available() throws IOException { - final int av = NativeUnixSocket.available(fd); - return av; - } - } - - private final class AFUNIXOutputStream extends OutputStream { - private boolean streamClosed = false; - - @Override - public void write(int oneByte) throws IOException { - final byte[] buf1 = new byte[] {(byte) oneByte}; - write(buf1, 0, 1); - } - - @Override - public void write(byte[] buf, int off, int len) throws IOException { - if (streamClosed) { - throw new AFUNIXSocketException("This OutputStream has already been closed."); - } - if (len > buf.length - off) { - throw new IndexOutOfBoundsException(); - } - try { - while (len > 0 && !Thread.interrupted()) { - final int written = NativeUnixSocket.write(fd, buf, off, len); - if (written == -1) { - throw new IOException("Unspecific error while writing"); - } - len -= written; - off += written; - } - } catch (final IOException e) { - throw (IOException) new IOException(e.getMessage() + " at " - + AFUNIXSocketImpl.this.toString()).initCause(e); - } - } - - @Override - public void close() throws IOException { - if (streamClosed) { - return; - } - streamClosed = true; - if (fd.valid()) { - NativeUnixSocket.shutdown(fd, SHUT_WR); - } - closedOutputStream = true; - checkClose(); - } - } - - @Override - public String toString() { - return super.toString() + "[fd=" + fd + "; file=" + this.socketFile + "; connected=" - + connected + "; bound=" + bound + "]"; - } - - private static int expectInteger(Object value) throws SocketException { - try { - return (Integer) value; - } catch (final ClassCastException e) { - throw new AFUNIXSocketException("Unsupported value: " + value, e); - } catch (final NullPointerException e) { - throw new AFUNIXSocketException("Value must not be null", e); - } - } - - private static int expectBoolean(Object value) throws SocketException { - try { - return ((Boolean) value).booleanValue() ? 1 : 0; - } catch (final ClassCastException e) { - throw new AFUNIXSocketException("Unsupported value: " + value, e); - } catch (final NullPointerException e) { - throw new AFUNIXSocketException("Value must not be null", e); - } - } - - @Override - public Object getOption(int optID) throws SocketException { - try { - switch (optID) { - case SocketOptions.SO_KEEPALIVE: - case SocketOptions.TCP_NODELAY: - return NativeUnixSocket.getSocketOptionInt(fd, optID) != 0 ? true : false; - case SocketOptions.SO_LINGER: - case SocketOptions.SO_TIMEOUT: - case SocketOptions.SO_RCVBUF: - case SocketOptions.SO_SNDBUF: - return NativeUnixSocket.getSocketOptionInt(fd, optID); - default: - throw new AFUNIXSocketException("Unsupported option: " + optID); - } - } catch (final AFUNIXSocketException e) { - throw e; - } catch (final Exception e) { - throw new AFUNIXSocketException("Error while getting option", e); - } - } - - @Override - public void setOption(int optID, Object value) throws SocketException { - try { - switch (optID) { - case SocketOptions.SO_LINGER: - - if (value instanceof Boolean) { - final boolean b = (Boolean) value; - if (b) { - throw new SocketException("Only accepting Boolean.FALSE here"); - } - NativeUnixSocket.setSocketOptionInt(fd, optID, -1); - return; - } - NativeUnixSocket.setSocketOptionInt(fd, optID, expectInteger(value)); - return; - case SocketOptions.SO_RCVBUF: - case SocketOptions.SO_SNDBUF: - case SocketOptions.SO_TIMEOUT: - NativeUnixSocket.setSocketOptionInt(fd, optID, expectInteger(value)); - return; - case SocketOptions.SO_KEEPALIVE: - case SocketOptions.TCP_NODELAY: - NativeUnixSocket.setSocketOptionInt(fd, optID, expectBoolean(value)); - return; - default: - throw new AFUNIXSocketException("Unsupported option: " + optID); - } - } catch (final AFUNIXSocketException e) { - throw e; - } catch (final Exception e) { - throw new AFUNIXSocketException("Error while setting option", e); - } - } - - @Override - protected void shutdownInput() throws IOException { - if (!closed && fd.valid()) { - NativeUnixSocket.shutdown(fd, SHUT_RD); - } - } - - @Override - protected void shutdownOutput() throws IOException { - if (!closed && fd.valid()) { - NativeUnixSocket.shutdown(fd, SHUT_WR); - } - } - - /** - * Changes the behavior to be somewhat lenient with respect to the specification. - * - * In particular, we ignore calls to {@link Socket#getTcpNoDelay()} and - * {@link Socket#setTcpNoDelay(boolean)}. - */ - static class Lenient extends AFUNIXSocketImpl { - Lenient() { - super(); - } - - @Override - public void setOption(int optID, Object value) throws SocketException { - try { - super.setOption(optID, value); - } catch (SocketException e) { - switch (optID) { - case SocketOptions.TCP_NODELAY: - return; - default: - throw e; - } - } - } - - @Override - public Object getOption(int optID) throws SocketException { - try { - return super.getOption(optID); - } catch (SocketException e) { - switch (optID) { - case SocketOptions.TCP_NODELAY: - case SocketOptions.SO_KEEPALIVE: - return false; - default: - throw e; - } - } - } - } -} From ce113f37d784d8a727aa58acfb3c08d1873bc5ad Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 20 Feb 2019 18:14:41 +0300 Subject: [PATCH 58/66] Set 3 mb as limit for json responce. (#1162) --- .../com/github/dockerjava/netty/NettyInvocationBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java index 39ea98c51..c57f885be 100644 --- a/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java @@ -151,7 +151,7 @@ public void get(TypeReference typeReference, ResultCallback resultCall HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new JsonObjectDecoder(3 * 1024 * 1024)); channel.pipeline().addLast(jsonResponseHandler); sendRequest(requestProvider, channel); @@ -300,7 +300,7 @@ public void post(final Object entity, TypeReference typeReference, final HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new JsonObjectDecoder(3 * 1024 * 1024)); channel.pipeline().addLast(jsonResponseHandler); sendRequest(requestProvider, channel); @@ -408,7 +408,7 @@ public void post(TypeReference typeReference, ResultCallback resultCal channel.pipeline().addLast(new ChunkedWriteHandler()); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new JsonObjectDecoder(3 * 1024 * 1024)); channel.pipeline().addLast(jsonResponseHandler); postChunkedStreamRequest(requestProvider, channel, body); From a856b67f80533936a238485e9cbcb638893b5e96 Mon Sep 17 00:00:00 2001 From: Michiel Leegwater Date: Wed, 27 Feb 2019 23:32:33 +0100 Subject: [PATCH 59/66] Updating Jackson due to CVEs Jackson data bind has CVE-2018-1000873, CVE-2018-19360, CVE-2018-19361, CVE-2018-19362 reported on the library. These are fixed in version 2.9.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 37b44b412..855d0344c 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1.7 2.27 - 2.9.7 + 2.9.8 4.5.6 1.18 1.11 From bacbbf621df700b632a038772c8304c5a5354005 Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Fri, 8 Mar 2019 12:17:24 +0100 Subject: [PATCH 60/66] Make StatsConfig public --- src/main/java/com/github/dockerjava/api/model/StatsConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/model/StatsConfig.java b/src/main/java/com/github/dockerjava/api/model/StatsConfig.java index a732c78fa..19b95a7ff 100644 --- a/src/main/java/com/github/dockerjava/api/model/StatsConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/StatsConfig.java @@ -5,7 +5,7 @@ import javax.annotation.CheckForNull; import java.io.Serializable; -class StatsConfig implements Serializable { +public class StatsConfig implements Serializable { private static final long serialVersionUID = 1L; @JsonProperty("active_anon") From 13d53057902afce60a3d12c5e641fcbc2e5ff907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Kov=C3=A1=C5=99?= Date: Sat, 9 Mar 2019 05:19:16 +0100 Subject: [PATCH 61/66] Add prune operations (#1164) * add Prune operations * repair method name in DockerClient * make source code Checkstyle compliant * make source code Checkstyle compliant * add URL escape to filters parameter --- .../github/dockerjava/api/DockerClient.java | 9 ++ .../api/command/DockerCmdExecFactory.java | 7 ++ .../dockerjava/api/command/PruneCmd.java | 54 ++++++++++ .../dockerjava/api/model/PruneResponse.java | 65 +++++++++++ .../dockerjava/api/model/PruneType.java | 9 ++ .../core/AbstractDockerCmdExecFactory.java | 7 ++ .../dockerjava/core/DockerClientImpl.java | 8 ++ .../dockerjava/core/command/PruneCmdImpl.java | 102 ++++++++++++++++++ .../dockerjava/core/exec/PruneCmdExec.java | 40 +++++++ .../dockerjava/core/util/FiltersBuilder.java | 31 ++++++ .../jaxrs/JerseyDockerCmdExecFactory.java | 6 ++ .../github/dockerjava/jaxrs/PruneCmdExec.java | 41 +++++++ .../core/TestDockerCmdExecFactory.java | 6 ++ 13 files changed, 385 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/api/command/PruneCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/model/PruneResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/model/PruneType.java create mode 100644 src/main/java/com/github/dockerjava/core/command/PruneCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/exec/PruneCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/PruneCmdExec.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 24ed54dcf..ddc23dca8 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -42,6 +42,7 @@ import com.github.dockerjava.api.command.LogSwarmObjectCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; @@ -68,6 +69,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PruneType; import com.github.dockerjava.api.model.ServiceSpec; import com.github.dockerjava.api.model.SwarmSpec; import com.github.dockerjava.core.RemoteApiVersion; @@ -391,6 +393,13 @@ public interface DockerClient extends Closeable { */ LogSwarmObjectCmd logTaskCmd(String taskId); + /** + * Command to delete unused containers/images/networks/volumes + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + PruneCmd pruneCmd(PruneType pruneType); + @Override 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 3392ce372..f9c142255 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -207,6 +207,13 @@ public interface DockerCmdExecFactory extends Closeable { */ ListTasksCmd.Exec listTasksCmdExec(); + /** + * Delete unused content (containers, images, volumes, networks, build relicts) + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + PruneCmd.Exec pruneCmdExec(); + @Override void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/PruneCmd.java b/src/main/java/com/github/dockerjava/api/command/PruneCmd.java new file mode 100644 index 000000000..7a86434aa --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/PruneCmd.java @@ -0,0 +1,54 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.PruneResponse; +import com.github.dockerjava.api.model.PruneType; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Map; + +/** + * Delete unused content (containers, images, volumes, networks, build relicts) + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ +public interface PruneCmd extends SyncDockerCmd { + + @Nonnull + PruneType getPruneType(); + + @Nonnull + String getApiPath(); + + @CheckForNull + Map> getFilters(); + + PruneCmd withPruneType(final PruneType pruneType); + /** + * Prune containers created before this timestamp + * Meaningful only for CONTAINERS and IMAGES prune type + * @param until Can be Unix timestamps, date formatted timestamps, + * or Go duration strings (e.g. 10m, 1h30m) computed relative to the daemon machine’s time. + */ + PruneCmd withUntilFilter(String until); + + /** + * When set to true, prune only unused and untagged images. When set to false, all unused images are pruned. + * Meaningful only for IMAGES prune type + */ + PruneCmd withDangling(Boolean dangling); + + /** + * Prune containers with the specified labels + */ + PruneCmd withLabelFilter(String... label); + + @Override + PruneResponse exec(); + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/PruneResponse.java b/src/main/java/com/github/dockerjava/api/model/PruneResponse.java new file mode 100644 index 000000000..d6653cdc6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PruneResponse.java @@ -0,0 +1,65 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +import java.io.Serializable; + +/** + * Delete unused content (containers, images, volumes, networks, build relicts) + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class PruneResponse implements Serializable { + private static final long serialVersionUID = 1L; + + @JsonProperty("SpaceReclaimed") + private Long spaceReclaimed; + + /** + * Default constructor for the deserialization. + */ + public PruneResponse() { + } + + /** + * Constructor. + * + * @param spaceReclaimed Space reclaimed after purification + */ + public PruneResponse(Long spaceReclaimed) { + this.spaceReclaimed = spaceReclaimed; + } + + /** + * Disk space reclaimed in bytes + */ + public Long getSpaceReclaimed() { + return spaceReclaimed; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("PruneResponse {"); + sb.append(" spaceReclaimed: ").append(getSpaceReclaimed()); + sb.append("}"); + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (o instanceof Ulimit) { + Ulimit other = (Ulimit) o; + return new EqualsBuilder().append(spaceReclaimed, other.getName()).isEquals(); + } else { + return super.equals(o); + } + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(spaceReclaimed).toHashCode(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/PruneType.java b/src/main/java/com/github/dockerjava/api/model/PruneType.java new file mode 100644 index 000000000..10d8704fd --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/PruneType.java @@ -0,0 +1,9 @@ +package com.github.dockerjava.api.model; + +public enum PruneType { + BUILD, + CONTAINERS, + IMAGES, + NETWORKS, + VOLUMES +} diff --git a/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java index 91347de2b..c822b4cc2 100644 --- a/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java @@ -44,6 +44,7 @@ import com.github.dockerjava.api.command.LogSwarmObjectCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; @@ -110,6 +111,7 @@ import com.github.dockerjava.core.exec.LogContainerCmdExec; import com.github.dockerjava.core.exec.PauseContainerCmdExec; import com.github.dockerjava.core.exec.PingCmdExec; +import com.github.dockerjava.core.exec.PruneCmdExec; import com.github.dockerjava.core.exec.PullImageCmdExec; import com.github.dockerjava.core.exec.PushImageCmdExec; import com.github.dockerjava.core.exec.RemoveContainerCmdExec; @@ -492,5 +494,10 @@ public LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint) { return new LogSwarmObjectExec(getBaseResource(), getDockerClientConfig(), endpoint); } + @Override + public PruneCmd.Exec pruneCmdExec() { + return new PruneCmdExec(getBaseResource(), getDockerClientConfig()); + } + protected abstract WebTarget getBaseResource(); } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index edc634cb9..edf3bfc29 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -44,6 +44,7 @@ import com.github.dockerjava.api.command.LogSwarmObjectCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; @@ -69,6 +70,7 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PruneType; import com.github.dockerjava.api.model.ServiceSpec; import com.github.dockerjava.api.model.SwarmSpec; import com.github.dockerjava.core.command.AttachContainerCmdImpl; @@ -113,6 +115,7 @@ import com.github.dockerjava.core.command.LogSwarmObjectImpl; import com.github.dockerjava.core.command.PauseContainerCmdImpl; import com.github.dockerjava.core.command.PingCmdImpl; +import com.github.dockerjava.core.command.PruneCmdImpl; import com.github.dockerjava.core.command.PullImageCmdImpl; import com.github.dockerjava.core.command.PushImageCmdImpl; import com.github.dockerjava.core.command.RemoveContainerCmdImpl; @@ -579,6 +582,11 @@ public LogSwarmObjectCmd logTaskCmd(String taskId) { return new LogSwarmObjectImpl(getDockerCmdExecFactory().logSwarmObjectExec("tasks"), taskId); } + @Override + public PruneCmd pruneCmd(PruneType pruneType) { + return new PruneCmdImpl(getDockerCmdExecFactory().pruneCmdExec(), pruneType); + } + @Override public ListTasksCmd listTasksCmd() { return new ListTasksCmdImpl(getDockerCmdExecFactory().listTasksCmdExec()); diff --git a/src/main/java/com/github/dockerjava/core/command/PruneCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PruneCmdImpl.java new file mode 100644 index 000000000..a191099ed --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/PruneCmdImpl.java @@ -0,0 +1,102 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.PruneCmd; +import com.github.dockerjava.api.model.PruneResponse; +import com.github.dockerjava.api.model.PruneType; +import com.github.dockerjava.core.util.FiltersBuilder; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Map; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Delete unused content (containers, images, volumes, networks, build relicts) + */ +public class PruneCmdImpl extends AbstrDockerCmd implements PruneCmd { + + private static final String BUILD_API_PATH = "/build/prune"; + private static final String CONTAINERS_API_PATH = "/containers/prune"; + private static final String IMAGES_API_PATH = "/images/prune"; + private static final String VOLUMES_API_PATH = "/volumes/prune"; + private static final String NETWORKS_API_PATH = "/networks/prune"; + + private FiltersBuilder filters = new FiltersBuilder(); + private PruneType pruneType; + + public PruneCmdImpl(Exec exec, PruneType pruneType) { + super(exec); + this.pruneType = pruneType; + } + + @Nonnull + @Override + public PruneType getPruneType() { + return pruneType; + } + + @Nonnull + @Override + public String getApiPath() { + String apiPath; + switch (getPruneType()) { + case BUILD: + apiPath = BUILD_API_PATH; + break; + case IMAGES: + apiPath = IMAGES_API_PATH; + break; + case NETWORKS: + apiPath = NETWORKS_API_PATH; + break; + case VOLUMES: + apiPath = VOLUMES_API_PATH; + break; + default: + apiPath = CONTAINERS_API_PATH; + break; + } + return apiPath; + } + + @CheckForNull + @Override + public Map> getFilters() { + return filters.build(); + } + + @Override + public PruneCmd withPruneType(final PruneType pruneType) { + checkNotNull(pruneType, "pruneType has not been specified"); + this.pruneType = pruneType; + return this; + } + + @Override + public PruneCmd withDangling(Boolean dangling) { + checkNotNull(dangling, "dangling has not been specified"); + filters.withFilter("dangling", dangling ? "1" : "0"); + return this; + } + + @Override + public PruneCmd withUntilFilter(final String until) { + checkNotNull(until, "until has not been specified"); + filters.withUntil(until); + return this; + } + + @Override + public PruneCmd withLabelFilter(final String... labels) { + checkNotNull(labels, "labels have not been specified"); + filters.withLabels(labels); + return this; + } + + @Override + public PruneResponse exec() { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/exec/PruneCmdExec.java b/src/main/java/com/github/dockerjava/core/exec/PruneCmdExec.java new file mode 100644 index 000000000..0b8832bcb --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/exec/PruneCmdExec.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.core.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.PruneCmd; +import com.github.dockerjava.api.model.PruneResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.MediaType; +import com.github.dockerjava.core.WebTarget; +import com.github.dockerjava.core.util.FiltersEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PruneCmdExec extends AbstrSyncDockerCmdExec implements PruneCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PruneCmdExec.class); + + + public PruneCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected PruneResponse execute(PruneCmd command) { + WebTarget webTarget = getBaseResource().path(command.getApiPath()); + + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", FiltersEncoder.jsonEncode(command.getFilters())); + } + + LOGGER.trace("POST: {}", webTarget); + + PruneResponse response = webTarget.request().accept(MediaType.APPLICATION_JSON) + .post(null, new TypeReference() { }); + + LOGGER.trace("Response: {}", response); + + return response; + } + +} diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index 0c414f983..d942e59e0 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core.util; +import com.google.common.base.Strings; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -7,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.regex.Pattern; /** * Representation of Docker filters. @@ -16,6 +19,14 @@ */ public class FiltersBuilder { + private static final Pattern UNTIL_TIMESTAMP_PATTERN = + Pattern.compile("^\\d{1,10}$"); + private static final Pattern UNTIL_DATETIME_PATTERN = + Pattern.compile("^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])([Tt]([01][0-9]|2[0-3]):([0-5][0-9]):" + + "([0-5][0-9]|60)(\\.[0-9]+)?)?(([Zz])|([\\+|\\-]([01][0-9]|2[0-3]):[0-5][0-9]))?$"); + private static final Pattern UNTIL_GO_PATTERN = + Pattern.compile("^([1-9][0-9]*h)?([1-9][0-9]*m)?([1-9][0-9]*s)?$"); + private Map> filters = new HashMap>(); public FiltersBuilder() { @@ -75,6 +86,14 @@ public FiltersBuilder withLabels(Map labels) { return this; } + public FiltersBuilder withUntil(String until) throws NumberFormatException { + if (!isValidUntil(until)) { + throw new NumberFormatException("Not valid format of 'until': " + until); + } + + return withFilter("until", until); + } + private static List labelsMapToList(Map labels) { List result = new ArrayList(); for (Entry entry : labels.entrySet()) { @@ -87,6 +106,18 @@ private static List labelsMapToList(Map labels) { return result; } + private boolean isValidUntil(String until) { + if (UNTIL_DATETIME_PATTERN.matcher(until).matches()) { + return true; + } else if (!Strings.isNullOrEmpty(until) && UNTIL_GO_PATTERN.matcher(until).matches()) { + return true; + } else if (UNTIL_TIMESTAMP_PATTERN.matcher(until).matches()) { + return true; + } + + return false; + } + // CHECKSTYLE:OFF @Override public boolean equals(Object o) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java index 5712163d1..1582d5313 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java @@ -47,6 +47,7 @@ import com.github.dockerjava.api.command.LogSwarmObjectCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; @@ -658,6 +659,11 @@ public ListTasksCmd.Exec listTasksCmdExec() { return new ListTasksCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public PruneCmd.Exec pruneCmdExec() { + return new PruneCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public void close() throws IOException { checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); diff --git a/src/main/java/com/github/dockerjava/jaxrs/PruneCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PruneCmdExec.java new file mode 100644 index 000000000..324bc8201 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/PruneCmdExec.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.PruneCmd; +import com.github.dockerjava.api.model.PruneResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class PruneCmdExec extends AbstrSyncDockerCmdExec implements PruneCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PruneCmdExec.class); + + public PruneCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected PruneResponse execute(PruneCmd command) { + WebTarget webTarget = getBaseResource().path(command.getApiPath()); + + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } + + LOGGER.trace("POST: {}", webTarget); + + PruneResponse response = webTarget.request().accept(MediaType.APPLICATION_JSON) + .post(null, new GenericType() { }); + LOGGER.trace("Response: {}", response); + + return response; + } + +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index e2986ef69..a3c96e54d 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -49,6 +49,7 @@ import com.github.dockerjava.api.command.LogSwarmObjectCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.command.RemoveContainerCmd; @@ -526,6 +527,11 @@ public ListTasksCmd.Exec listTasksCmdExec() { return delegate.listTasksCmdExec(); } + @Override + public PruneCmd.Exec pruneCmdExec() { + return delegate.pruneCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } From 2f83759c6850ae219ff2261bccfa03172ec870f2 Mon Sep 17 00:00:00 2001 From: Sebastian Schuberth Date: Tue, 19 Mar 2019 22:10:44 +0100 Subject: [PATCH 62/66] BuildImageCmdImpl: Fix an exception message The exception is thrown is if "dockerFile" is not a file, not if it is not a directory. --- .../com/github/dockerjava/core/command/BuildImageCmdImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2bafce8c8..0384ba145 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -327,7 +327,7 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) { throw new IllegalArgumentException("Dockerfile does not exist"); } if (!dockerfile.isFile()) { - throw new IllegalArgumentException("Not a directory"); + throw new IllegalArgumentException("Dockerfile is not a file"); } if (baseDirectory == null) { From 8e2150a9d8880e98b2ec3e729fc191e336a124b2 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Wed, 20 Mar 2019 12:26:04 +0100 Subject: [PATCH 63/66] Remove `JacksonJaxbJsonProvider` from `FiltersEncoder` To avoid a dependency on JAX-RS, `JacksonJaxbJsonProvider` should not be used where a standard `ObjectMapper` instance is enough. --- .../java/com/github/dockerjava/core/util/FiltersEncoder.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java index fd4c0d5ab..7b1e34f74 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -3,11 +3,8 @@ import java.util.List; import java.util.Map; -import javax.ws.rs.core.MediaType; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; /** * JSON Encoder for docker filters. @@ -19,7 +16,7 @@ public class FiltersEncoder { private FiltersEncoder() { } - private static final ObjectMapper MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, MediaType.APPLICATION_JSON_TYPE); + private static final ObjectMapper MAPPER = new ObjectMapper(); public static String jsonEncode(Map> mapStringListString) { try { From 235e91a66696fabd5dfb407eed27fc4679b1e49c Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 24 Mar 2019 17:55:16 +0300 Subject: [PATCH 64/66] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 855d0344c..ef354cda0 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ 1.7.25 1.60 - 2.1.2 + 2.2.0 19.0 From c8c8e9a5f82d073887db889195489077bc25b3aa Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 25 Mar 2019 17:46:59 +0300 Subject: [PATCH 65/66] Update CHANGELOG.md --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c635aa69..96a1b9d6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ Change Log === + +## 3.1.2 +- update unix-socket to 2.2.0 +- Remove `JacksonJaxbJsonProvider` from `FiltersEncoder` +- BuildImageCmdImpl: Fix an exception message +- Add support for target parameter in BuildImgCmd +- Add prune operations +- Updating Jackson due to CVEs +- Make StatsConfig public +- Set 3 mb as limit for json responce. + ## 3.1.1 - Patch save image with tag - [api/healthcheck] startPeriod is now a long From d01c3ebfc67f4549183a3c4386a81d6ab0e8f291 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 25 Mar 2019 17:48:55 +0300 Subject: [PATCH 66/66] [maven-release-plugin] prepare release 3.1.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ef354cda0..aa1e86e4d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java bundle - 3.1.2-SNAPSHOT + 3.1.2 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 + 3.1.2