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 1/2] 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 c552bb04edfa77187a76a798b8a4573f05aedf9c Mon Sep 17 00:00:00 2001 From: Andras Slemmer Date: Fri, 24 Aug 2018 10:31:56 +0100 Subject: [PATCH 2/2] #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) {