From 38d84c21ccdea09ddc0b89528f6ebf5ffb0fadf1 Mon Sep 17 00:00:00 2001 From: efj Date: Tue, 3 Mar 2015 15:58:26 +0100 Subject: [PATCH 1/7] Implemented HTTP Basic Auth for DockerClient. --- .../dockerjava/core/DockerClientConfig.java | 40 ++++++++++-- .../core/util/BasicAuthenticationFilter.java | 36 +++++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 61 ++++++++++++++++--- .../core/DockerClientConfigTest.java | 2 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- 5 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index aa5f99b0c..0949bcc01 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -39,6 +39,7 @@ public class DockerClientConfig implements Serializable { // connection pooling properties private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; + /** * A map from the environment name to the interval name. */ @@ -62,7 +63,7 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; private URI uri; - private final String version, username, password, email, serverAddress, dockerCfgPath; + private final String version, username, password, email, serverAddress, dockerCfgPath, basicAuthUsername, basicAuthPassword; private final Integer readTimeout; private final boolean loggingFilterEnabled; private final boolean followRedirectsFilterEnabled; @@ -73,7 +74,7 @@ public class DockerClientConfig implements Serializable { DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, boolean followRedirectsFilterEnabled, - SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { + SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns, String basicAuthUsername, String basicAuthPassword) { this.uri = uri; this.version = version; this.username = username; @@ -87,6 +88,8 @@ public class DockerClientConfig implements Serializable { this.sslConfig = sslConfig; this.maxTotalConnections = maxTotalConns; this.maxPerRouteConnections = maxPerRouteConns; + this.basicAuthUsername = basicAuthUsername; + this.basicAuthPassword = basicAuthPassword; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -267,6 +270,14 @@ public Integer getMaxTotalConnections() { public Integer getMaxPerRoutConnections() { return maxPerRouteConnections; } + + public String getBasicAuthUsername(){ + return this.basicAuthUsername; + } + + public String getBasicAuthPassword(){ + return this.basicAuthPassword; + } private AuthConfig getAuthConfig() { AuthConfig authConfig = null; @@ -330,7 +341,8 @@ public boolean equals(Object o) { if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; if (version != null ? !version.equals(that.version) : that.version != null) return false; - + if (basicAuthUsername != null ? !basicAuthUsername.equals(that.basicAuthUsername) : that.basicAuthUsername != null) return false; + if (basicAuthPassword != null ? !basicAuthPassword.equals(that.version) : that.basicAuthPassword != null) return false; return true; } @@ -345,6 +357,8 @@ public int hashCode() { result = 31 * result + (dockerCfgPath != null ? dockerCfgPath.hashCode() : 0); result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); result = 31 * result + (readTimeout != null ? readTimeout.hashCode() : 0); + result = 31 * result + (basicAuthUsername != null ? basicAuthUsername.hashCode() : 0); + result = 31 * result + (basicAuthPassword != null ? basicAuthPassword.hashCode() : 0); result = 31 * result + (loggingFilterEnabled ? 1 : 0); return result; } @@ -363,12 +377,14 @@ public String toString() { ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + + ", basicAuthUsername=" + basicAuthUsername + + ", basicAuthPassword=" + basicAuthPassword + '}'; } public static class DockerClientConfigBuilder { private URI uri; - private String version, username, password, email, serverAddress, dockerCfgPath; + private String version, username, password, email, serverAddress, dockerCfgPath, basicAuthUsername, basicAuthPassword; private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; private boolean loggingFilterEnabled, followRedirectsFilterEnabled; private SSLConfig sslConfig; @@ -392,6 +408,7 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) + .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); } @@ -474,6 +491,17 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { return this; } + + public final DockerClientConfigBuilder withBasicAuthUsername(String username) { + this.basicAuthUsername = username; + return this; + } + + public final DockerClientConfigBuilder withBasicAuthPassword(String password) { + this.basicAuthPassword = password; + return this; + } + public DockerClientConfig build() { return new DockerClientConfig( uri, @@ -488,7 +516,9 @@ public DockerClientConfig build() { followRedirectsFilterEnabled, sslConfig, maxTotalConnections, - maxPerRouteConnections + maxPerRouteConnections, + basicAuthUsername, + basicAuthPassword ); } } diff --git a/src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java b/src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java new file mode 100644 index 000000000..8a199a685 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.core.util; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.core.MultivaluedMap; +import javax.xml.bind.DatatypeConverter; + +public class BasicAuthenticationFilter implements ClientRequestFilter { + + private final String user; + private final String password; + + public BasicAuthenticationFilter(String user, String password) { + this.user = user; + this.password = password; + } + + public void filter(ClientRequestContext requestContext) throws IOException { + MultivaluedMap headers = requestContext.getHeaders(); + final String basicAuthentication = getBasicAuthentication(); + headers.add("Authorization", basicAuthentication); + + } + + private String getBasicAuthentication() { + String token = this.user + ":" + this.password; + try { + return "BASIC " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8")); + } catch (UnsupportedEncodingException ex) { + throw new IllegalStateException("Cannot encode with UTF-8", ex); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 9df09ba78..dd71db1f1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -5,11 +5,6 @@ import java.io.IOException; import java.net.URI; -import com.github.dockerjava.api.command.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; @@ -25,10 +20,50 @@ import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; +import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; +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.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +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.SaveImageCmd; +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.core.util.BasicAuthenticationFilter; import com.github.dockerjava.core.util.FollowRedirectsFilter; import com.github.dockerjava.core.util.JsonClientFilter; import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; @@ -39,10 +74,15 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); private Client client; private WebTarget baseResource; + protected HttpAuthenticationFeature basicAuthFeature; @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); + + +// basicAuthFeature = HttpAuthenticationFeature.universal(dockerClientConfig.getBasicAuthUsername(), dockerClientConfig.getBasicAuthPassword()); +// } ClientConfig clientConfig = new ClientConfig(); clientConfig.connectorProvider(new ApacheConnectorProvider()); @@ -64,7 +104,7 @@ public void init(DockerClientConfig dockerClientConfig) { int readTimeout = dockerClientConfig.getReadTimeout(); clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); } - + URI originalUri = dockerClientConfig.getUri(); SSLContext sslContext; @@ -83,6 +123,8 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); + clientConfig.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED); + ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); if (sslContext != null) { @@ -91,11 +133,16 @@ public void init(DockerClientConfig dockerClientConfig) { client = clientBuilder.build(); + if(dockerClientConfig.getBasicAuthUsername() != null && dockerClientConfig.getBasicAuthPassword() != null){ + client.register(new BasicAuthenticationFilter(dockerClientConfig.getBasicAuthUsername(), dockerClientConfig.getBasicAuthPassword())); + } + if (originalUri.getScheme().equals("unix")) { dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); } + WebTarget webResource = client.target(dockerClientConfig.getUri()); - + if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { baseResource = webResource; } else { diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 64ab912d0..c79efa8ca 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,7 +16,7 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2, null, null); } @Test diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 2a961e3b8..10c42db74 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2, null, null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config From 38af07a2d05d29be7d8c97e4916cb8186643b44e Mon Sep 17 00:00:00 2001 From: efj Date: Wed, 4 Mar 2015 17:47:20 +0100 Subject: [PATCH 2/7] Implemented AuthConfigurations for the Build command. Required when creating an image with a FROM command, using a private registry. --- .../dockerjava/api/command/BuildImageCmd.java | 10 +++++++-- .../api/model/AuthConfigurations.java | 21 +++++++++++++++++++ .../dockerjava/api/model/EventStreamItem.java | 4 +++- .../api/model/PushEventStreamItem.java | 4 +++- .../core/command/BuildImageCmdImpl.java | 14 +++++++++++++ .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 10 +++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 16 ++++++++++---- 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index d9e45b4b5..62d8abed6 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,10 +1,11 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.model.EventStreamItem; - import java.io.IOException; import java.io.InputStream; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.EventStreamItem; + /** * * Build an image from Dockerfile. @@ -26,6 +27,8 @@ public interface BuildImageCmd extends DockerCmd{ public boolean isQuiet(); + public AuthConfigurations getBuildAuthConfigs(); + public BuildImageCmd withTarInputStream(InputStream tarInputStream); public BuildImageCmd withNoCache(); @@ -40,10 +43,13 @@ public interface BuildImageCmd extends DockerCmd{ public BuildImageCmd withQuiet(boolean quiet); + public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); + public static interface Exec extends DockerCmdExec { } public static abstract class Response extends InputStream { public abstract Iterable getItems() throws IOException; } + } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java new file mode 100644 index 000000000..5a62c7587 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java @@ -0,0 +1,21 @@ +package com.github.dockerjava.api.model; + +import java.util.Map; +import java.util.TreeMap; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AuthConfigurations { + + @JsonProperty("configs") + private Map configs = new TreeMap<>(); + + public void addConfig(AuthConfig authConfig){ + configs.put(authConfig.getServerAddress(), authConfig); + } + + public Map getConfigs(){ + return this.configs; + } + +} diff --git a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java index 5dd9d65c8..010ed9af7 100644 --- a/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/EventStreamItem.java @@ -15,7 +15,9 @@ @JsonIgnoreProperties(ignoreUnknown=true) public class EventStreamItem implements Serializable { - @JsonProperty("stream") + private static final long serialVersionUID = 638778515773898651L; + + @JsonProperty("stream") private String stream; // {"error":"Error...", "errorDetail":{"code": 123, "message": "Error..."}} diff --git a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java index 7230a7cef..c8aac4c9c 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushEventStreamItem.java @@ -13,7 +13,9 @@ @JsonIgnoreProperties(ignoreUnknown=true) public class PushEventStreamItem implements Serializable { - @JsonProperty("status") + private static final long serialVersionUID = -5187169652557467828L; + + @JsonProperty("status") private String status; @JsonProperty("progress") diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 40f4fcfd0..9f57bd74a 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -7,6 +7,7 @@ import java.io.InputStream; import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.dockerfile.Dockerfile; /** @@ -22,6 +23,7 @@ public class BuildImageCmdImpl extends AbstrDockerCmd, RES_T> implements DockerCmdExec { @@ -38,6 +39,15 @@ protected String registryAuth(AuthConfig authConfig) { throw new RuntimeException(e); } } + + protected String registryConfigs(AuthConfigurations authConfigs) { + try { + return Base64.encodeBase64String(new ObjectMapper() + .writeValueAsString(authConfigs).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } @Override public RES_T exec(CMD_T command) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 431980468..8cb5d2899 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.util.Iterator; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -18,9 +19,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.github.dockerjava.api.command.BuildImageCmd; - +import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.EventStreamItem; - import com.google.common.collect.ImmutableList; public class BuildImageCmdExec extends AbstrDockerCmdExec implements BuildImageCmd.Exec { @@ -55,14 +55,22 @@ protected ResponseImpl execute(BuildImageCmd command) { LOGGER.debug("POST: {}", webResource); - InputStream is = webResource - .request() + InputStream is = resourceWithOptionalAuthConfig(command, webResource.request()) .accept(MediaType.TEXT_PLAIN) .post(entity(command.getTarInputStream(), "application/tar"), Response.class).readEntity(InputStream.class); return new ResponseImpl(is); } + + private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + public static class ResponseImpl extends BuildImageCmd.Response { private final InputStream proxy; From 77dcad643670fe51184f85a17e6a44bb22dc8307 Mon Sep 17 00:00:00 2001 From: efj Date: Sun, 8 Mar 2015 14:52:55 +0100 Subject: [PATCH 3/7] Introduced AbstractHttpFeature as DockerClientBuilder parameter. Removed basic auth parameters from DockerClientConfig. Created first AbstractHttpFeature: HttpBasicAuthenticationFeature. --- .../api/command/DockerCmdExecFactory.java | 4 +- .../dockerjava/core/DockerClientBuilder.java | 7 ++ .../dockerjava/core/DockerClientConfig.java | 37 +------- .../dockerjava/core/DockerClientImpl.java | 92 ++++++++++++++++++- .../core/http/AbstractHttpFeature.java | 14 +++ .../HttpBasicAuthenticationFeature.java} | 20 +++- .../jaxrs/DockerCmdExecFactoryImpl.java | 24 ++--- .../core/DockerClientConfigTest.java | 2 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- .../core/TestDockerCmdExecFactory.java | 5 +- 10 files changed, 151 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/http/AbstractHttpFeature.java rename src/main/java/com/github/dockerjava/core/{util/BasicAuthenticationFilter.java => http/HttpBasicAuthenticationFeature.java} (61%) diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index ca2bbcae0..82b3c04a1 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -2,12 +2,14 @@ import java.io.Closeable; import java.io.IOException; +import java.util.List; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.http.AbstractHttpFeature; public interface DockerCmdExecFactory extends Closeable { - public void init(DockerClientConfig dockerClientConfig); + public void init(DockerClientConfig dockerClientConfig, List httpFeatures); public AuthCmd.Exec createAuthCmdExec(); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 155b36bed..8ce827dc5 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -1,10 +1,12 @@ package com.github.dockerjava.core; +import java.util.List; import java.util.ServiceLoader; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; +import com.github.dockerjava.core.http.AbstractHttpFeature; public class DockerClientBuilder { @@ -30,6 +32,11 @@ public static DockerClientBuilder getInstance(DockerClientConfig dockerClientCon .getInstance(dockerClientConfig)); } + public static DockerClientBuilder getInstance(DockerClientConfig dockerClientConfig, List httpFeatures) { + return new DockerClientBuilder(DockerClientImpl + .getInstance(dockerClientConfig, httpFeatures)); + } + public static DockerClientBuilder getInstance(String serverUrl) { return new DockerClientBuilder(DockerClientImpl .getInstance(serverUrl)); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 0949bcc01..22bda9e47 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -63,7 +63,7 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; private URI uri; - private final String version, username, password, email, serverAddress, dockerCfgPath, basicAuthUsername, basicAuthPassword; + private final String version, username, password, email, serverAddress, dockerCfgPath; private final Integer readTimeout; private final boolean loggingFilterEnabled; private final boolean followRedirectsFilterEnabled; @@ -74,7 +74,7 @@ public class DockerClientConfig implements Serializable { DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, boolean followRedirectsFilterEnabled, - SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns, String basicAuthUsername, String basicAuthPassword) { + SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { this.uri = uri; this.version = version; this.username = username; @@ -88,8 +88,6 @@ public class DockerClientConfig implements Serializable { this.sslConfig = sslConfig; this.maxTotalConnections = maxTotalConns; this.maxPerRouteConnections = maxPerRouteConns; - this.basicAuthUsername = basicAuthUsername; - this.basicAuthPassword = basicAuthPassword; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -270,14 +268,6 @@ public Integer getMaxTotalConnections() { public Integer getMaxPerRoutConnections() { return maxPerRouteConnections; } - - public String getBasicAuthUsername(){ - return this.basicAuthUsername; - } - - public String getBasicAuthPassword(){ - return this.basicAuthPassword; - } private AuthConfig getAuthConfig() { AuthConfig authConfig = null; @@ -341,8 +331,6 @@ public boolean equals(Object o) { if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; if (version != null ? !version.equals(that.version) : that.version != null) return false; - if (basicAuthUsername != null ? !basicAuthUsername.equals(that.basicAuthUsername) : that.basicAuthUsername != null) return false; - if (basicAuthPassword != null ? !basicAuthPassword.equals(that.version) : that.basicAuthPassword != null) return false; return true; } @@ -357,8 +345,6 @@ public int hashCode() { result = 31 * result + (dockerCfgPath != null ? dockerCfgPath.hashCode() : 0); result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); result = 31 * result + (readTimeout != null ? readTimeout.hashCode() : 0); - result = 31 * result + (basicAuthUsername != null ? basicAuthUsername.hashCode() : 0); - result = 31 * result + (basicAuthPassword != null ? basicAuthPassword.hashCode() : 0); result = 31 * result + (loggingFilterEnabled ? 1 : 0); return result; } @@ -377,14 +363,12 @@ public String toString() { ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + - ", basicAuthUsername=" + basicAuthUsername + - ", basicAuthPassword=" + basicAuthPassword + '}'; } public static class DockerClientConfigBuilder { private URI uri; - private String version, username, password, email, serverAddress, dockerCfgPath, basicAuthUsername, basicAuthPassword; + private String version, username, password, email, serverAddress, dockerCfgPath; private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; private boolean loggingFilterEnabled, followRedirectsFilterEnabled; private SSLConfig sslConfig; @@ -491,17 +475,6 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { return this; } - - public final DockerClientConfigBuilder withBasicAuthUsername(String username) { - this.basicAuthUsername = username; - return this; - } - - public final DockerClientConfigBuilder withBasicAuthPassword(String password) { - this.basicAuthPassword = password; - return this; - } - public DockerClientConfig build() { return new DockerClientConfig( uri, @@ -516,9 +489,7 @@ public DockerClientConfig build() { followRedirectsFilterEnabled, sslConfig, maxTotalConnections, - maxPerRouteConnections, - basicAuthUsername, - basicAuthPassword + maxPerRouteConnections ); } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index dd9e566da..4c2d9b704 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -6,11 +6,82 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.*; +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.EventCallback; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +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.SaveImageCmd; +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.api.model.AuthConfig; -import com.github.dockerjava.core.command.*; +import com.github.dockerjava.core.command.AttachContainerCmdImpl; +import com.github.dockerjava.core.command.AuthCmdImpl; +import com.github.dockerjava.core.command.BuildImageCmdImpl; +import com.github.dockerjava.core.command.CommitCmdImpl; +import com.github.dockerjava.core.command.ContainerDiffCmdImpl; +import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; +import com.github.dockerjava.core.command.CreateContainerCmdImpl; +import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.EventsCmdImpl; +import com.github.dockerjava.core.command.ExecCreateCmdImpl; +import com.github.dockerjava.core.command.ExecStartCmdImpl; +import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.core.command.InspectContainerCmdImpl; +import com.github.dockerjava.core.command.InspectImageCmdImpl; +import com.github.dockerjava.core.command.KillContainerCmdImpl; +import com.github.dockerjava.core.command.ListContainersCmdImpl; +import com.github.dockerjava.core.command.ListImagesCmdImpl; +import com.github.dockerjava.core.command.LogContainerCmdImpl; +import com.github.dockerjava.core.command.PauseContainerCmdImpl; +import com.github.dockerjava.core.command.PingCmdImpl; +import com.github.dockerjava.core.command.PullImageCmdImpl; +import com.github.dockerjava.core.command.PushImageCmdImpl; +import com.github.dockerjava.core.command.RemoveContainerCmdImpl; +import com.github.dockerjava.core.command.RemoveImageCmdImpl; +import com.github.dockerjava.core.command.RestartContainerCmdImpl; +import com.github.dockerjava.core.command.SaveImageCmdImpl; +import com.github.dockerjava.core.command.SearchImagesCmdImpl; +import com.github.dockerjava.core.command.StartContainerCmdImpl; +import com.github.dockerjava.core.command.StopContainerCmdImpl; +import com.github.dockerjava.core.command.TagImageCmdImpl; +import com.github.dockerjava.core.command.TopContainerCmdImpl; +import com.github.dockerjava.core.command.UnpauseContainerCmdImpl; +import com.github.dockerjava.core.command.VersionCmdImpl; +import com.github.dockerjava.core.command.WaitContainerCmdImpl; +import com.github.dockerjava.core.http.AbstractHttpFeature; /** * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -20,6 +91,7 @@ public class DockerClientImpl implements Closeable, DockerClient { private final DockerClientConfig dockerClientConfig; + private List httpFeatures = new ArrayList<>(); private DockerCmdExecFactory dockerCmdExecFactory; @@ -37,6 +109,15 @@ private DockerClientImpl(DockerClientConfig dockerClientConfig) { this.dockerClientConfig = dockerClientConfig; } + private DockerClientImpl(DockerClientConfig dockerClientConfig, List httpFeatures) { + checkNotNull(dockerClientConfig, + "config was not specified"); + checkNotNull(httpFeatures, + "http features were not specified"); + this.dockerClientConfig = dockerClientConfig; + this.httpFeatures = httpFeatures; + } + private static DockerClientConfig configWithServerUrl(String serverUrl) { return DockerClientConfig.createDefaultConfigBuilder() .withUri(serverUrl).build(); @@ -51,6 +132,11 @@ public static DockerClientImpl getInstance( return new DockerClientImpl(dockerClientConfig); } + public static DockerClientImpl getInstance( + DockerClientConfig dockerClientConfig, List httpFeatures) { + return new DockerClientImpl(dockerClientConfig, httpFeatures); + } + public static DockerClientImpl getInstance(String serverUrl) { return new DockerClientImpl(serverUrl); } @@ -60,7 +146,7 @@ public DockerClientImpl withDockerCmdExecFactory( checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); this.dockerCmdExecFactory = dockerCmdExecFactory; - this.dockerCmdExecFactory.init(dockerClientConfig); + this.dockerCmdExecFactory.init(dockerClientConfig, httpFeatures); return this; } diff --git a/src/main/java/com/github/dockerjava/core/http/AbstractHttpFeature.java b/src/main/java/com/github/dockerjava/core/http/AbstractHttpFeature.java new file mode 100644 index 000000000..5ff093369 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/http/AbstractHttpFeature.java @@ -0,0 +1,14 @@ +package com.github.dockerjava.core.http; + +import java.io.IOException; +import java.util.Map; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; + +public abstract class AbstractHttpFeature implements ClientRequestFilter { + + @Override + public abstract void filter(ClientRequestContext requestContext) throws IOException; + public abstract Map getClientConfigurationProperties(); +} diff --git a/src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java b/src/main/java/com/github/dockerjava/core/http/HttpBasicAuthenticationFeature.java similarity index 61% rename from src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java rename to src/main/java/com/github/dockerjava/core/http/HttpBasicAuthenticationFeature.java index 8a199a685..0754a4138 100644 --- a/src/main/java/com/github/dockerjava/core/util/BasicAuthenticationFilter.java +++ b/src/main/java/com/github/dockerjava/core/http/HttpBasicAuthenticationFeature.java @@ -1,23 +1,28 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.core.http; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.Map; +import java.util.TreeMap; import javax.ws.rs.client.ClientRequestContext; -import javax.ws.rs.client.ClientRequestFilter; import javax.ws.rs.core.MultivaluedMap; import javax.xml.bind.DatatypeConverter; -public class BasicAuthenticationFilter implements ClientRequestFilter { +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; + +public class HttpBasicAuthenticationFeature extends AbstractHttpFeature { private final String user; private final String password; - public BasicAuthenticationFilter(String user, String password) { + public HttpBasicAuthenticationFeature(String user, String password) { this.user = user; this.password = password; } + @Override public void filter(ClientRequestContext requestContext) throws IOException { MultivaluedMap headers = requestContext.getHeaders(); final String basicAuthentication = getBasicAuthentication(); @@ -33,4 +38,11 @@ private String getBasicAuthentication() { throw new IllegalStateException("Cannot encode with UTF-8", ex); } } + + @Override + public Map getClientConfigurationProperties() { + Map map = new TreeMap(); + map.put(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED); + return map; + } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index dd71db1f1..621708911 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.net.URI; +import java.util.List; +import java.util.Map; import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; @@ -20,8 +22,6 @@ import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.RequestEntityProcessing; -import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,7 +63,7 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.util.BasicAuthenticationFilter; +import com.github.dockerjava.core.http.AbstractHttpFeature; import com.github.dockerjava.core.util.FollowRedirectsFilter; import com.github.dockerjava.core.util.JsonClientFilter; import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; @@ -74,10 +74,9 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); private Client client; private WebTarget baseResource; - protected HttpAuthenticationFeature basicAuthFeature; @Override - public void init(DockerClientConfig dockerClientConfig) { + public void init(DockerClientConfig dockerClientConfig, List httpFeatures) { checkNotNull(dockerClientConfig, "config was not specified"); @@ -122,8 +121,12 @@ public void init(DockerClientConfig dockerClientConfig) { connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); - - clientConfig.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.BUFFERED); + for(AbstractHttpFeature feature : httpFeatures){ + Map properties = feature.getClientConfigurationProperties(); + for(String propertyName : properties.keySet()){ + clientConfig.property(propertyName, properties.get(propertyName)); + } + } ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig); @@ -132,10 +135,9 @@ public void init(DockerClientConfig dockerClientConfig) { } client = clientBuilder.build(); - - if(dockerClientConfig.getBasicAuthUsername() != null && dockerClientConfig.getBasicAuthPassword() != null){ - client.register(new BasicAuthenticationFilter(dockerClientConfig.getBasicAuthUsername(), dockerClientConfig.getBasicAuthPassword())); - } + for(AbstractHttpFeature feature : httpFeatures){ + client.register(feature); + } if (originalUri.getScheme().equals("unix")) { dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index c79efa8ca..64ab912d0 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,7 +16,7 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2, null, null); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", 877, false, false, new LocalDirectorySSLConfig("flim"), 20, 2); } @Test diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 10c42db74..2a961e3b8 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2, null, null); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, 0, false, false, null, 20, 2); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 1c9342dd9..cfbfc043b 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -8,6 +8,7 @@ import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; +import com.github.dockerjava.core.http.AbstractHttpFeature; import com.github.dockerjava.jaxrs.BuildImageCmdExec; /** @@ -31,8 +32,8 @@ public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { } @Override - public void init(DockerClientConfig dockerClientConfig) { - delegate.init(dockerClientConfig); + public void init(DockerClientConfig dockerClientConfig, List httpFeatures) { + delegate.init(dockerClientConfig, httpFeatures); } @Override From 41a1c9e56c765fef5e064b108c7e92617a5f7ab2 Mon Sep 17 00:00:00 2001 From: efj Date: Tue, 7 Apr 2015 14:38:51 +0200 Subject: [PATCH 4/7] Removed unused withServerAddress from the DockerClientConfig in the AbstractDockerClientTest class. --- .../com/github/dockerjava/client/AbstractDockerClientTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 1e61b9a7d..da5df5e94 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -59,8 +59,7 @@ private DockerClientConfig config() { } protected DockerClientConfig config(String password) { - DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() - .withServerAddress("https://index.docker.io/v1/"); + DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder(); if (password!=null) { builder = builder.withPassword(password); } From 90e151ae13e8077bf650c4d4fe4a4e552a939c97 Mon Sep 17 00:00:00 2001 From: efj Date: Wed, 8 Apr 2015 14:38:08 +0200 Subject: [PATCH 5/7] Reverted to original test case --- .../com/github/dockerjava/client/AbstractDockerClientTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index da5df5e94..1e61b9a7d 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -59,7 +59,8 @@ private DockerClientConfig config() { } protected DockerClientConfig config(String password) { - DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder(); + DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() + .withServerAddress("https://index.docker.io/v1/"); if (password!=null) { builder = builder.withPassword(password); } From b8b260973991c20d68379fc5a0275f9805a7ecfe Mon Sep 17 00:00:00 2001 From: "eric.fjosne" Date: Wed, 13 May 2015 14:29:43 +0200 Subject: [PATCH 6/7] After merge cleanup --- .../dockerjava/api/command/BuildImageCmd.java | 2 +- .../api/command/DockerCmdExecFactory.java | 2 +- .../dockerjava/core/DockerClientConfig.java | 3 +- .../dockerjava/core/DockerClientImpl.java | 38 +------- .../core/command/BuildImageCmdImpl.java | 4 +- .../dockerjava/jaxrs/BuildImageCmdExec.java | 24 ++--- .../jaxrs/DockerCmdExecFactoryImpl.java | 96 +++++-------------- 7 files changed, 42 insertions(+), 127 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index eb62c606a..925946db4 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -68,4 +68,4 @@ public static abstract class Response extends InputStream { public abstract Iterable getItems() throws IOException; } -} +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 51898b0c5..9894466d4 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -84,4 +84,4 @@ public interface DockerCmdExecFactory extends Closeable { @Override public void close() throws IOException; -} +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 98d869f06..e195a8d3e 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -40,7 +40,6 @@ public class DockerClientConfig implements Serializable { // connection pooling properties private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; - /** * A map from the environment name to the interval name. */ @@ -350,6 +349,7 @@ public boolean equals(Object o) { if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; if (version != null ? !version.equals(that.version) : that.version != null) return false; + return true; } @@ -411,7 +411,6 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) - .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 8f27faaf0..017733d7d 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -10,43 +10,7 @@ import java.util.List; import com.github.dockerjava.api.DockerClient; -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.EventCallback; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecStartCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectExecCmd; -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.SaveImageCmd; -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.api.command.*; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.Identifier; diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 8246a9196..ef0242857 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -26,9 +26,9 @@ public class BuildImageCmdImpl extends AbstrDockerCmd implements @@ -71,12 +70,15 @@ protected ResponseImpl execute(BuildImageCmd command) { Response.class); return new ResponseImpl(new WrappedResponseInputStream(response)); + } - private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { + private Invocation.Builder resourceWithOptionalAuthConfig( + BuildImageCmd command, Invocation.Builder request) { AuthConfigurations authConfigs = command.getBuildAuthConfigs(); if (authConfigs != null) { - request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + request = request.header("X-Registry-Config", + registryConfigs(authConfigs)); } return request; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 9f2873177..30558dae1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -7,6 +7,11 @@ import java.util.List; import java.util.Map; +import com.github.dockerjava.api.command.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; @@ -22,47 +27,9 @@ import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; -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.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecStartCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectExecCmd; -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.SaveImageCmd; -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.core.http.AbstractHttpFeature; import com.github.dockerjava.core.util.FollowRedirectsFilter; @@ -79,11 +46,7 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @Override public void init(DockerClientConfig dockerClientConfig, List httpFeatures) { - checkNotNull(dockerClientConfig, "config was not specified"); - - -// basicAuthFeature = HttpAuthenticationFeature.universal(dockerClientConfig.getBasicAuthUsername(), dockerClientConfig.getBasicAuthPassword()); -// } + checkNotNull(dockerClientConfig, "config was not specified"); ClientConfig clientConfig = new ClientConfig(); clientConfig.connectorProvider(new ApacheConnectorProvider()); @@ -111,21 +74,6 @@ public void init(DockerClientConfig dockerClientConfig, List properties = feature.getClientConfigurationProperties(); - for(String propertyName : properties.keySet()){ - clientConfig.property(propertyName, properties.get(propertyName)); - } - } - if (dockerClientConfig.getSslConfig() != null) { try { sslContext = dockerClientConfig.getSslConfig().getSSLContext(); @@ -135,6 +83,9 @@ public void init(DockerClientConfig dockerClientConfig, List properties = feature.getClientConfigurationProperties(); + for(String propertyName : properties.keySet()){ + clientConfig.property(propertyName, properties.get(propertyName)); + } + } ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig( clientConfig); - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); - } - if (sslContext != null) { clientBuilder.sslContext(sslContext); } - client = clientBuilder.build(); - for(AbstractHttpFeature feature : httpFeatures){ - client.register(feature); - } - WebTarget webResource = client.target(dockerClientConfig.getUri()); - - if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" + dockerClientConfig.getVersion()); - } + client = clientBuilder.build(); if (originalUri.getScheme().equals("unix")) { dockerClientConfig.setUri(UnixConnectionSocketFactory .sanitizeUri(originalUri)); } + for(AbstractHttpFeature feature : httpFeatures){ + client.register(feature); + } + + WebTarget webResource = client.target(dockerClientConfig.getUri()); + if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { baseResource = webResource; From bc5c8cf2ef3c7cd99ab9cea74e28ff7e67ee2d6c Mon Sep 17 00:00:00 2001 From: "eric.fjosne" Date: Wed, 13 May 2015 14:31:23 +0200 Subject: [PATCH 7/7] More cleanup --- .../java/com/github/dockerjava/core/DockerClientConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index e195a8d3e..7e0b57b0e 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -349,7 +349,7 @@ public boolean equals(Object o) { if (uri != null ? !uri.equals(that.uri) : that.uri != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; if (version != null ? !version.equals(that.version) : that.version != null) return false; - + return true; }