From 0e5b08ea37a8eb0ba6303fae99216787be12eae8 Mon Sep 17 00:00:00 2001 From: Corey Beres Date: Sun, 28 Aug 2016 00:30:49 -0400 Subject: [PATCH 1/4] Ability to set labels on image build (#681) --- .../dockerjava/api/command/BuildImageCmd.java | 11 ++++++++ .../core/command/BuildImageCmdImpl.java | 19 ++++++++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 25 +++++++++++++------ .../netty/exec/BuildImageCmdExec.java | 23 +++++++++++------ .../core/command/BuildImageCmdImplTest.java | 15 +++++++++++ .../netty/exec/BuildImageCmdExecTest.java | 15 +++++++++++ .../resources/buildTests/labels/Dockerfile | 3 +++ 7 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 src/test/resources/buildTests/labels/Dockerfile diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index 20b23e903..76c84aa04 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -101,6 +101,12 @@ public interface BuildImageCmd extends AsyncDockerCmd getLabels(); + // setters BuildImageCmd withTag(String tag); @@ -145,6 +151,11 @@ 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 487f0b264..cfa99d6fd 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -56,6 +56,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd buildArgs; + private Map labels; + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -149,6 +151,11 @@ public Map getBuildArgs() { return buildArgs; } + @Override + public Map getLabels() { + return labels; + } + // getter lib specific @Override @@ -303,6 +310,18 @@ public BuildImageCmd withShmsize(Long shmsize) { return this; } + /** + * @see #labels + */ + @Override + public BuildImageCmd withLabel(String key, String value) { + if (this.labels == null) { + this.labels = new HashMap(); + } + this.labels.put(key, value); + return this; + } + @Override public void close() { super.close(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 43e7687eb..2a7aea40e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.net.URLEncoder; +import java.util.Map; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { @@ -99,19 +100,14 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("rm", "false"); } - if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { - try { - webTarget = webTarget.queryParam("buildargs", - URLEncoder.encode(MAPPER.writeValueAsString(command.getBuildArgs()), "UTF-8")); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs()); if (command.getShmsize() != null) { webTarget = webTarget.queryParam("shmsize", command.getShmsize()); } + webTarget = writeMap(webTarget, "labels", command.getLabels()); + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); @@ -123,4 +119,17 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag entity(command.getTarInputStream(), "application/tar") ); } + + private WebTarget writeMap(WebTarget webTarget, String name, Map value) { + if (value != null && !value.isEmpty()) { + try { + return webTarget.queryParam(name, + URLEncoder.encode(MAPPER.writeValueAsString(value), "UTF-8")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + return webTarget; + } + } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java index f4ff04576..43152570e 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -15,6 +15,7 @@ import com.github.dockerjava.netty.WebTarget; import java.io.IOException; +import java.util.Map; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { @@ -85,18 +86,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } - if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { - try { - webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs()); if (command.getShmsize() != null) { webTarget = webTarget.queryParam("shmsize", command.getShmsize()); } + webTarget = writeMap(webTarget, "labels", command.getLabels()); + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()) @@ -109,4 +106,16 @@ protected Void execute0(BuildImageCmd command, ResultCallback return null; } + + private WebTarget writeMap(WebTarget webTarget, String name, Map value) { + if (value != null && !value.isEmpty()) { + try { + return webTarget.queryParam(name, MAPPER.writeValueAsString(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + return webTarget; + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index 31f3c3045..b8d1e0a0a 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -250,6 +250,21 @@ public void buildArgs() throws Exception { assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); } + @Test + public void labels() throws Exception { + File baseDir = fileFromBuildTestResource("labels"); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") + .exec(new BuildImageResultCallback()) + .awaitImageId(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); + } + public void dockerfileNotInBaseDirectory() throws Exception { File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory"); File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile"); diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java index 1474ef25f..04b1a969b 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -255,6 +255,21 @@ public void buildArgs() throws Exception { assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); } + @Test + public void labels() throws Exception { + File baseDir = fileFromBuildTestResource("labels"); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") + .exec(new BuildImageResultCallback()) + .awaitImageId(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); + } + public void dockerfileNotInBaseDirectory() throws Exception { File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory"); File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile"); diff --git a/src/test/resources/buildTests/labels/Dockerfile b/src/test/resources/buildTests/labels/Dockerfile new file mode 100644 index 000000000..6a8106b86 --- /dev/null +++ b/src/test/resources/buildTests/labels/Dockerfile @@ -0,0 +1,3 @@ +FROM ubuntu:latest + +CMD ["echo", "Success"] From 761f41655f9e01ed25552309b7dd3a23472a56c4 Mon Sep 17 00:00:00 2001 From: Corey Beres Date: Sun, 28 Aug 2016 00:48:24 -0400 Subject: [PATCH 2/4] Check API version in new tests (#681) --- .../dockerjava/core/command/BuildImageCmdImplTest.java | 7 +++++++ .../dockerjava/netty/exec/BuildImageCmdExecTest.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index b8d1e0a0a..e7cef8d15 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -1,5 +1,6 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.utils.TestUtils.getVersion; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -17,6 +18,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.testng.ITestResult; +import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; @@ -33,6 +35,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports.Binding; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.util.CompressArchiveUtil; @Test(groups = "integration") @@ -252,6 +255,10 @@ public void buildArgs() throws Exception { @Test public void labels() throws Exception { + if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) { + throw new SkipException("API version should be >= 1.23"); + } + File baseDir = fileFromBuildTestResource("labels"); String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java index 04b1a969b..94f4f91dd 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import static com.github.dockerjava.utils.TestUtils.getVersion; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -17,6 +18,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.testng.ITestResult; +import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; @@ -34,6 +36,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.Ports.Binding; +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.command.BuildImageResultCallback; import com.github.dockerjava.core.command.PushImageResultCallback; import com.github.dockerjava.core.command.WaitContainerResultCallback; @@ -257,6 +260,10 @@ public void buildArgs() throws Exception { @Test public void labels() throws Exception { + if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) { + throw new SkipException("API version should be >= 1.23"); + } + File baseDir = fileFromBuildTestResource("labels"); String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") From 84e9ee583b281c85b509db4142c688895e362198 Mon Sep 17 00:00:00 2001 From: Corey Beres Date: Sun, 28 Aug 2016 11:27:56 -0400 Subject: [PATCH 3/4] remove unnecessary this (#681) --- .../github/dockerjava/core/command/BuildImageCmdImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index cfa99d6fd..9dcbd57e1 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -315,10 +315,10 @@ public BuildImageCmd withShmsize(Long shmsize) { */ @Override public BuildImageCmd withLabel(String key, String value) { - if (this.labels == null) { - this.labels = new HashMap(); + if (labels == null) { + labels = new HashMap<>(); } - this.labels.put(key, value); + labels.put(key, value); return this; } From 18fdc075948bea753401432e63d2dc2ad996d68a Mon Sep 17 00:00:00 2001 From: Corey Beres Date: Sun, 28 Aug 2016 20:20:40 -0400 Subject: [PATCH 4/4] change withLabel to withLabels (#681) --- .../com/github/dockerjava/api/command/BuildImageCmd.java | 2 +- .../github/dockerjava/core/command/BuildImageCmdImpl.java | 7 ++----- .../dockerjava/core/command/BuildImageCmdImplTest.java | 4 +++- .../dockerjava/netty/exec/BuildImageCmdExecTest.java | 4 +++- 4 files changed, 9 insertions(+), 8 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 76c84aa04..ac98db2f9 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -154,7 +154,7 @@ public interface BuildImageCmd extends AsyncDockerCmd labels); interface Exec extends DockerCmdAsyncExec { } 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 9dcbd57e1..c34b05155 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -314,11 +314,8 @@ public BuildImageCmd withShmsize(Long shmsize) { * @see #labels */ @Override - public BuildImageCmd withLabel(String key, String value) { - if (labels == null) { - labels = new HashMap<>(); - } - labels.put(key, value); + public BuildImageCmd withLabels(Map labels) { + this.labels = labels; return this; } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index e7cef8d15..cb4c1b2a8 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -13,6 +13,7 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.UUID; import org.apache.commons.io.FileUtils; @@ -261,7 +262,8 @@ public void labels() throws Exception { File baseDir = fileFromBuildTestResource("labels"); - String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true) + .withLabels(Collections.singletonMap("test", "abc")) .exec(new BuildImageResultCallback()) .awaitImageId(); diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java index 94f4f91dd..f567dcfc8 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -13,6 +13,7 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.UUID; import org.apache.commons.io.FileUtils; @@ -266,7 +267,8 @@ public void labels() throws Exception { File baseDir = fileFromBuildTestResource("labels"); - String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withLabel("test", "abc") + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true) + .withLabels(Collections.singletonMap("test", "abc")) .exec(new BuildImageResultCallback()) .awaitImageId();