From e0c81240f005cab41ed907572d4561d509a896b7 Mon Sep 17 00:00:00 2001 From: Sean Fitts Date: Wed, 1 Oct 2014 07:30:11 -0700 Subject: [PATCH 1/3] Backport the new structure to Jersey 1.18 This ressurects the previous Jersey 1.18 implementation in the new structure. The Jersey 2.x implementation is still here, but has been moved to the jaxrs2 package which currently is not built. Eventually these could be split into separate modules which could be combined as desired, but there is still a bit more work to do for that to work. --- pom.xml | 71 ++++- .../command/CopyFileFromContainerCmdImpl.java | 13 - .../dockerjava/jaxrs1/AbstrDockerCmdExec.java | 87 ++++++ .../jaxrs1/AttachContainerCmdExec.java | 39 +++ .../github/dockerjava/jaxrs1/AuthCmdExec.java | 38 +++ .../dockerjava/jaxrs1/BuildImageCmdExec.java | 47 +++ .../dockerjava/jaxrs1/CommitCmdExec.java | 41 +++ .../jaxrs1/ContainerDiffCmdExec.java | 37 +++ .../jaxrs1/CopyFileFromContainerCmdExec.java | 36 +++ .../jaxrs1/CreateContainerCmdExec.java | 34 +++ .../dockerjava/jaxrs1/CreateImageCmdExec.java | 35 +++ .../jaxrs1/DockerCmdExecFactoryImpl.java | 275 ++++++++++++++++++ .../dockerjava/jaxrs1/EventsCmdExec.java | 87 ++++++ .../github/dockerjava/jaxrs1/InfoCmdExec.java | 29 ++ .../jaxrs1/InspectContainerCmdExec.java | 31 ++ .../jaxrs1/InspectImageCmdExec.java | 31 ++ .../jaxrs1/KillContainerCmdExec.java | 37 +++ .../jaxrs1/ListContainersCmdExec.java | 45 +++ .../dockerjava/jaxrs1/ListImagesCmdExec.java | 41 +++ .../jaxrs1/LogContainerCmdExec.java | 35 +++ .../jaxrs1/PauseContainerCmdExec.java | 35 +++ .../github/dockerjava/jaxrs1/PingCmdExec.java | 29 ++ .../dockerjava/jaxrs1/PullImageCmdExec.java | 36 +++ .../dockerjava/jaxrs1/PushImageCmdExec.java | 44 +++ .../jaxrs1/RemoveContainerCmdExec.java | 33 +++ .../dockerjava/jaxrs1/RemoveImageCmdExec.java | 33 +++ .../jaxrs1/RestartContainerCmdExec.java | 34 +++ .../jaxrs1/SearchImagesCmdExec.java | 35 +++ .../jaxrs1/StartContainerCmdExec.java | 46 +++ .../jaxrs1/StopContainerCmdExec.java | 33 +++ .../dockerjava/jaxrs1/TagImageCmdExec.java | 37 +++ .../jaxrs1/TopContainerCmdExec.java | 34 +++ .../jaxrs1/UnpauseContainerCmdExec.java | 34 +++ .../dockerjava/jaxrs1/VersionCmdExec.java | 30 ++ .../jaxrs1/WaitContainerCmdExec.java | 35 +++ .../jaxrs1/util/JsonClientFilter.java | 27 ++ .../util/ResponseStatusExceptionFilter.java | 104 +++++++ .../jaxrs1/util/SelectiveLoggingFilter.java | 47 +++ .../{jaxrs => jaxrs2}/AbstrDockerCmdExec.java | 2 +- .../AttachContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/AuthCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/BuildImageCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/CommitCmdExec.java | 2 +- .../ContainerDiffCmdExec.java | 2 +- .../CopyFileFromContainerCmdExec.java | 2 +- .../CreateContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/CreateImageCmdExec.java | 2 +- .../jaxrs2/DockerClientBuilder.java | 46 +++ .../DockerCmdExecFactoryImpl.java | 9 +- .../{jaxrs => jaxrs2}/EventsCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/InfoCmdExec.java | 2 +- .../InspectContainerCmdExec.java | 2 +- .../InspectImageCmdExec.java | 2 +- .../KillContainerCmdExec.java | 2 +- .../ListContainersCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/ListImagesCmdExec.java | 2 +- .../LogContainerCmdExec.java | 2 +- .../PauseContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/PingCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/PullImageCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/PushImageCmdExec.java | 2 +- .../RemoveContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/RemoveImageCmdExec.java | 2 +- .../RestartContainerCmdExec.java | 2 +- .../SearchImagesCmdExec.java | 2 +- .../StartContainerCmdExec.java | 2 +- .../StopContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/TagImageCmdExec.java | 2 +- .../TopContainerCmdExec.java | 2 +- .../UnpauseContainerCmdExec.java | 2 +- .../{jaxrs => jaxrs2}/VersionCmdExec.java | 2 +- .../WaitContainerCmdExec.java | 2 +- .../util/JsonClientFilter.java | 2 +- .../util/ResponseStatusExceptionFilter.java | 2 +- .../util/SelectiveLoggingFilter.java | 2 +- .../client/AbstractDockerClientTest.java | 4 +- .../core/command/AuthCmdImplTest.java | 1 + .../core/command/BuildImageCmdImplTest.java | 1 - .../command/StartContainerCmdImplTest.java | 3 +- .../jaxrs1/TestDockerCmdExecFactory.java | 112 +++++++ .../jaxrs2/TestDockerCmdExecFactory.java | 112 +++++++ 81 files changed, 2080 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/AbstrDockerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/AttachContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/AuthCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/BuildImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/CommitCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/ContainerDiffCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/CopyFileFromContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/CreateContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/CreateImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/DockerCmdExecFactoryImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/EventsCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/InfoCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/InspectContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/InspectImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/KillContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/ListContainersCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/ListImagesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/LogContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/PauseContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/PingCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/PullImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/PushImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/RemoveContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/RemoveImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/RestartContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/SearchImagesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/StartContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/StopContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/TagImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/TopContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/UnpauseContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/VersionCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/WaitContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/util/JsonClientFilter.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/util/ResponseStatusExceptionFilter.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs1/util/SelectiveLoggingFilter.java rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/AbstrDockerCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/AttachContainerCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/AuthCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/BuildImageCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/CommitCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/ContainerDiffCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/CopyFileFromContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/CreateContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/CreateImageCmdExec.java (96%) create mode 100644 src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/DockerCmdExecFactoryImpl.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/EventsCmdExec.java (98%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/InfoCmdExec.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/InspectContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/InspectImageCmdExec.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/KillContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/ListContainersCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/ListImagesCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/LogContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/PauseContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/PingCmdExec.java (94%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/PullImageCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/PushImageCmdExec.java (97%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/RemoveContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/RemoveImageCmdExec.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/RestartContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/SearchImagesCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/StartContainerCmdExec.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/StopContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/TagImageCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/TopContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/UnpauseContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/VersionCmdExec.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/WaitContainerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/util/JsonClientFilter.java (95%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/util/ResponseStatusExceptionFilter.java (98%) rename src/main/java/com/github/dockerjava/{jaxrs => jaxrs2}/util/SelectiveLoggingFilter.java (96%) create mode 100644 src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java create mode 100644 src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java diff --git a/pom.xml b/pom.xml index d8f1fbac6..575fd95b1 100644 --- a/pom.xml +++ b/pom.xml @@ -50,14 +50,14 @@ 1.6.1 - 2.11 + 1.18 1.9 2.3.3 4.2.5 1.5 - 1.8 + 1.8 2.3 2.6 1.7.5 @@ -87,16 +87,44 @@ jackson-jaxrs-json-provider ${jackson-jaxrs.version} - - - - - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - + + + + + + com.sun.jersey + jersey-core + ${jersey.version} + + + com.sun.jersey + jersey-client + ${jersey.version} + + + + com.sun.jersey.contribs + jersey-multipart + ${jersey.version} + + + com.sun.jersey.contribs + jersey-apache-client4 + ${jersey-apache-client4.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + org.apache.commons @@ -138,10 +166,10 @@ - com.google.guava - guava - ${guava.version} - + com.google.guava + guava + ${guava.version} + @@ -240,6 +268,15 @@ ISO-8859-1 ${jdk.debug} ${jdk.optimize} + + + + **/jaxrs2/*.java + **/jaxrs2/util/*.java + + + **/jaxrs2/*.java + @@ -338,6 +375,7 @@ release + org.apache.maven.plugins diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 929b6bf5f..04033906f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -85,17 +85,4 @@ public InputStream exec() throws NotFoundException { return super.exec(); } -// protected InputStream impl() throws DockerException { -// -// CopyFileFromContainerCmd command = this; -// -// WebTarget webResource = -// baseResource.path("/containers/{id}/copy").resolveTemplate("id", command.getContainerId()); -// -// LOGGER.trace("POST: " + webResource.toString()); -// -// return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); -// } - - } diff --git a/src/main/java/com/github/dockerjava/jaxrs1/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/AbstrDockerCmdExec.java new file mode 100644 index 000000000..a5c7dadda --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/AbstrDockerCmdExec.java @@ -0,0 +1,87 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.IOException; + +import org.apache.commons.codec.binary.Base64; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.DockerCmd; +import com.github.dockerjava.api.command.DockerCmdExec; +import com.github.dockerjava.api.model.AuthConfig; +import com.google.common.base.Preconditions; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.uri.UriTemplate; + +public abstract class AbstrDockerCmdExec, RES_T> + implements DockerCmdExec { + + private WebResource baseResource; + + public AbstrDockerCmdExec(WebResource baseResource) { + Preconditions.checkNotNull(baseResource, + "baseResource was not specified"); + this.baseResource = baseResource; + } + + protected WebResourceBuilder getBaseResource() { + return new WebResourceBuilder(baseResource); + } + + public static class WebResourceBuilder { + WebResource resource; + + private WebResourceBuilder(WebResource resource) { + this.resource = resource; + } + + public WebResourceBuilder path(String pathStr) { + this.resource = this.resource.path(pathStr); + return this; + } + + public WebResourceBuilder resolveTemplate(String path, String... values) { + UriTemplate tmplt = new UriTemplate(path); + this.resource = this.resource.path(tmplt.createURI(values)); + return this; + } + + public WebResourceBuilder queryParam(String name, String value) { + if (value != null) { + this.resource = this.resource.queryParam(name, value); + } + return this; + } + + public WebResource build() { + return this.resource; + } + } + + protected String registryAuth(AuthConfig authConfig) { + try { + return Base64.encodeBase64String(new ObjectMapper() + .writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public RES_T exec(CMD_T command) { + // this hack works because of ResponseStatusExceptionFilter + RES_T result; + try { + result = execute(command); + } catch (ClientHandlerException e) { + if(e.getCause() instanceof DockerException) { + throw (DockerException)e.getCause(); + } else { + throw e; + } + } + return result; + } + + protected abstract RES_T execute(CMD_T command); +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/AttachContainerCmdExec.java new file mode 100644 index 000000000..6a0c52f7b --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/AttachContainerCmdExec.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class AttachContainerCmdExec extends AbstrDockerCmdExec implements AttachContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(AttachContainerCmdExec.class); + + public AttachContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(AttachContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/attach", command.getContainerId()) + .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("POST: {}", webResource); + + return webResource.accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .entity(null, MediaType.APPLICATION_JSON) + .post(InputStream.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/AuthCmdExec.java new file mode 100644 index 000000000..6fcc7d11a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/AuthCmdExec.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.command.AuthCmd; +import com.sun.jersey.api.client.WebResource; + +public class AuthCmdExec extends AbstrDockerCmdExec implements AuthCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(AuthCmdExec.class); + + public AuthCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(AuthCmd command) { + WebResource webResource = getBaseResource().path("/auth").build(); + LOGGER.trace("POST: {}", webResource); + Response response = webResource + .accept(MediaType.APPLICATION_JSON) + .entity(command.getAuthConfig(), MediaType.APPLICATION_JSON) + .post(Response.class); + + if(response.getStatus() == 401) { + throw new UnauthorizedException("Unauthorized"); + }; + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/BuildImageCmdExec.java new file mode 100644 index 000000000..e3cbb7017 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/BuildImageCmdExec.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.BuildImageCmd; +import com.sun.jersey.api.client.WebResource; + +public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(BuildImageCmdExec.class); + + public BuildImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(BuildImageCmd command) { + WebResource webResource = getBaseResource().path("/build").build(); + + if(command.getTag() != null) { + webResource = webResource.queryParam("t", command.getTag()); + } + if (command.hasNoCacheEnabled()) { + webResource = webResource.queryParam("nocache", "true"); + } + if (command.hasRemoveEnabled()) { + webResource = webResource.queryParam("rm", "true"); + } + if (command.isQuiet()) { + webResource = webResource.queryParam("q", "true"); + } + + LOGGER.debug("POST: {}", webResource); + return webResource + .accept(MediaType.TEXT_PLAIN) + .entity(command.getTarInputStream(), "application/tar") + .post(InputStream.class); + + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/CommitCmdExec.java new file mode 100644 index 000000000..ccf667591 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/CommitCmdExec.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.dockerjava.api.command.CommitCmd; +import com.sun.jersey.api.client.WebResource; + +public class CommitCmdExec extends AbstrDockerCmdExec implements CommitCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(CommitCmdExec.class); + + public CommitCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected String execute(CommitCmd command) { + WebResource webResource = getBaseResource() + .path("/commit") + .queryParam("container", command.getContainerId()) + .queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()) + .queryParam("m", command.getMessage()) + .queryParam("author", command.getAuthor()) + .queryParam("pause", command.hasPauseEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("POST: {}", webResource); + ObjectNode objectNode = webResource + .accept("application/vnd.docker.raw-stream") + .entity(command, MediaType.APPLICATION_JSON) + .post(ObjectNode.class); + return objectNode.get("Id").asText(); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/ContainerDiffCmdExec.java new file mode 100644 index 000000000..0867a678d --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/ContainerDiffCmdExec.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.jaxrs1; + +import java.util.List; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.model.ChangeLog; +import com.sun.jersey.api.client.GenericType; +import com.sun.jersey.api.client.WebResource; + +public class ContainerDiffCmdExec extends AbstrDockerCmdExec> implements ContainerDiffCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(ContainerDiffCmdExec.class); + + public ContainerDiffCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected List execute(ContainerDiffCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/changes", command.getContainerId()) + .build(); + + LOGGER.trace("GET: {}", webResource); + return webResource + .accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/CopyFileFromContainerCmdExec.java new file mode 100644 index 000000000..4b808d17e --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/CopyFileFromContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class CopyFileFromContainerCmdExec extends AbstrDockerCmdExec implements CopyFileFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileFromContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(CopyFileFromContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/copy", command.getContainerId()) + .build(); + + LOGGER.trace("POST: " + webResource.toString()); + + return webResource + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .entity(command, MediaType.APPLICATION_JSON) + .post(InputStream.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/CreateContainerCmdExec.java new file mode 100644 index 000000000..4b7d38281 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/CreateContainerCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.sun.jersey.api.client.WebResource; + +public class CreateContainerCmdExec extends AbstrDockerCmdExec implements CreateContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); + + public CreateContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected CreateContainerResponse execute(CreateContainerCmd command) { + WebResource webResource = getBaseResource().path("/containers/create").build(); + + if (command.getName() != null) { + webResource = webResource.queryParam("name", command.getName()); + } + + LOGGER.trace("POST: {} ", webResource); + return webResource.accept(MediaType.APPLICATION_JSON) + .entity(command, MediaType.APPLICATION_JSON) + .post(CreateContainerResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/CreateImageCmdExec.java new file mode 100644 index 000000000..3c4da1929 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/CreateImageCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.sun.jersey.api.client.WebResource; + +public class CreateImageCmdExec extends AbstrDockerCmdExec implements CreateImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(CreateImageCmdExec.class); + + public CreateImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected CreateImageResponse execute(CreateImageCmd command) { + WebResource webResource = getBaseResource() + .path("/images/create") + .queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()) + .queryParam("fromSrc", "-") + .build(); + + LOGGER.trace("POST: {}", webResource); + return webResource.accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM) + .post(CreateImageResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs1/DockerCmdExecFactoryImpl.java new file mode 100644 index 000000000..328e59406 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/DockerCmdExecFactoryImpl.java @@ -0,0 +1,275 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.IOException; +import java.util.logging.Logger; + +import org.apache.http.client.HttpClient; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.PoolingClientConnectionManager; + +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs1.util.JsonClientFilter; +import com.github.dockerjava.jaxrs1.util.SelectiveLoggingFilter; +import com.google.common.base.Preconditions; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.client.apache4.ApacheHttpClient4; +import com.sun.jersey.client.apache4.ApacheHttpClient4Handler; + +public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { + + private Client client; + + private WebResource baseResource; + + private static final Logger LOGGER = Logger.getLogger(DockerCmdExecFactoryImpl.class.getName()); + + + @Override + public void init(DockerClientConfig dockerClientConfig) { + Preconditions.checkNotNull(dockerClientConfig, "config was not specified"); + + HttpClient httpClient = getPoolingHttpClient(dockerClientConfig); + ClientConfig clientConfig = new DefaultClientConfig(); + client = new ApacheHttpClient4(new ApacheHttpClient4Handler(httpClient, + null, false), clientConfig); + + if(dockerClientConfig.getReadTimeout() != null) { + client.setReadTimeout(dockerClientConfig.getReadTimeout()); + } + + client.addFilter(new JsonClientFilter()); + + if (dockerClientConfig.isLoggingFilterEnabled()) + client.addFilter(new SelectiveLoggingFilter()); + + WebResource webResource = client.resource(dockerClientConfig.getUri()); + + if(dockerClientConfig.getVersion() != null) { + baseResource = webResource.path("v" + dockerClientConfig.getVersion()); + } else { + baseResource = webResource; + } + } + + private HttpClient getPoolingHttpClient(DockerClientConfig dockerClientConfig) { + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", dockerClientConfig.getUri().getPort(), + PlainSocketFactory.getSocketFactory())); + schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory + .getSocketFactory())); + + PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry); + // Increase max total connection + cm.setMaxTotal(1000); + // Increase default max connection per route + cm.setDefaultMaxPerRoute(1000); + + return new DefaultHttpClient(cm); + } + + protected WebResource getBaseResource() { + Preconditions.checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + return baseResource; + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return new AuthCmdExec(getBaseResource()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(getBaseResource()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return new PingCmdExec(getBaseResource()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return new VersionCmdExec(getBaseResource()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return new PullImageCmdExec(getBaseResource()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return new PushImageCmdExec(getBaseResource()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return new SearchImagesCmdExec(getBaseResource()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return new ListImagesCmdExec(getBaseResource()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return new InspectImageCmdExec(getBaseResource()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return new ListContainersCmdExec(getBaseResource()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return new StartContainerCmdExec(getBaseResource()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return new InspectContainerCmdExec(getBaseResource()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return new WaitContainerCmdExec(getBaseResource()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return new AttachContainerCmdExec(getBaseResource()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return new LogContainerCmdExec(getBaseResource()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return new CopyFileFromContainerCmdExec(getBaseResource()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return new StopContainerCmdExec(getBaseResource()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return new ContainerDiffCmdExec(getBaseResource()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return new KillContainerCmdExec(getBaseResource()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return new RestartContainerCmdExec(getBaseResource()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return new CommitCmdExec(getBaseResource()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return new TopContainerCmdExec(getBaseResource()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return new TagImageCmdExec(getBaseResource()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return new PauseContainerCmdExec(getBaseResource()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return new UnpauseContainerCmdExec(baseResource); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return new EventsCmdExec(getBaseResource()); + } + + @Override + public void close() throws IOException { + Preconditions.checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); + client.destroy(); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/EventsCmdExec.java new file mode 100644 index 000000000..0b22cebc2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/EventsCmdExec.java @@ -0,0 +1,87 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.command.EventCallback; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.model.Event; +import com.google.common.base.Preconditions; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; + +public class EventsCmdExec extends AbstrDockerCmdExec implements EventsCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); + + public EventsCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected ExecutorService execute(EventsCmd command) { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + WebResource webResource = getBaseResource().path("/events") + .queryParam("since", command.getSince()) + .queryParam("until", command.getUntil()) + .build(); + + LOGGER.trace("GET: {}", webResource); + EventNotifier eventNotifier = EventNotifier.create(command.getEventCallback(), webResource); + executorService.submit(eventNotifier); + return executorService; + } + + private static class EventNotifier implements Callable { + private static final JsonFactory JSON_FACTORY = new JsonFactory(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private final EventCallback eventCallback; + private final WebResource WebResource; + + private EventNotifier(EventCallback eventCallback, WebResource WebResource) { + this.eventCallback = eventCallback; + this.WebResource = WebResource; + } + + public static EventNotifier create(EventCallback eventCallback, WebResource WebResource) { + Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided"); + Preconditions.checkNotNull(WebResource, "An WebResource must be provided"); + return new EventNotifier(eventCallback, WebResource); + } + + @Override + public Void call() throws Exception { + int numEvents=0; + ClientResponse response = null; + try { + response = WebResource.get(ClientResponse.class); + InputStream inputStream = response.getEntityInputStream(); + JsonParser jp = JSON_FACTORY.createParser(inputStream); + while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) { + eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class)); + numEvents++; + } + } + catch(Exception e) { + eventCallback.onException(e); + } + finally { + if (response != null) { + response.close(); + } + } + eventCallback.onCompletion(numEvents); + return null; + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/InfoCmdExec.java new file mode 100644 index 000000000..b1d1be48c --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/InfoCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.model.Info; +import com.sun.jersey.api.client.WebResource; + +public class InfoCmdExec extends AbstrDockerCmdExec implements InfoCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(InfoCmdExec.class); + + public InfoCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Info execute(InfoCmd command) { + WebResource webResource = getBaseResource().path("/info").build(); + + LOGGER.trace("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON).get(Info.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/InspectContainerCmdExec.java new file mode 100644 index 000000000..e32a98351 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/InspectContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.sun.jersey.api.client.WebResource; + +public class InspectContainerCmdExec extends AbstrDockerCmdExec implements InspectContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(InspectContainerCmdExec.class); + + public InspectContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InspectContainerResponse execute(InspectContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/json", command.getContainerId()) + .build(); + + LOGGER.debug("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/InspectImageCmdExec.java new file mode 100644 index 000000000..20df12d88 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/InspectImageCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.sun.jersey.api.client.WebResource; + +public class InspectImageCmdExec extends AbstrDockerCmdExec implements InspectImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(InspectImageCmdExec.class); + + public InspectImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InspectImageResponse execute(InspectImageCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/images/{id}/json", command.getImageId()) + .build(); + + LOGGER.trace("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON).get(InspectImageResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/KillContainerCmdExec.java new file mode 100644 index 000000000..e9763a182 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/KillContainerCmdExec.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.KillContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class KillContainerCmdExec extends AbstrDockerCmdExec implements KillContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(KillContainerCmdExec.class); + + public KillContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(KillContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/kill", command.getContainerId()) + .build(); + + if(command.getSignal() != null) { + webResource = webResource.queryParam("signal", command.getSignal()); + } + + LOGGER.trace("POST: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON) + .post(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/ListContainersCmdExec.java new file mode 100644 index 000000000..40bf4d6dd --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/ListContainersCmdExec.java @@ -0,0 +1,45 @@ +package com.github.dockerjava.jaxrs1; + +import java.util.List; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.model.Container; +import com.sun.jersey.api.client.GenericType; +import com.sun.jersey.api.client.WebResource; + +public class ListContainersCmdExec extends AbstrDockerCmdExec> implements ListContainersCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); + + public ListContainersCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected List execute(ListContainersCmd command) { + WebResource webResource = getBaseResource().path("/containers/json") + .queryParam("all", command.hasShowAllEnabled() ? "1" : "0") + .queryParam("since", command.getSinceId()) + .queryParam("before", command.getBeforeId()) + .queryParam("size", command.hasShowSizeEnabled() ? "1" : "0") + .build(); + + if (command.getLimit() >= 0) { + webResource = webResource.queryParam("limit", String.valueOf(command.getLimit())); + } + + LOGGER.trace("GET: {}", webResource); + List containers = webResource + .accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() {}); + LOGGER.trace("Response: {}", containers); + + return containers; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/ListImagesCmdExec.java new file mode 100644 index 000000000..056dc355d --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/ListImagesCmdExec.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.jaxrs1; + +import java.util.List; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.model.Image; +import com.sun.jersey.api.client.GenericType; +import com.sun.jersey.api.client.WebResource; + +public class ListImagesCmdExec extends AbstrDockerCmdExec> implements ListImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); + + public ListImagesCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected List execute(ListImagesCmd command) { + WebResource webResource = getBaseResource() + .path("/images/json") + .queryParam("filter", command.getFilter()) + .queryParam("all", command.hasShowAllEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("GET: {}", webResource); + + List images = webResource + .accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() {}); + LOGGER.trace("Response: {}", images); + + return images; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/LogContainerCmdExec.java new file mode 100644 index 000000000..091ddbace --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/LogContainerCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.LogContainerCmd; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; + +public class LogContainerCmdExec extends AbstrDockerCmdExec implements LogContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); + + public LogContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(LogContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/logs", command.getContainerId()) + .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") + .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") + .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") + .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") + .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()) + .build(); + + LOGGER.trace("GET: {}", webResource); + return webResource.get(ClientResponse.class).getEntityInputStream(); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/PauseContainerCmdExec.java new file mode 100644 index 000000000..e0ec59ee5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/PauseContainerCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class PauseContainerCmdExec extends AbstrDockerCmdExec implements PauseContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); + + public PauseContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(PauseContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/pause", command.getContainerId()) + .build(); + + LOGGER.trace("POST: {}", webResource); + webResource + .accept(MediaType.APPLICATION_JSON) + .entity(null, MediaType.APPLICATION_JSON) + .post(Response.class); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/PingCmdExec.java new file mode 100644 index 000000000..5185af9a2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/PingCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PingCmd; +import com.sun.jersey.api.client.WebResource; + +public class PingCmdExec extends AbstrDockerCmdExec implements PingCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); + + public PingCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(PingCmd command) { + WebResource webResource = getBaseResource().path("/_ping").build(); + + LOGGER.trace("GET: {}", webResource); + webResource.get(Response.class); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/PullImageCmdExec.java new file mode 100644 index 000000000..2bc6ed04a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/PullImageCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PullImageCmd; +import com.sun.jersey.api.client.WebResource; + +public class PullImageCmdExec extends AbstrDockerCmdExec implements PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); + + public PullImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(PullImageCmd command) { + WebResource webResource = getBaseResource().path("/images/create") + .queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()) + .queryParam("registry", command.getRegistry()) + .build(); + + LOGGER.trace("POST: {}", webResource); + return webResource + .accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(InputStream.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/PushImageCmdExec.java new file mode 100644 index 000000000..149ebb3e1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/PushImageCmdExec.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.model.AuthConfig; +import com.sun.jersey.api.client.WebResource; + +public class PushImageCmdExec extends AbstrDockerCmdExec implements PushImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); + + public PushImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected InputStream execute(PushImageCmd command) { + WebResource webResource = getBaseResource() + .path("/images/" + name(command) + "/push") + .build(); + + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("POST: {}", webResource); + return webResource + .header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON) + .entity(Response.class, MediaType.APPLICATION_JSON) + .post(InputStream.class); + } + + private String name(PushImageCmd command) { + String name = command.getName(); + AuthConfig authConfig = command.getAuthConfig(); + return name.contains("/") ? name : authConfig.getUsername(); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/RemoveContainerCmdExec.java new file mode 100644 index 000000000..6ef991657 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/RemoveContainerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class RemoveContainerCmdExec extends AbstrDockerCmdExec implements RemoveContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); + + public RemoveContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(RemoveContainerCmd command) { + WebResource webResource = getBaseResource() + .path("/containers/" + command.getContainerId()) + .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") + .queryParam("force", command.hasForceEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("DELETE: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON).delete(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/RemoveImageCmdExec.java new file mode 100644 index 000000000..fa37eeb3e --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/RemoveImageCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.sun.jersey.api.client.WebResource; + +public class RemoveImageCmdExec extends AbstrDockerCmdExec implements RemoveImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); + + public RemoveImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(RemoveImageCmd command) { + WebResource webResource = getBaseResource() + .path("/images/" + command.getImageId()) + .queryParam("force", command.hasForceEnabled() ? "1" : "0") + .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("DELETE: {}", webResource); + webResource.delete(Response.class); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/RestartContainerCmdExec.java new file mode 100644 index 000000000..8208708c7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/RestartContainerCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class RestartContainerCmdExec extends AbstrDockerCmdExec implements RestartContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); + + public RestartContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(RestartContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/restart", command.getContainerId()) + .queryParam("t", String.valueOf(command.getTimeout())) + .build(); + + LOGGER.trace("POST: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON) + .entity(null, MediaType.APPLICATION_JSON_TYPE) + .post(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/SearchImagesCmdExec.java new file mode 100644 index 000000000..14f79e0f6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/SearchImagesCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.jaxrs1; + +import java.util.List; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.model.SearchItem; +import com.sun.jersey.api.client.GenericType; +import com.sun.jersey.api.client.WebResource; + +public class SearchImagesCmdExec extends AbstrDockerCmdExec> implements SearchImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); + + public SearchImagesCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected List execute(SearchImagesCmd command) { + WebResource webResource = getBaseResource() + .path("/images/search") + .queryParam("term", command.getTerm()) + .build(); + + LOGGER.trace("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() {}); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/StartContainerCmdExec.java new file mode 100644 index 000000000..0cf558e20 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/StartContainerCmdExec.java @@ -0,0 +1,46 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.ByteArrayInputStream; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.BadRequestException; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class StartContainerCmdExec extends AbstrDockerCmdExec implements StartContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); + + public StartContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(StartContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/start", command.getContainerId()) + .build(); + + // Workaround for Docker issue 6231. This avoids the use of chunked encoding. + ObjectMapper mapper = new ObjectMapper(); + ByteArrayInputStream bais; + try { + bais = new ByteArrayInputStream(mapper.writeValueAsBytes(command)); + } catch (JsonProcessingException jpe) { + throw new BadRequestException("Unable to serialize start command", jpe); + } + LOGGER.trace("POST: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON) + .entity(bais, MediaType.APPLICATION_JSON) + .post(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/StopContainerCmdExec.java new file mode 100644 index 000000000..c5e58e082 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/StopContainerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.StopContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class StopContainerCmdExec extends AbstrDockerCmdExec implements StopContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); + + public StopContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(StopContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/stop", command.getContainerId()) + .queryParam("t", String.valueOf(command.getTimeout())) + .build(); + + LOGGER.trace("POST: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON) + .entity(null, MediaType.APPLICATION_JSON) + .post(); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/TagImageCmdExec.java new file mode 100644 index 000000000..13850bbc9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/TagImageCmdExec.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.TagImageCmd; +import com.sun.jersey.api.client.WebResource; + +public class TagImageCmdExec extends AbstrDockerCmdExec implements TagImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(TagImageCmdExec.class); + + public TagImageCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(TagImageCmd command) { + WebResource webResource = getBaseResource() + .path("/images/" + command.getImageId() + "/tag") + .queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()) + .queryParam("force", command.hasForceEnabled() ? "1" : "0") + .build(); + + LOGGER.trace("POST: {}", webResource); + webResource.entity(null, MediaType.APPLICATION_JSON) + .post();; + return null; + } + + + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/TopContainerCmdExec.java new file mode 100644 index 000000000..99435a0e9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/TopContainerCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.TopContainerResponse; +import com.sun.jersey.api.client.WebResource; + +public class TopContainerCmdExec extends AbstrDockerCmdExec implements TopContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); + + public TopContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected TopContainerResponse execute(TopContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/top", command.getContainerId()) + .build(); + + if(!StringUtils.isEmpty(command.getPsArgs())) + webResource = webResource.queryParam("ps_args", command.getPsArgs()); + + LOGGER.trace("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/UnpauseContainerCmdExec.java new file mode 100644 index 000000000..b0dca7184 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/UnpauseContainerCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class UnpauseContainerCmdExec extends AbstrDockerCmdExec implements UnpauseContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); + + public UnpauseContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Void execute(UnpauseContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/unpause", command.getContainerId()) + .build(); + + LOGGER.trace("POST: {}", webResource); + webResource.accept(MediaType.APPLICATION_JSON) + .entity(Response.class, MediaType.APPLICATION_JSON) + .post(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/VersionCmdExec.java new file mode 100644 index 000000000..50548d847 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/VersionCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.model.Version; +import com.sun.jersey.api.client.WebResource; + +public class VersionCmdExec extends AbstrDockerCmdExec implements VersionCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(VersionCmdExec.class); + + public VersionCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Version execute(VersionCmd command) { + WebResource webResource = getBaseResource().path("/version").build(); + + LOGGER.trace("GET: {}", webResource); + return webResource.accept(MediaType.APPLICATION_JSON) + .get(Version.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs1/WaitContainerCmdExec.java new file mode 100644 index 000000000..c712e8064 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/WaitContainerCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.jaxrs1; + +import javax.ws.rs.core.MediaType; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.sun.jersey.api.client.WebResource; + +public class WaitContainerCmdExec extends AbstrDockerCmdExec implements WaitContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(WaitContainerCmdExec.class); + + public WaitContainerCmdExec(WebResource baseResource) { + super(baseResource); + } + + @Override + protected Integer execute(WaitContainerCmd command) { + WebResource webResource = getBaseResource() + .resolveTemplate("/containers/{id}/wait", command.getContainerId()) + .build(); + + LOGGER.trace("POST: {}", webResource); + ObjectNode ObjectNode = webResource.accept(MediaType.APPLICATION_JSON) + .entity(null, MediaType.TEXT_PLAIN) + .post(ObjectNode.class); + + return ObjectNode.get("StatusCode").asInt(); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/jaxrs1/util/JsonClientFilter.java new file mode 100644 index 000000000..09eccfd89 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/util/JsonClientFilter.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.jaxrs1.util; + + +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.filter.ClientFilter; + +/** + * + * @author Konstantin Pelykh (kpelykh@gmail.com) + * + */ +public class JsonClientFilter extends ClientFilter { + + @Override + public ClientResponse handle(ClientRequest cr) throws ClientHandlerException { + // Call the next filter + ClientResponse resp = getNext().handle(cr); + String respContentType = resp.getHeaders().getFirst("Content-Type"); + if (respContentType != null && respContentType.startsWith("text/plain")) { + String newContentType = "application/json" + respContentType.substring(10); + resp.getHeaders().putSingle("Content-Type", newContentType); + } + return resp; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs1/util/ResponseStatusExceptionFilter.java new file mode 100644 index 000000000..8186c6fda --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/util/ResponseStatusExceptionFilter.java @@ -0,0 +1,104 @@ +package com.github.dockerjava.jaxrs1.util; + +import java.io.EOFException; +import java.io.IOException; +import java.nio.charset.Charset; + +import javax.ws.rs.core.MediaType; + +import org.apache.commons.io.IOUtils; + +import com.github.dockerjava.api.BadRequestException; +import com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotAcceptableException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.UnauthorizedException; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.filter.ClientFilter; + +/** + * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s + * + * @author marcus + * + */ +public class ResponseStatusExceptionFilter extends ClientFilter { + + + @Override + public ClientResponse handle(ClientRequest cr) throws ClientHandlerException { + // Call the next client handler in the filter chain + ClientResponse resp = getNext().handle(cr); + try { + filter(resp); + } catch (Exception e) { + throw new ClientHandlerException(e); + } + return resp; + } + + public void filter(ClientResponse response) throws IOException { + int status = response.getStatus(); + switch (status) { + case 200: + case 201: + case 204: + return; + case 304: + throw new NotModifiedException(getBodyAsMessage(response)); + case 400: + throw new BadRequestException(getBodyAsMessage(response)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(response)); + case 404: + throw new NotFoundException(getBodyAsMessage(response)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(response)); + case 409: + throw new ConflictException(getBodyAsMessage(response)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(response)); + default: + throw new DockerException(getBodyAsMessage(response), status); + } + } + + public String getBodyAsMessage(ClientResponse response) throws IOException { + if (response.hasEntity()) { + int contentLength = response.getLength(); + if (contentLength != -1) { + byte[] buffer = new byte[contentLength]; + try { + IOUtils.readFully(response.getEntityInputStream(), buffer); + } + catch (EOFException e) { + return null; + } + Charset charset = null; + MediaType mediaType = response.getType(); + if (mediaType != null) { + String charsetName = mediaType.getParameters().get("charset"); + if (charsetName != null) { + try { + charset = Charset.forName(charsetName); + } + catch (Exception e) { + //Do noting... + } + } + } + if (charset == null) { + charset = Charset.defaultCharset(); + } + String message = new String(buffer, charset); + return message; + } + } + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs1/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs1/util/SelectiveLoggingFilter.java new file mode 100644 index 000000000..1826808f0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs1/util/SelectiveLoggingFilter.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.jaxrs1.util; + +import java.util.Set; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; + +import com.google.common.collect.ImmutableSet; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; + +/** + * A version of the logging filter that will avoid trying to log entities which can cause + * issues with the console. + * + * @author sfitts + * + */ +public class SelectiveLoggingFilter extends com.sun.jersey.api.client.filter.LoggingFilter { + + + private static final Set SKIPPED_CONTENT = ImmutableSet.builder() + .add(MediaType.APPLICATION_OCTET_STREAM) + .add("application/tar") + .build(); + + @Override + public ClientResponse handle(ClientRequest request) throws ClientHandlerException { + // Unless the content type is in the list of those we want to ellide, then just have + // our super-class handle things. + Object contentType = request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); + if (contentType != null && SKIPPED_CONTENT.contains(contentType.toString())) { + // Skip logging this. + // + // N.B. -- I'd actually love to reproduce (or better yet just use) the logging code from + // our super-class. However, everything is private (so we can't use it) and the code + // is under a modified GPL which means we can't pull it into an ASL project. Right now + // I don't have the energy to do a clean implementation. + return getNext().handle(request); + } + + // Do what we normally would + return super.handle(request); + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/AbstrDockerCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/AbstrDockerCmdExec.java index 34414d73e..35e1fe7c4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/AbstrDockerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/AttachContainerCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/AttachContainerCmdExec.java index 5ed84c341..7392bb1f3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/AttachContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/AuthCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/AuthCmdExec.java index d73487bb8..3b3a52969 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/AuthCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/BuildImageCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/BuildImageCmdExec.java index 71d3f902c..9d4203cbe 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/BuildImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/CommitCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/CommitCmdExec.java index f1f4fe33a..2ffe2fdda 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/CommitCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/ContainerDiffCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/ContainerDiffCmdExec.java index 0a657ed90..ec02a3abd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/ContainerDiffCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/CopyFileFromContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/CopyFileFromContainerCmdExec.java index 27b4d5bd6..de15a4565 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/CopyFileFromContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/CreateContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/CreateContainerCmdExec.java index 26dc25cd2..a314b8963 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/CreateContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/CreateImageCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/CreateImageCmdExec.java index 4c7bae8b0..c5da5c326 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/CreateImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java new file mode 100644 index 000000000..bc81cb7c7 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java @@ -0,0 +1,46 @@ +package com.github.dockerjava.jaxrs2; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; + +public class DockerClientBuilder { + + private DockerClientImpl dockerClient = null; + + private DockerClientBuilder(DockerClientImpl dockerClient) { + this.dockerClient = dockerClient; + } + + public static DockerClientBuilder getInstance() { + return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl.getInstance())); + } + + public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { + return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl + .getInstance(dockerClientConfig))); + } + + public static DockerClientBuilder getInstance(String serverUrl) { + return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl + .getInstance(serverUrl))); + } + + private static DockerClientImpl withDefaultDockerCmdExecFactory( + DockerClientImpl dockerClient) { + return dockerClient + .withDockerCmdExecFactory(new DockerCmdExecFactoryImpl()); + } + + public DockerClientBuilder withDockerCmdExecFactory( + DockerCmdExecFactory dockerCmdExecFactory) { + dockerClient = dockerClient + .withDockerCmdExecFactory(dockerCmdExecFactory); + return this; + } + + public DockerClient build() { + return dockerClient; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs2/DockerCmdExecFactoryImpl.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java rename to src/main/java/com/github/dockerjava/jaxrs2/DockerCmdExecFactoryImpl.java index 74d3073f0..9181c2192 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/DockerCmdExecFactoryImpl.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.io.IOException; import java.util.logging.Logger; @@ -8,6 +8,7 @@ import javax.ws.rs.client.WebTarget; import com.github.dockerjava.api.command.EventsCmd; + import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.CommonProperties; @@ -45,9 +46,9 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.util.JsonClientFilter; -import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; -import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; +import com.github.dockerjava.jaxrs2.util.JsonClientFilter; +import com.github.dockerjava.jaxrs2.util.ResponseStatusExceptionFilter; +import com.github.dockerjava.jaxrs2.util.SelectiveLoggingFilter; import com.google.common.base.Preconditions; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/EventsCmdExec.java similarity index 98% rename from src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/EventsCmdExec.java index 545d7db98..8cce112a9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/EventsCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.io.InputStream; import java.util.concurrent.Callable; diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/InfoCmdExec.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/InfoCmdExec.java index aff72fab2..29b390902 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/InfoCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/InspectContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/InspectContainerCmdExec.java index 664a67c59..c93d1c343 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/InspectContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/InspectImageCmdExec.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/InspectImageCmdExec.java index 784266091..b73c95e75 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/InspectImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/KillContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/KillContainerCmdExec.java index 28496edc9..1b9e80729 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/KillContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/ListContainersCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/ListContainersCmdExec.java index 018db9a56..eae46ffb3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/ListContainersCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/ListImagesCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/ListImagesCmdExec.java index 5a000a294..520aa7551 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/ListImagesCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/LogContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/LogContainerCmdExec.java index 46d259424..21fa9f0e8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/LogContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/PauseContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/PauseContainerCmdExec.java index ee84a3209..4306b92bf 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/PauseContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/PingCmdExec.java similarity index 94% rename from src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/PingCmdExec.java index abfb0f4cc..14c24b8aa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/PingCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/PullImageCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/PullImageCmdExec.java index 4ac190be4..f1b44fac7 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/PullImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/PushImageCmdExec.java similarity index 97% rename from src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/PushImageCmdExec.java index 8d5aabefb..dbad50541 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/PushImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/RemoveContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/RemoveContainerCmdExec.java index 7f45bdda2..7f40d561d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/RemoveContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/RemoveImageCmdExec.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/RemoveImageCmdExec.java index 54fb327b4..80c391aa2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/RemoveImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/RestartContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/RestartContainerCmdExec.java index fe544f134..7a49bcc4c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/RestartContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/SearchImagesCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/SearchImagesCmdExec.java index a7b6ddbc2..fd395fa1d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/SearchImagesCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import java.util.List; diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/StartContainerCmdExec.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/StartContainerCmdExec.java index 8a2c09a44..196bc11d9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/StartContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/StopContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/StopContainerCmdExec.java index 337c71b2e..34a9c7d45 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/StopContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/TagImageCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/TagImageCmdExec.java index d8545e339..3f3e0e896 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/TagImageCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/TopContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/TopContainerCmdExec.java index 55c431ccd..c05ae3f37 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/TopContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/UnpauseContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/UnpauseContainerCmdExec.java index 361f9adcf..99b50436a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/UnpauseContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; diff --git a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/VersionCmdExec.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/VersionCmdExec.java index 9b4ac817a..71203fd19 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/VersionCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs2/WaitContainerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs2/WaitContainerCmdExec.java index e6f95586c..4dc7a5108 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/WaitContainerCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs; +package com.github.dockerjava.jaxrs2; import static javax.ws.rs.client.Entity.entity; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/jaxrs2/util/JsonClientFilter.java similarity index 95% rename from src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java rename to src/main/java/com/github/dockerjava/jaxrs2/util/JsonClientFilter.java index e0eaa4a4a..3c19653ad 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/JsonClientFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/util/JsonClientFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.jaxrs2.util; import javax.ws.rs.client.ClientRequestContext; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs2/util/ResponseStatusExceptionFilter.java similarity index 98% rename from src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java rename to src/main/java/com/github/dockerjava/jaxrs2/util/ResponseStatusExceptionFilter.java index 61d97f93b..25d0e38c6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/util/ResponseStatusExceptionFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.jaxrs2.util; import java.io.EOFException; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs2/util/SelectiveLoggingFilter.java similarity index 96% rename from src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java rename to src/main/java/com/github/dockerjava/jaxrs2/util/SelectiveLoggingFilter.java index 7f7e06c73..1682f1d9b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs2/util/SelectiveLoggingFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.jaxrs.util; +package com.github.dockerjava.jaxrs2.util; import java.io.IOException; import java.util.Set; diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 385508b68..443609b1b 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -16,8 +16,8 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.core.DockerClientBuilder; -import com.github.dockerjava.core.TestDockerCmdExecFactory; +import com.github.dockerjava.jaxrs1.DockerClientBuilder; +import com.github.dockerjava.jaxrs1.TestDockerCmdExecFactory; public abstract class AbstractDockerClientTest extends Assert { diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java index 5645ccc0b..dec2711b6 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -15,6 +15,7 @@ import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs1.DockerClientBuilder; public class AuthCmdImplTest extends AbstractDockerClientTest { 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 353fea12d..6ff40d35a 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -14,7 +14,6 @@ import java.lang.reflect.Method; import org.apache.commons.lang.StringUtils; - import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index a45333326..9f43f99cd 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -17,6 +17,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.*; +import com.github.dockerjava.client.AbstractDockerClientTest; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -25,8 +26,6 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.client.AbstractDockerClientTest; - public class StartContainerCmdImplTest extends AbstractDockerClientTest { diff --git a/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java new file mode 100644 index 000000000..c14dfa879 --- /dev/null +++ b/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java @@ -0,0 +1,112 @@ +package com.github.dockerjava.jaxrs1; + +import java.io.InputStream; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; + +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.jaxrs1.BuildImageCmdExec; +import com.github.dockerjava.jaxrs1.CreateContainerCmdExec; +import com.github.dockerjava.jaxrs1.CreateImageCmdExec; +import com.github.dockerjava.jaxrs1.DockerCmdExecFactoryImpl; +import com.github.dockerjava.jaxrs1.RemoveContainerCmdExec; +import com.github.dockerjava.jaxrs1.RemoveImageCmdExec; + +/** + * Special {@link DockerCmdExecFactory} implementation that collects container and image creations + * while test execution for the purpose of automatically cleanup. + * + * @author marcus + * + */ +public class TestDockerCmdExecFactory extends DockerCmdExecFactoryImpl { + + private List containerNames = new ArrayList(); + + private List imageNames = new ArrayList(); + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()) { + @Override + public CreateContainerResponse exec(CreateContainerCmd command) { + CreateContainerResponse createContainerResponse = super.exec(command); + containerNames.add(createContainerResponse.getId()); + return createContainerResponse; + } + }; + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()) { + @Override + public Void exec(RemoveContainerCmd command) { + super.exec(command); + containerNames.remove(command.getContainerId()); + return null; + } + }; + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()) { + @Override + public CreateImageResponse exec(CreateImageCmd command) { + CreateImageResponse createImageResponse = super.exec(command); + imageNames.add(createImageResponse.getId()); + return createImageResponse; + } + }; + } + + + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()) { + @Override + public Void exec(RemoveImageCmd command) { + super.exec(command); + imageNames.remove(command.getImageId()); + return null; + } + }; + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()) { + @Override + public InputStream exec(BuildImageCmd command) { + // can't detect image id here so tagging it + String tag = command.getTag(); + if(tag == null || "".equals(tag.trim())) { + tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); + command.withTag(tag); + } + InputStream inputStream = super.exec(command); + imageNames.add(tag); + return inputStream; + } + }; + } + + public List getContainerNames() { + return new ArrayList(containerNames); + } + + public List getImageNames() { + return new ArrayList(imageNames); + } + +} diff --git a/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java new file mode 100644 index 000000000..ba2c166b9 --- /dev/null +++ b/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java @@ -0,0 +1,112 @@ +package com.github.dockerjava.jaxrs2; + +import java.io.InputStream; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.List; + +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.api.command.DockerCmdExecFactory; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.jaxrs2.BuildImageCmdExec; +import com.github.dockerjava.jaxrs2.CreateContainerCmdExec; +import com.github.dockerjava.jaxrs2.CreateImageCmdExec; +import com.github.dockerjava.jaxrs2.DockerCmdExecFactoryImpl; +import com.github.dockerjava.jaxrs2.RemoveContainerCmdExec; +import com.github.dockerjava.jaxrs2.RemoveImageCmdExec; + +/** + * Special {@link DockerCmdExecFactory} implementation that collects container and image creations + * while test execution for the purpose of automatically cleanup. + * + * @author marcus + * + */ +public class TestDockerCmdExecFactory extends DockerCmdExecFactoryImpl { + + private List containerNames = new ArrayList(); + + private List imageNames = new ArrayList(); + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return new CreateContainerCmdExec(getBaseResource()) { + @Override + public CreateContainerResponse exec(CreateContainerCmd command) { + CreateContainerResponse createContainerResponse = super.exec(command); + containerNames.add(createContainerResponse.getId()); + return createContainerResponse; + } + }; + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return new RemoveContainerCmdExec(getBaseResource()) { + @Override + public Void exec(RemoveContainerCmd command) { + super.exec(command); + containerNames.remove(command.getContainerId()); + return null; + } + }; + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return new CreateImageCmdExec(getBaseResource()) { + @Override + public CreateImageResponse exec(CreateImageCmd command) { + CreateImageResponse createImageResponse = super.exec(command); + imageNames.add(createImageResponse.getId()); + return createImageResponse; + } + }; + } + + + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return new RemoveImageCmdExec(getBaseResource()) { + @Override + public Void exec(RemoveImageCmd command) { + super.exec(command); + imageNames.remove(command.getImageId()); + return null; + } + }; + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return new BuildImageCmdExec(getBaseResource()) { + @Override + public InputStream exec(BuildImageCmd command) { + // can't detect image id here so tagging it + String tag = command.getTag(); + if(tag == null || "".equals(tag.trim())) { + tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); + command.withTag(tag); + } + InputStream inputStream = super.exec(command); + imageNames.add(tag); + return inputStream; + } + }; + } + + public List getContainerNames() { + return new ArrayList(containerNames); + } + + public List getImageNames() { + return new ArrayList(imageNames); + } + +} From 8e44173eda29781ab401adb049b049f07d64c969 Mon Sep 17 00:00:00 2001 From: Sean Fitts Date: Mon, 17 Nov 2014 13:22:45 -0800 Subject: [PATCH 2/3] Add option to reuse existing host config on start --- .../api/command/StartContainerCmd.java | 14 ++++++++++ .../core/command/StartContainerCmdImpl.java | 14 ++++++++++ .../jaxrs1/StartContainerCmdExec.java | 26 ++++++++++--------- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index ed16a727c..d41df1cf2 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -113,6 +113,20 @@ public interface StartContainerCmd extends DockerCmd { * "CHOWN" prevents the container from changing the owner of any files. */ public StartContainerCmd withCapDrop(String... capDrop); + + /** + * Perform the start using the existing host configuration for the container. + * + * @param withExisting true if the container's existing configuration should be used. + * + * @return + */ + public StartContainerCmd withExistingConfig(boolean withExisting); + + /** + * @return true if the container should use its existing configuration. + */ + public boolean useExistingConfig(); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 9cf830833..dd11ed74b 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -66,6 +66,9 @@ public class StartContainerCmdImpl extends AbstrDockerCmd implements StartContainerCmd.Exec { @@ -27,19 +28,20 @@ protected Void execute(StartContainerCmd command) { .resolveTemplate("/containers/{id}/start", command.getContainerId()) .build(); - // Workaround for Docker issue 6231. This avoids the use of chunked encoding. - ObjectMapper mapper = new ObjectMapper(); - ByteArrayInputStream bais; - try { - bais = new ByteArrayInputStream(mapper.writeValueAsBytes(command)); - } catch (JsonProcessingException jpe) { - throw new BadRequestException("Unable to serialize start command", jpe); - } + Builder builder = webResource.accept(MediaType.APPLICATION_JSON); + if (!command.useExistingConfig()) { + // Workaround for Docker issue 6231. This avoids the use of chunked encoding. + ObjectMapper mapper = new ObjectMapper(); + ByteArrayInputStream bais; + try { + bais = new ByteArrayInputStream(mapper.writeValueAsBytes(command)); + } catch (JsonProcessingException jpe) { + throw new BadRequestException("Unable to serialize start command", jpe); + } + builder = builder.entity(bais, MediaType.APPLICATION_JSON); + } LOGGER.trace("POST: {}", webResource); - webResource.accept(MediaType.APPLICATION_JSON) - .entity(bais, MediaType.APPLICATION_JSON) - .post(); - + builder.post(); return null; } From 74909a1836705a574f740322968ced845e33be4d Mon Sep 17 00:00:00 2001 From: Sean Fitts Date: Mon, 17 Nov 2014 14:33:00 -0800 Subject: [PATCH 3/3] Post rebase cleanup -- finally in the right spot --- .../jaxrs2/DockerClientBuilder.java | 46 ------- ...ockerjava.api.command.DockerCmdExecFactory | 2 +- .../client/AbstractDockerClientTest.java | 4 +- .../core/command/AuthCmdImplTest.java | 1 - .../jaxrs1/TestDockerCmdExecFactory.java | 112 ------------------ .../jaxrs2/TestDockerCmdExecFactory.java | 112 ------------------ 6 files changed, 3 insertions(+), 274 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java delete mode 100644 src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java delete mode 100644 src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java diff --git a/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java deleted file mode 100644 index bc81cb7c7..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs2/DockerClientBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.github.dockerjava.jaxrs2; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.DockerClientImpl; - -public class DockerClientBuilder { - - private DockerClientImpl dockerClient = null; - - private DockerClientBuilder(DockerClientImpl dockerClient) { - this.dockerClient = dockerClient; - } - - public static DockerClientBuilder getInstance() { - return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl.getInstance())); - } - - public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig) { - return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl - .getInstance(dockerClientConfig))); - } - - public static DockerClientBuilder getInstance(String serverUrl) { - return new DockerClientBuilder(withDefaultDockerCmdExecFactory(DockerClientImpl - .getInstance(serverUrl))); - } - - private static DockerClientImpl withDefaultDockerCmdExecFactory( - DockerClientImpl dockerClient) { - return dockerClient - .withDockerCmdExecFactory(new DockerCmdExecFactoryImpl()); - } - - public DockerClientBuilder withDockerCmdExecFactory( - DockerCmdExecFactory dockerCmdExecFactory) { - dockerClient = dockerClient - .withDockerCmdExecFactory(dockerCmdExecFactory); - return this; - } - - public DockerClient build() { - return dockerClient; - } -} diff --git a/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory b/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory index f0686bc9f..0fbd6fcd3 100644 --- a/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory +++ b/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory @@ -1 +1 @@ -com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl \ No newline at end of file +com.github.dockerjava.jaxrs1.DockerCmdExecFactoryImpl \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 443609b1b..385508b68 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -16,8 +16,8 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.jaxrs1.DockerClientBuilder; -import com.github.dockerjava.jaxrs1.TestDockerCmdExecFactory; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.core.TestDockerCmdExecFactory; public abstract class AbstractDockerClientTest extends Assert { diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java index dec2711b6..5645ccc0b 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -15,7 +15,6 @@ import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs1.DockerClientBuilder; public class AuthCmdImplTest extends AbstractDockerClientTest { diff --git a/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java deleted file mode 100644 index c14dfa879..000000000 --- a/src/test/java/com/github/dockerjava/jaxrs1/TestDockerCmdExecFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.github.dockerjava.jaxrs1; - -import java.io.InputStream; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; - -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.github.dockerjava.api.command.RemoveImageCmd; -import com.github.dockerjava.jaxrs1.BuildImageCmdExec; -import com.github.dockerjava.jaxrs1.CreateContainerCmdExec; -import com.github.dockerjava.jaxrs1.CreateImageCmdExec; -import com.github.dockerjava.jaxrs1.DockerCmdExecFactoryImpl; -import com.github.dockerjava.jaxrs1.RemoveContainerCmdExec; -import com.github.dockerjava.jaxrs1.RemoveImageCmdExec; - -/** - * Special {@link DockerCmdExecFactory} implementation that collects container and image creations - * while test execution for the purpose of automatically cleanup. - * - * @author marcus - * - */ -public class TestDockerCmdExecFactory extends DockerCmdExecFactoryImpl { - - private List containerNames = new ArrayList(); - - private List imageNames = new ArrayList(); - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()) { - @Override - public CreateContainerResponse exec(CreateContainerCmd command) { - CreateContainerResponse createContainerResponse = super.exec(command); - containerNames.add(createContainerResponse.getId()); - return createContainerResponse; - } - }; - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()) { - @Override - public Void exec(RemoveContainerCmd command) { - super.exec(command); - containerNames.remove(command.getContainerId()); - return null; - } - }; - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()) { - @Override - public CreateImageResponse exec(CreateImageCmd command) { - CreateImageResponse createImageResponse = super.exec(command); - imageNames.add(createImageResponse.getId()); - return createImageResponse; - } - }; - } - - - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()) { - @Override - public Void exec(RemoveImageCmd command) { - super.exec(command); - imageNames.remove(command.getImageId()); - return null; - } - }; - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()) { - @Override - public InputStream exec(BuildImageCmd command) { - // can't detect image id here so tagging it - String tag = command.getTag(); - if(tag == null || "".equals(tag.trim())) { - tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); - command.withTag(tag); - } - InputStream inputStream = super.exec(command); - imageNames.add(tag); - return inputStream; - } - }; - } - - public List getContainerNames() { - return new ArrayList(containerNames); - } - - public List getImageNames() { - return new ArrayList(imageNames); - } - -} diff --git a/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java deleted file mode 100644 index ba2c166b9..000000000 --- a/src/test/java/com/github/dockerjava/jaxrs2/TestDockerCmdExecFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.github.dockerjava.jaxrs2; - -import java.io.InputStream; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; - -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.github.dockerjava.api.command.RemoveImageCmd; -import com.github.dockerjava.jaxrs2.BuildImageCmdExec; -import com.github.dockerjava.jaxrs2.CreateContainerCmdExec; -import com.github.dockerjava.jaxrs2.CreateImageCmdExec; -import com.github.dockerjava.jaxrs2.DockerCmdExecFactoryImpl; -import com.github.dockerjava.jaxrs2.RemoveContainerCmdExec; -import com.github.dockerjava.jaxrs2.RemoveImageCmdExec; - -/** - * Special {@link DockerCmdExecFactory} implementation that collects container and image creations - * while test execution for the purpose of automatically cleanup. - * - * @author marcus - * - */ -public class TestDockerCmdExecFactory extends DockerCmdExecFactoryImpl { - - private List containerNames = new ArrayList(); - - private List imageNames = new ArrayList(); - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()) { - @Override - public CreateContainerResponse exec(CreateContainerCmd command) { - CreateContainerResponse createContainerResponse = super.exec(command); - containerNames.add(createContainerResponse.getId()); - return createContainerResponse; - } - }; - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()) { - @Override - public Void exec(RemoveContainerCmd command) { - super.exec(command); - containerNames.remove(command.getContainerId()); - return null; - } - }; - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()) { - @Override - public CreateImageResponse exec(CreateImageCmd command) { - CreateImageResponse createImageResponse = super.exec(command); - imageNames.add(createImageResponse.getId()); - return createImageResponse; - } - }; - } - - - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()) { - @Override - public Void exec(RemoveImageCmd command) { - super.exec(command); - imageNames.remove(command.getImageId()); - return null; - } - }; - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()) { - @Override - public InputStream exec(BuildImageCmd command) { - // can't detect image id here so tagging it - String tag = command.getTag(); - if(tag == null || "".equals(tag.trim())) { - tag = "" + new SecureRandom().nextInt(Integer.MAX_VALUE); - command.withTag(tag); - } - InputStream inputStream = super.exec(command); - imageNames.add(tag); - return inputStream; - } - }; - } - - public List getContainerNames() { - return new ArrayList(containerNames); - } - - public List getImageNames() { - return new ArrayList(imageNames); - } - -}