From c963c1fa9e85a49d43fb0987f6f8365b68162b3e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 19 Aug 2015 04:08:32 +0300 Subject: [PATCH 1/6] Add FindBugs annotations --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index a6c343ce6..e0edc4943 100644 --- a/pom.xml +++ b/pom.xml @@ -194,6 +194,13 @@ ${hamcrest.jpa-matchers} test + + + com.google.code.findbugs + annotations + 3.0.0 + provided + From 920dfe97cfd0cb64762ae31c706919b71f8752bf Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 19 Aug 2015 04:09:38 +0300 Subject: [PATCH 2/6] BuildImage sync to 1.20 API Reordered fields according to 1.20 API for easier tracking --- .../dockerjava/api/command/BuildImageCmd.java | 99 +++++++- .../core/command/BuildImageCmdImpl.java | 223 ++++++++++++++---- .../dockerjava/jaxrs/BuildImageCmdExec.java | 30 ++- 3 files changed, 286 insertions(+), 66 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 5a41a61fb..5a2fdc7c7 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,44 +1,101 @@ package com.github.dockerjava.api.command; -import java.io.File; -import java.io.InputStream; - import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; +import javax.annotation.CheckForNull; +import java.io.File; +import java.io.InputStream; +import java.net.URI; + /** - * * Build an image from Dockerfile. - * + *

* TODO: http://docs.docker.com/reference/builder/#dockerignore * + * @see build-image-from-a-dockerfile */ public interface BuildImageCmd extends AsyncDockerCmd { - public BuildImageCmd withTag(String tag); +// lib specific public InputStream getTarInputStream(); - public String getTag(); + public AuthConfigurations getBuildAuthConfigs(); - public boolean hasNoCacheEnabled(); +// getters - public boolean hasRemoveEnabled(); + /** + * "t" in API + */ + @CheckForNull + public String getTag(); + /** + * "remote" in API + */ + @CheckForNull + public URI getRemote(); + + /** + * "nocache" in API + */ + @CheckForNull + public Boolean hasNoCacheEnabled(); + + /** + * "rm" in API + */ + @CheckForNull + public Boolean hasRemoveEnabled(); + + /** + * "forcerm" in API + */ + public boolean isForcerm(); + + @CheckForNull + public Boolean getForcerm(); + + /** + * "q" in API + */ public boolean isQuiet(); - public boolean hasPullEnabled(); + @CheckForNull + public Boolean getQuiet(); + /** + * "pull" in API + */ + @CheckForNull + public Boolean hasPullEnabled(); + + @CheckForNull public String getPathToDockerfile(); - public AuthConfigurations getBuildAuthConfigs(); + @CheckForNull + public Long getMemory(); + + @CheckForNull + public Long getMemswap(); + + @CheckForNull + public String getCpushares(); + + @CheckForNull + public String getCpusetcpus(); + +// setters + + public BuildImageCmd withTag(String tag); + + public BuildImageCmd withRemote(URI remote); public BuildImageCmd withBaseDirectory(File baseDirectory); public BuildImageCmd withDockerfile(File dockerfile); - public BuildImageCmd withTarInputStream(InputStream tarInputStream); - public BuildImageCmd withNoCache(); public BuildImageCmd withNoCache(boolean noCache); @@ -47,6 +104,10 @@ 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 56ce8f78f..e270e1c55 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -5,6 +5,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; @@ -12,6 +13,8 @@ import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; +import javax.annotation.CheckForNull; + /** * * Build an image from Dockerfile. @@ -19,24 +22,51 @@ */ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd { - private InputStream tarInputStream = null; + @CheckForNull + private InputStream tarInputStream; + @CheckForNull private String tag; - private boolean noCache; + @CheckForNull + private Boolean noCache; - private boolean remove = true; + @CheckForNull + private Boolean remove = true; - private boolean quiet; + @CheckForNull + private Boolean quiet; - private boolean pull; + @CheckForNull + private Boolean pull; + @CheckForNull private AuthConfigurations buildAuthConfigs; + @CheckForNull private File dockerFile; + @CheckForNull private File baseDirectory; + @CheckForNull + private String cpusetcpus; + + @CheckForNull + private Long memory; + + @CheckForNull + private String cpushares; + + @CheckForNull + private Boolean forcerm; + + @CheckForNull + private Long memswap; + + @CheckForNull + private URI remote; + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -59,69 +89,50 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { withTarInputStream(tarInputStream); } +// getters API + @Override - public InputStream getTarInputStream() { - return tarInputStream; + public String getTag() { + return tag; } @Override - public BuildImageCmdImpl withDockerfile(File dockerfile) { - checkNotNull(dockerfile); - if (!dockerfile.exists()) - throw new IllegalArgumentException("Dockerfile does not exist"); - if (!dockerfile.isFile()) - throw new IllegalArgumentException("Not a directory"); - - if (baseDirectory == null) - withBaseDirectory(dockerfile.getParentFile()); - - this.dockerFile = dockerfile; - - try { - withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); - } catch (IOException e) { - // we just created the file this should never happen. - throw new RuntimeException(e); - } - return this; + public URI getRemote() { + return remote; } @Override - public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - checkNotNull(tarInputStream, "tarInputStream is null"); - this.tarInputStream = tarInputStream; - return this; + public Boolean hasNoCacheEnabled() { + return noCache; } @Override - public BuildImageCmdImpl withTag(String tag) { - checkNotNull(tag, "Tag is null"); - this.tag = tag; - return this; + public Boolean hasRemoveEnabled() { + return remove; } @Override - public String getTag() { - return tag; + public boolean isForcerm() { + return forcerm != null && forcerm; } @Override - public boolean hasNoCacheEnabled() { - return noCache; + public Boolean getForcerm() { + return forcerm; } @Override - public boolean hasRemoveEnabled() { - return remove; + public boolean isQuiet() { + return quiet != null && quiet; } @Override - public boolean isQuiet() { + public Boolean getQuiet() { return quiet; } @Override - public boolean hasPullEnabled() { + public Boolean hasPullEnabled() { return pull; } @@ -134,14 +145,50 @@ public String getPathToDockerfile() { } } + @Override + public Long getMemory() { + return memory; + } + + @Override + public Long getMemswap() { + return memswap; + } + + @Override + public String getCpushares() { + return cpushares; + } + + @Override + public String getCpusetcpus() { + return cpusetcpus; + } + +// getter lib specific + @Override public AuthConfigurations getBuildAuthConfigs() { return buildAuthConfigs; } @Override - public BuildImageCmd withBaseDirectory(File baseDirectory) { - this.baseDirectory = baseDirectory; + public InputStream getTarInputStream() { + return tarInputStream; + } + +// setters + + @Override + public BuildImageCmdImpl withTag(String tag) { + checkNotNull(tag, "Tag is null"); + this.tag = tag; + return this; + } + + @Override + public BuildImageCmd withRemote(URI remote) { + this.remote = remote; return this; } @@ -167,6 +214,17 @@ public BuildImageCmdImpl withRemove(boolean rm) { return this; } + @Override + public BuildImageCmd withForcerm() { + return withForcerm(true); + } + + @Override + public BuildImageCmd withForcerm(boolean forcerm) { + this.forcerm = forcerm; + return this; + } + @Override public BuildImageCmdImpl withQuiet() { return withQuiet(true); @@ -189,6 +247,67 @@ public BuildImageCmdImpl withPull(boolean pull) { return this; } + @Override + public BuildImageCmd withMemory(long memory) { + this.memory = memory; + return this; + } + + @Override + public BuildImageCmd withMemswap(long memswap) { + this.memswap = memswap; + return this; + } + + @Override + public BuildImageCmd withCpushares(String cpushares) { + this.cpushares = cpushares; + return this; + } + + @Override + public BuildImageCmd withCpusetcpus(String cpusetcpus) { + this.cpusetcpus = cpusetcpus; + return this; + } + +// lib specific + + @Override + public BuildImageCmd withBaseDirectory(File baseDirectory) { + this.baseDirectory = baseDirectory; + return this; + } + + @Override + public BuildImageCmdImpl withDockerfile(File dockerfile) { + checkNotNull(dockerfile); + if (!dockerfile.exists()) + throw new IllegalArgumentException("Dockerfile does not exist"); + if (!dockerfile.isFile()) + throw new IllegalArgumentException("Not a directory"); + + if (baseDirectory == null) + withBaseDirectory(dockerfile.getParentFile()); + + this.dockerFile = dockerfile; + + try { + withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); + } catch (IOException e) { + // we just created the file this should never happen. + throw new RuntimeException(e); + } + return this; + } + + @Override + public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { + checkNotNull(tarInputStream, "tarInputStream is null"); + this.tarInputStream = tarInputStream; + return this; + } + @Override public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { checkNotNull(authConfigs, "authConfig is null"); @@ -205,9 +324,19 @@ public void close() throws IOException { @Override public String toString() { - return new StringBuilder("build ").append(tag != null ? "-t " + tag + " " : "") - .append(noCache ? "--nocache=true " : "").append(quiet ? "--quiet=true " : "") - .append(!remove ? "--rm=false " : "").toString(); + return new StringBuilder("build ") + .append(tag != null ? "-t " + tag + " " : "") + .append(remote != null ? "--remote=" + remote.toString() + " " : "") + .append((quiet != null && quiet) ? "--quiet=true " : "") + .append((noCache != null && noCache) ? "--nocache=true " : "") + .append((pull != null && pull) ? "--pull=true" : "") + .append((remove != null && !remove) ? "--rm=false " : "") + .append((forcerm != null && forcerm) ? "--forcerm=true " : " ") + .append(memory != null ? "--memory=" + memory + " " : "") + .append(memswap != null ? "--memswap=" + memswap + " " : "") + .append(cpushares != null ? "--cpushares=" + cpushares + " " : "") + .append(cpusetcpus != null ? "--cpusetcpus=" + cpusetcpus + " " : "") + .toString(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 7a259b5a1..b28cec35c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -43,23 +43,41 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag WebTarget webTarget = getBaseResource().path("/build"); String dockerFilePath = command.getPathToDockerfile(); + if (dockerFilePath != null && command.getRemote() == null && !"Dockerfile".equals(dockerFilePath)) { + webTarget = webTarget.queryParam("dockerfile", dockerFilePath); + } if (command.getTag() != null) { webTarget = webTarget.queryParam("t", command.getTag()); } + if (command.getRemote() != null) { + webTarget = webTarget.queryParam("remote", command.getRemote().toString()); + } + if (command.isQuiet()) { + webTarget = webTarget.queryParam("q", "true"); + } if (command.hasNoCacheEnabled()) { webTarget = webTarget.queryParam("nocache", "true"); } + if (command.hasPullEnabled()) { + webTarget = webTarget.queryParam("pull", "true"); + } if (!command.hasRemoveEnabled()) { webTarget = webTarget.queryParam("rm", "false"); } - if (command.isQuiet()) { - webTarget = webTarget.queryParam("q", "true"); + if (command.isForcerm()) { + webTarget = webTarget.queryParam("forcerm", "true"); } - if (command.hasPullEnabled()) { - webTarget = webTarget.queryParam("pull", "true"); + if (command.getMemory() != null) { + webTarget = webTarget.queryParam("memory", command.getMemory()); } - if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webTarget = webTarget.queryParam("dockerfile", dockerFilePath); + if (command.getMemswap() != null) { + webTarget = webTarget.queryParam("memswap", command.getMemswap()); + } + if (command.getCpushares() != null) { + webTarget = webTarget.queryParam("cpushares", command.getCpushares()); + } + if (command.getCpusetcpus() != null) { + webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); From 67f1258411c8cd0dd2e4e8408caad170e7839651 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:30:14 +0300 Subject: [PATCH 3/6] Diamonds <> --- .../com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index b28cec35c..465cd2869 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -85,8 +85,11 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag LOGGER.trace("POST: {}", webTarget); - return new POSTCallbackNotifier(new JsonStreamProcessor( - BuildResponseItem.class), resultCallback, resourceWithOptionalAuthConfig(command, webTarget.request()) - .accept(MediaType.TEXT_PLAIN), entity(command.getTarInputStream(), "application/tar")); + return new POSTCallbackNotifier<>(new JsonStreamProcessor<>(BuildResponseItem.class), + resultCallback, + resourceWithOptionalAuthConfig(command, webTarget.request()) + .accept(MediaType.TEXT_PLAIN), + entity(command.getTarInputStream(), "application/tar") + ); } } From 3ceac6135f6518577c9f17262ee8610426dec068 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:30:37 +0300 Subject: [PATCH 4/6] Replace with auto-generated toString() --- .../core/command/BuildImageCmdImpl.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 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 e270e1c55..3cd6bc755 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -12,6 +12,8 @@ import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import javax.annotation.CheckForNull; @@ -324,19 +326,6 @@ public void close() throws IOException { @Override public String toString() { - return new StringBuilder("build ") - .append(tag != null ? "-t " + tag + " " : "") - .append(remote != null ? "--remote=" + remote.toString() + " " : "") - .append((quiet != null && quiet) ? "--quiet=true " : "") - .append((noCache != null && noCache) ? "--nocache=true " : "") - .append((pull != null && pull) ? "--pull=true" : "") - .append((remove != null && !remove) ? "--rm=false " : "") - .append((forcerm != null && forcerm) ? "--forcerm=true " : " ") - .append(memory != null ? "--memory=" + memory + " " : "") - .append(memswap != null ? "--memswap=" + memswap + " " : "") - .append(cpushares != null ? "--cpushares=" + cpushares + " " : "") - .append(cpusetcpus != null ? "--cpusetcpus=" + cpusetcpus + " " : "") - .toString(); + return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE); } - } From 18a0febdc16a1f7e9d26bf946994540af179c171 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:31:28 +0300 Subject: [PATCH 5/6] Place logicaly linked words on new line --- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 465cd2869..53c3c5de0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -19,9 +19,8 @@ import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements - BuildImageCmd.Exec { - +public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec + implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); public BuildImageCmdExec(WebTarget baseResource) { From 32d0f93d14b84243cf67b16cdb9cf532287052ae Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 21 Aug 2015 02:04:59 +0300 Subject: [PATCH 6/6] Restore backward compatibility --- .../dockerjava/api/command/BuildImageCmd.java | 14 +++-------- .../core/command/BuildImageCmdImpl.java | 25 ++++++------------- 2 files changed, 12 insertions(+), 27 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 5a2fdc7c7..c737501fa 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -40,14 +40,12 @@ public interface BuildImageCmd extends AsyncDockerCmd