From fba96397576f2e9f9c56eb0aad7eb5713eefddc0 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Mon, 20 Jun 2016 14:55:12 +0300 Subject: [PATCH 1/8] Update deps. Fix IT. - remove custom jersey connector - update all deps - httpclient latest fails, stay on working version --- pom.xml | 77 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 25 +- .../jaxrs/UnixConnectionSocketFactory.java | 5 +- .../jaxrs/async/AbstractCallbackNotifier.java | 1 + .../jaxrs/connector/ApacheConnector.java | 663 ------------------ .../ApacheConnectorClientResponse.java | 48 -- .../connector/ApacheConnectorProvider.java | 146 ---- .../dockerjava/jaxrs/connector/README.txt | 3 - .../command/AttachContainerCmdImplTest.java | 26 +- .../exec/AttachContainerCmdExecTest.java | 8 +- 10 files changed, 101 insertions(+), 901 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java delete mode 100644 src/main/java/com/github/dockerjava/jaxrs/connector/README.txt diff --git a/pom.xml b/pom.xml index 3f9caa55a..cb43f2897 100644 --- a/pom.xml +++ b/pom.xml @@ -47,35 +47,35 @@ 1.7 1.7 - 2.11 + 2.23.1 2.6.4 - 4.3.1 - 1.5 - 1.8 - 2.3 + 4.5 + 1.12 + 1.10 + 2.5 2.6 - 1.7.5 + 1.7.21 - 1.51 - 2015-01-27T15-02-14 - 18.0 + 1.54 + 2016-04-06T22-21-19 + 19.0 - 1.1.0 - 6.1.1 - 4.1.0.CR3 + 1.1.7 + 6.9.10 + 4.1.1.Final 1.3 - 1.6 + 1.8 2.3.3 1.10.19 - 2.2 - 2.3.1 - 2.3.1 + 3.0.2 + 3.5.1 + 2.5.3 2.19.1 2.19.1 - 1.7 + 1.8 @@ -89,6 +89,11 @@ jersey-apache-connector ${jersey.version} + + org.apache.httpcomponents + httpcore + 4.4.5 + org.apache.httpcomponents httpclient @@ -99,10 +104,20 @@ jersey-client ${jersey.version} + + + + + + + com.kohlschutter.junixsocket + junixsocket-common + 2.0.4 + - de.gesellix - unix-socket-factory - ${unix-socket-factory.version} + com.kohlschutter.junixsocket + junixsocket-native-common + 2.0.4 @@ -133,7 +148,7 @@ org.slf4j jcl-over-slf4j - 1.7.12 + 1.7.21 @@ -206,7 +221,7 @@ com.google.code.findbugs annotations - 3.0.0 + 3.0.1 provided @@ -231,6 +246,12 @@ ${netty.version} linux-x86_64 + + junit + junit + 4.12 + test + @@ -321,7 +342,7 @@ org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.0.1 attach-sources @@ -334,7 +355,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 2.10.4 attach-javadocs @@ -350,7 +371,7 @@ org.sonatype.plugins nexus-staging-maven-plugin - 1.6.2 + 1.6.7 true ossrh @@ -362,7 +383,7 @@ org.apache.maven.plugins maven-release-plugin - 2.5 + ${maven-release-plugin.version} true false @@ -465,7 +486,7 @@ org.codehaus.mojo findbugs-maven-plugin - 3.0.2 + 3.0.3 Max Low @@ -484,7 +505,7 @@ org.jacoco jacoco-maven-plugin - 0.7.6.201602180812 + 0.7.7.201606060606 diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index fc74e1fde..4800f22ae 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -18,8 +18,8 @@ import javax.ws.rs.client.WebTarget; import com.github.dockerjava.api.command.UpdateContainerCmd; - import com.github.dockerjava.core.SSLConfig; + import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; @@ -27,6 +27,7 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.apache.connector.ApacheClientProperties; +import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; import org.slf4j.Logger; @@ -85,7 +86,6 @@ import com.github.dockerjava.api.command.RenameContainerCmd; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; @@ -115,6 +115,8 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private DockerClientConfig dockerClientConfig; + private PoolingHttpClientConnectionManager connManager = null; + @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); @@ -187,8 +189,21 @@ public void init(DockerClientConfig dockerClientConfig) { configureProxy(clientConfig, protocol); } - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( - originalUri, sslContext)); + connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( + originalUri, sslContext)) { + + @Override + public void close() { + super.shutdown(); + } + + @Override + public void shutdown() { + // Disable shutdown of the pool. This will be done later, when this factory is closed + // This is a workaround for finalize method on jerseys ClientRuntime which + // closes the client and shuts down the connection pool when it is garbage collected + } + }; if (maxTotalConnections != null) { connManager.setMaxTotal(maxTotalConnections); @@ -412,7 +427,6 @@ public KillContainerCmd.Exec createKillContainerCmdExec() { return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig()); } - @Override public UpdateContainerCmd.Exec createUpdateContainerCmdExec() { return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig()); @@ -527,6 +541,7 @@ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { public void close() throws IOException { checkNotNull(client, "Factory not initialized. You probably forgot to call init()!"); client.close(); + connManager.close(); } public DockerCmdExecFactoryImpl withReadTimeout(Integer readTimeout) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java index 870e2fd04..0c5400ecd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnixConnectionSocketFactory.java @@ -29,7 +29,8 @@ import java.net.URI; import org.apache.http.HttpHost; -import org.apache.http.annotation.Immutable; +import org.apache.http.annotation.Contract; +import org.apache.http.annotation.ThreadingBehavior; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.protocol.HttpContext; @@ -38,7 +39,7 @@ /** * Provides a ConnectionSocketFactory for connecting Apache HTTP clients to Unix sockets. */ -@Immutable +@Contract(threading = ThreadingBehavior.IMMUTABLE_CONDITIONAL) public class UnixConnectionSocketFactory implements ConnectionSocketFactory { private File socketFile; diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java index bd80a2d66..cd7a7f809 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -61,6 +61,7 @@ public Void call() throws Exception { } try (InputStream inputStream = new WrappedResponseInputStream(response)) { + if (resultCallback != null) { responseStreamProcessor.processResponseStream(inputStream, resultCallback); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java deleted file mode 100644 index 68b47bfa8..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ /dev/null @@ -1,663 +0,0 @@ -package com.github.dockerjava.jaxrs.connector; - -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright (c) 2010-2014 Oracle and/or its affiliates. All rights reserved. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common Development - * and Distribution License("CDDL") (collectively, the "License"). You - * may not use this file except in compliance with the License. You can - * obtain a copy of the License at - * http://glassfish.java.net/public/CDDL+GPL_1_1.html - * or packager/legal/LICENSE.txt. See the License for the specific - * language governing permissions and limitations under the License. - * - * When distributing the software, include this License Header Notice in each - * file and include the License file at packager/legal/LICENSE.txt. - * - * GPL Classpath Exception: - * Oracle designates this particular file as subject to the "Classpath" - * exception as provided by Oracle in the GPL Version 2 section of the License - * file that accompanied this code. - * - * Modifications: - * If applicable, add the following below the License Header, with the fields - * enclosed by brackets [] replaced by your own identifying information: - * "Portions Copyright [year] [name of copyright owner]" - * - * Contributor(s): - * If you wish your version of this file to be governed by only the CDDL or - * only the GPL Version 2, indicate your decision by adding "[Contributor] - * elects to include this software in this distribution under the [CDDL or GPL - * Version 2] license." If you don't indicate a single choice of license, a - * recipient has the option to distribute your version of this file under - * either the CDDL, the GPL Version 2 or to extend the choice of license to - * its licensees as provided above. However, if you add GPL Version 2 code - * and therefore, elected the GPL Version 2 license, then the option applies - * only if the new code is made subject to such option by the copyright - * holder. - */ - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicLong; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.core.Configuration; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - -import jersey.repackaged.com.google.common.util.concurrent.MoreExecutors; - -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.AuthCache; -import org.apache.http.client.CookieStore; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.CookieSpecs; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.methods.RequestBuilder; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.config.ConnectionConfig; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.conn.ManagedHttpClientConnection; -import org.apache.http.conn.routing.HttpRoute; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.LayeredConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContexts; -import org.apache.http.conn.ssl.X509HostnameVerifier; -import org.apache.http.entity.AbstractHttpEntity; -import org.apache.http.entity.BufferedHttpEntity; -import org.apache.http.entity.ContentLengthStrategy; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.DefaultManagedHttpClientConnection; -import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.impl.io.ChunkedOutputStream; -import org.apache.http.io.SessionOutputBuffer; -import org.apache.http.util.TextUtils; -import org.apache.http.util.VersionInfo; -import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheClientProperties; -import org.glassfish.jersey.apache.connector.LocalizationMessages; -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.ClientRequest; -import org.glassfish.jersey.client.ClientResponse; -import org.glassfish.jersey.client.RequestEntityProcessing; -import org.glassfish.jersey.client.spi.AsyncConnectorCallback; -import org.glassfish.jersey.client.spi.Connector; -import org.glassfish.jersey.internal.util.PropertiesHelper; -import org.glassfish.jersey.message.internal.HeaderUtils; -import org.glassfish.jersey.message.internal.OutboundMessageContext; -import org.glassfish.jersey.message.internal.ReaderWriter; -import org.glassfish.jersey.message.internal.Statuses; - -/** - * A {@link Connector} that utilizes the Apache HTTP Client to send and receive HTTP request and responses. - *

- * The following properties are only supported at construction of this class: - *

    - *
  • {@link ApacheClientProperties#CONNECTION_MANAGER}
  • - *
  • {@link ApacheClientProperties#REQUEST_CONFIG}
  • - *
  • {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
  • - *
  • {@link ApacheClientProperties#DISABLE_COOKIES}
  • - *
  • {@link ClientProperties#PROXY_URI}
  • - *
  • {@link ClientProperties#PROXY_USERNAME}
  • - *
  • {@link ClientProperties#PROXY_PASSWORD}
  • - *
  • {@link ClientProperties#REQUEST_ENTITY_PROCESSING} - default value is {@link RequestEntityProcessing#CHUNKED}
  • - *
  • {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
  • - *
  • {@link ApacheClientProperties#SSL_CONFIG}
  • - *
- *

- * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can be overridden by the - * {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only - * supported by using default connection manager. If custom connection manager needs to be used then chunked encoding size can be set by - * providing a custom {@link org.apache.http.HttpClientConnection} (via custom - * {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) and overriding {@code createOutputStream} method. - *

- *

- * Using of authorization is dependent on the chunk encoding setting. If the entity buffering is enabled, the entity is buffered and - * authorization can be performed automatically in response to a 401 by sending the request again. When entity buffering is disabled - * (chunked encoding is used) then the property - * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must be set to {@code true}. - *

- *

- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then - * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release connection-based - * resources. - *

- *

- * Client operations are thread safe, the HTTP connection may be shared between different threads. - *

- *

- * If a response entity is obtained that is an instance of {@link Closeable} then the instance MUST be closed after processing the entity to - * release connection-based resources. - *

- *

- * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE. - *

- * - * @author jorgeluisw@mac.com - * @author Paul Sandoz (paul.sandoz at oracle.com) - * @author Pavel Bucek (pavel.bucek at oracle.com) - * @author Arul Dhesiaseelan (aruld at acm.org) - * @see ApacheClientProperties#CONNECTION_MANAGER - */ -@SuppressWarnings("deprecation") -class ApacheConnector implements Connector { - - private static final Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName()); - - private static final VersionInfo VERSION_INFO; - - private static final String RELEASE; - - static { - VERSION_INFO = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); - RELEASE = (VERSION_INFO != null) ? VERSION_INFO.getRelease() : VersionInfo.UNAVAILABLE; - } - - private final CloseableHttpClient client; - - private final CookieStore cookieStore; - - private final boolean preemptiveBasicAuth; - - private final RequestConfig requestConfig; - - /** - * Create the new Apache HTTP Client connector. - * - * @param config - * client configuration. - */ - ApacheConnector(Configuration config) { - Object reqConfig = null; - - if (config != null) { - final Object connectionManager = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER); - - if (connectionManager != null && !(connectionManager instanceof HttpClientConnectionManager)) { - LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( - ApacheClientProperties.CONNECTION_MANAGER, connectionManager.getClass().getName(), - HttpClientConnectionManager.class.getName())); - } - - reqConfig = config.getProperties().get(ApacheClientProperties.REQUEST_CONFIG); - if (reqConfig != null) { - if (!(reqConfig instanceof RequestConfig)) { - LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( - ApacheClientProperties.REQUEST_CONFIG, reqConfig.getClass().getName(), - RequestConfig.class.getName())); - reqConfig = null; - } - } - } - - final SSLContext sslContext = getSslContext(config); - final HttpClientBuilder clientBuilder = HttpClientBuilder.create(); - - clientBuilder.setConnectionManager(getConnectionManager(config, sslContext)); - clientBuilder.setSslcontext(sslContext); - - final RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); - - int connectTimeout = 0; - int socketTimeout = 0; - boolean ignoreCookies = false; - if (config != null) { - connectTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.CONNECT_TIMEOUT, 0); - socketTimeout = ClientProperties.getValue(config.getProperties(), ClientProperties.READ_TIMEOUT, 0); - ignoreCookies = PropertiesHelper.isProperty(config.getProperties(), ApacheClientProperties.DISABLE_COOKIES); - - final Object credentialsProvider = config.getProperty(ApacheClientProperties.CREDENTIALS_PROVIDER); - if (credentialsProvider != null && (credentialsProvider instanceof CredentialsProvider)) { - clientBuilder.setDefaultCredentialsProvider((CredentialsProvider) credentialsProvider); - } - - Object proxyUri; - proxyUri = config.getProperty(ClientProperties.PROXY_URI); - if (proxyUri != null) { - final URI u = getProxyUri(proxyUri); - final HttpHost proxy = new HttpHost(u.getHost(), u.getPort(), u.getScheme()); - String userName; - userName = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_USERNAME, - String.class); - if (userName != null) { - String password; - password = ClientProperties.getValue(config.getProperties(), ClientProperties.PROXY_PASSWORD, - String.class); - - if (password != null) { - final CredentialsProvider credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials(new AuthScope(u.getHost(), u.getPort()), - new UsernamePasswordCredentials(userName, password)); - clientBuilder.setDefaultCredentialsProvider(credsProvider); - } - } - clientBuilder.setProxy(proxy); - } - - final Boolean preemptiveBasicAuthProperty = (Boolean) config.getProperties().get( - ApacheClientProperties.PREEMPTIVE_BASIC_AUTHENTICATION); - this.preemptiveBasicAuth = (preemptiveBasicAuthProperty != null) ? preemptiveBasicAuthProperty : false; - } else { - this.preemptiveBasicAuth = false; - } - - if (reqConfig != null) { - RequestConfig.Builder reqConfigBuilder = RequestConfig.copy((RequestConfig) reqConfig); - if (connectTimeout > 0) { - reqConfigBuilder.setConnectTimeout(connectTimeout); - } - if (socketTimeout > 0) { - reqConfigBuilder.setSocketTimeout(socketTimeout); - } - if (ignoreCookies) { - reqConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES); - } - requestConfig = reqConfigBuilder.build(); - } else { - requestConfigBuilder.setConnectTimeout(connectTimeout); - requestConfigBuilder.setSocketTimeout(socketTimeout); - if (ignoreCookies) { - requestConfigBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES); - } - requestConfig = requestConfigBuilder.build(); - } - - if (requestConfig.getCookieSpec() == null || !requestConfig.getCookieSpec().equals(CookieSpecs.IGNORE_COOKIES)) { - this.cookieStore = new BasicCookieStore(); - clientBuilder.setDefaultCookieStore(cookieStore); - } else { - this.cookieStore = null; - } - clientBuilder.setDefaultRequestConfig(requestConfig); - this.client = clientBuilder.build(); - } - - private SSLContext getSslContext(final Configuration config) { - final SslConfigurator sslConfigurator = ApacheClientProperties.getValue(config.getProperties(), - ApacheClientProperties.SSL_CONFIG, SslConfigurator.class); - - return sslConfigurator != null ? sslConfigurator.createSSLContext() : null; - } - - HttpClientConnectionManager getConnectionManager(final Configuration config, final SSLContext sslContext) { - final Object cmObject = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER); - - // Connection manager from configuration. - if (cmObject != null) { - if (cmObject instanceof HttpClientConnectionManager) { - return (HttpClientConnectionManager) cmObject; - } else { - LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( - ApacheClientProperties.CONNECTION_MANAGER, cmObject.getClass().getName(), - HttpClientConnectionManager.class.getName())); - } - } - - // Create custom connection manager. - return createConnectionManager(config, sslContext, null, false); - } - - private HttpClientConnectionManager createConnectionManager(final Configuration config, - final SSLContext sslContext, X509HostnameVerifier hostnameVerifier, final boolean useSystemProperties) { - - final String[] supportedProtocols = useSystemProperties ? split(System.getProperty("https.protocols")) : null; - final String[] supportedCipherSuites = useSystemProperties ? split(System.getProperty("https.cipherSuites")) - : null; - - if (hostnameVerifier == null) { - hostnameVerifier = SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; - } - - final LayeredConnectionSocketFactory sslSocketFactory; - if (sslContext != null) { - sslSocketFactory = new SSLConnectionSocketFactory(sslContext, supportedProtocols, supportedCipherSuites, - hostnameVerifier); - } else { - if (useSystemProperties) { - sslSocketFactory = new SSLConnectionSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault(), - supportedProtocols, supportedCipherSuites, hostnameVerifier); - } else { - sslSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), hostnameVerifier); - } - } - - final Registry registry = RegistryBuilder. create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", sslSocketFactory) - .build(); - - final Integer chunkSize = ClientProperties.getValue(config.getProperties(), - ClientProperties.CHUNKED_ENCODING_SIZE, 4096, Integer.class); - - final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, - new ConnectionFactory(chunkSize)); - - if (useSystemProperties) { - String s = System.getProperty("http.keepAlive", "true"); - if ("true".equalsIgnoreCase(s)) { - s = System.getProperty("http.maxConnections", "5"); - final int max = Integer.parseInt(s); - connectionManager.setDefaultMaxPerRoute(max); - connectionManager.setMaxTotal(2 * max); - } - } - - return connectionManager; - } - - private static String[] split(final String s) { - if (TextUtils.isBlank(s)) { - return null; - } - return s.split(" *, *"); - } - - /** - * Get the {@link HttpClient}. - * - * @return the {@link HttpClient}. - */ - @SuppressWarnings("UnusedDeclaration") - public HttpClient getHttpClient() { - return client; - } - - /** - * Get the {@link CookieStore}. - * - * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to {@code true}. - */ - public CookieStore getCookieStore() { - return cookieStore; - } - - private static URI getProxyUri(final Object proxy) { - if (proxy instanceof URI) { - return (URI) proxy; - } else if (proxy instanceof String) { - return URI.create((String) proxy); - } else { - throw new ProcessingException(LocalizationMessages.WRONG_PROXY_URI_TYPE(ClientProperties.PROXY_URI)); - } - } - - @Override - public ClientResponse apply(final ClientRequest clientRequest) throws ProcessingException { - final HttpUriRequest request = getUriHttpRequest(clientRequest); - final Map clientHeadersSnapshot = writeOutBoundHeaders(clientRequest.getHeaders(), request); - - try { - final CloseableHttpResponse response; - final HttpClientContext context = HttpClientContext.create(); - if (preemptiveBasicAuth) { - final AuthCache authCache = new BasicAuthCache(); - final BasicScheme basicScheme = new BasicScheme(); - authCache.put(getHost(request), basicScheme); - context.setAuthCache(authCache); - } - - // context.setRequestConfig(RequestConfig.custom().setConnectionRequestTimeout(10).build()); - - response = client.execute(getHost(request), request, context); - HeaderUtils - .checkHeaderChanges(clientHeadersSnapshot, clientRequest.getHeaders(), this.getClass().getName()); - - final Response.StatusType status = response.getStatusLine().getReasonPhrase() == null ? Statuses - .from(response.getStatusLine().getStatusCode()) : Statuses.from(response.getStatusLine() - .getStatusCode(), response.getStatusLine().getReasonPhrase()); - - final ClientResponse responseContext = new ApacheConnectorClientResponse(status, clientRequest, response); - final List redirectLocations = context.getRedirectLocations(); - if (redirectLocations != null && !redirectLocations.isEmpty()) { - responseContext.setResolvedRequestUri(redirectLocations.get(redirectLocations.size() - 1)); - } - - final Header[] respHeaders = response.getAllHeaders(); - final MultivaluedMap headers = responseContext.getHeaders(); - for (final Header header : respHeaders) { - final String headerName = header.getName(); - List list = headers.get(headerName); - if (list == null) { - list = new ArrayList(); - } - list.add(header.getValue()); - headers.put(headerName, list); - } - - final HttpEntity entity = response.getEntity(); - - if (entity != null) { - if (headers.get(HttpHeaders.CONTENT_LENGTH) == null) { - headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(entity.getContentLength())); - } - - final Header contentEncoding = entity.getContentEncoding(); - if (headers.get(HttpHeaders.CONTENT_ENCODING) == null && contentEncoding != null) { - headers.add(HttpHeaders.CONTENT_ENCODING, contentEncoding.getValue()); - } - } - - try { - responseContext.setEntityStream(new HttpClientResponseInputStream(response)); - } catch (final IOException e) { - LOGGER.log(Level.SEVERE, null, e); - } - - return responseContext; - } catch (final Exception e) { - throw new ProcessingException(e); - } - } - - @Override - public Future apply(final ClientRequest request, final AsyncConnectorCallback callback) { - return MoreExecutors.sameThreadExecutor().submit(new Runnable() { - @Override - public void run() { - try { - callback.response(apply(request)); - } catch (final ProcessingException ex) { - callback.failure(ex); - } catch (final Throwable t) { - callback.failure(t); - } - } - }); - } - - @Override - public String getName() { - return "Apache HttpClient " + RELEASE; - } - - @Override - public void close() { - try { - client.close(); - } catch (final IOException e) { - throw new ProcessingException(LocalizationMessages.FAILED_TO_STOP_CLIENT(), e); - } - } - - private HttpHost getHost(final HttpUriRequest request) { - return new HttpHost(request.getURI().getHost(), request.getURI().getPort(), request.getURI().getScheme()); - } - - private HttpUriRequest getUriHttpRequest(final ClientRequest clientRequest) { - final Boolean redirectsEnabled = clientRequest.resolveProperty(ClientProperties.FOLLOW_REDIRECTS, - requestConfig.isRedirectsEnabled()); - final RequestConfig config = RequestConfig.copy(requestConfig).setRedirectsEnabled(redirectsEnabled).build(); - - final Boolean bufferingEnabled = clientRequest.resolveProperty(ClientProperties.REQUEST_ENTITY_PROCESSING, - RequestEntityProcessing.class) == RequestEntityProcessing.BUFFERED; - final HttpEntity entity = getHttpEntity(clientRequest, bufferingEnabled); - - return RequestBuilder.create(clientRequest.getMethod()).setUri(clientRequest.getUri()).setConfig(config) - .setEntity(entity).build(); - } - - private HttpEntity getHttpEntity(final ClientRequest clientRequest, final boolean bufferingEnabled) { - final Object entity = clientRequest.getEntity(); - - if (entity == null) { - return null; - } - - final AbstractHttpEntity httpEntity = new AbstractHttpEntity() { - @Override - public boolean isRepeatable() { - return false; - } - - @Override - public long getContentLength() { - return -1; - } - - @Override - public InputStream getContent() throws IOException, IllegalStateException { - if (bufferingEnabled) { - final ByteArrayOutputStream buffer = new ByteArrayOutputStream(512); - writeTo(buffer); - return new ByteArrayInputStream(buffer.toByteArray()); - } else { - return null; - } - } - - @Override - public void writeTo(final OutputStream outputStream) throws IOException { - clientRequest.setStreamProvider(new OutboundMessageContext.StreamProvider() { - @Override - public OutputStream getOutputStream(final int contentLength) throws IOException { - return outputStream; - } - }); - clientRequest.writeEntity(); - } - - @Override - public boolean isStreaming() { - return false; - } - }; - - if (bufferingEnabled) { - try { - return new BufferedHttpEntity(httpEntity); - } catch (final IOException e) { - throw new ProcessingException(LocalizationMessages.ERROR_BUFFERING_ENTITY(), e); - } - } else { - return httpEntity; - } - } - - private static Map writeOutBoundHeaders(final MultivaluedMap headers, - final HttpUriRequest request) { - Map stringHeaders = HeaderUtils.asStringHeadersSingleValue(headers); - - for (Map.Entry e : stringHeaders.entrySet()) { - request.addHeader(e.getKey(), e.getValue()); - } - return stringHeaders; - } - - private static final class HttpClientResponseInputStream extends FilterInputStream { - - HttpClientResponseInputStream(final CloseableHttpResponse response) throws IOException { - super(getInputStream(response)); - } - - @Override - public void close() throws IOException { - super.close(); - } - } - - private static InputStream getInputStream(final CloseableHttpResponse response) throws IOException { - - if (response.getEntity() == null) { - return new ByteArrayInputStream(new byte[0]); - } else { - final InputStream i = response.getEntity().getContent(); - if (i.markSupported()) { - return i; - } - return new BufferedInputStream(i, ReaderWriter.BUFFER_SIZE); - } - } - - private static class ConnectionFactory extends ManagedHttpClientConnectionFactory { - - private static final AtomicLong COUNTER = new AtomicLong(); - - private final int chunkSize; - - private ConnectionFactory(final int chunkSize) { - this.chunkSize = chunkSize; - } - - @Override - public ManagedHttpClientConnection create(final HttpRoute route, final ConnectionConfig config) { - final String id = "http-outgoing-" + Long.toString(COUNTER.getAndIncrement()); - - return new HttpClientConnection(id, config.getBufferSize(), chunkSize); - } - } - - private static class HttpClientConnection extends DefaultManagedHttpClientConnection { - - private final int chunkSize; - - private HttpClientConnection(final String id, final int buffersize, final int chunkSize) { - super(id, buffersize); - - this.chunkSize = chunkSize; - } - - @Override - protected OutputStream createOutputStream(final long len, final SessionOutputBuffer outbuffer) { - if (len == ContentLengthStrategy.CHUNKED) { - return new ChunkedOutputStream(chunkSize, outbuffer); - } - return super.createOutputStream(len, outbuffer); - } - } -} diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java deleted file mode 100644 index fead3575c..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.github.dockerjava.jaxrs.connector; - -import java.io.IOException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.StatusType; - -import org.apache.http.client.methods.CloseableHttpResponse; -import org.glassfish.jersey.client.ClientRequest; -import org.glassfish.jersey.client.ClientResponse; - -/** - * Fix for https://github.com/docker-java/docker-java/issues/196 - * - * https://java.net/jira/browse/JERSEY-2852 - * - * @author Marcus Linke - * - */ -public class ApacheConnectorClientResponse extends ClientResponse { - - private CloseableHttpResponse closeableHttpResponse; - - public ApacheConnectorClientResponse(ClientRequest requestContext, Response response) { - super(requestContext, response); - } - - public ApacheConnectorClientResponse(StatusType status, ClientRequest requestContext, - CloseableHttpResponse closeableHttpResponse) { - super(status, requestContext); - this.closeableHttpResponse = closeableHttpResponse; - } - - public ApacheConnectorClientResponse(StatusType status, ClientRequest requestContext) { - super(status, requestContext); - } - - @Override - public void close() { - try { - closeableHttpResponse.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - super.close(); - } - -} diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java deleted file mode 100644 index eafb55c29..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.github.dockerjava.jaxrs.connector; - -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright (c) 2013-2014 Oracle and/or its affiliates. All rights reserved. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common Development - * and Distribution License("CDDL") (collectively, the "License"). You - * may not use this file except in compliance with the License. You can - * obtain a copy of the License at - * http://glassfish.java.net/public/CDDL+GPL_1_1.html - * or packager/legal/LICENSE.txt. See the License for the specific - * language governing permissions and limitations under the License. - * - * When distributing the software, include this License Header Notice in each - * file and include the License file at packager/legal/LICENSE.txt. - * - * GPL Classpath Exception: - * Oracle designates this particular file as subject to the "Classpath" - * exception as provided by Oracle in the GPL Version 2 section of the License - * file that accompanied this code. - * - * Modifications: - * If applicable, add the following below the License Header, with the fields - * enclosed by brackets [] replaced by your own identifying information: - * "Portions Copyright [year] [name of copyright owner]" - * - * Contributor(s): - * If you wish your version of this file to be governed by only the CDDL or - * only the GPL Version 2, indicate your decision by adding "[Contributor] - * elects to include this software in this distribution under the [CDDL or GPL - * Version 2] license." If you don't indicate a single choice of license, a - * recipient has the option to distribute your version of this file under - * either the CDDL, the GPL Version 2 or to extend the choice of license to - * its licensees as provided above. However, if you add GPL Version 2 code - * and therefore, elected the GPL Version 2 license, then the option applies - * only if the new code is made subject to such option by the copyright - * holder. - */ -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Configurable; -import javax.ws.rs.core.Configuration; - -import org.apache.http.client.HttpClient; -import org.glassfish.jersey.apache.connector.ApacheClientProperties; -import org.glassfish.jersey.apache.connector.LocalizationMessages; -import org.glassfish.jersey.client.Initializable; -import org.glassfish.jersey.client.spi.Connector; -import org.glassfish.jersey.client.spi.ConnectorProvider; - -/** - * Connector provider for Jersey {@link Connector connectors} that utilize Apache HTTP Client to send and receive HTTP request and - * responses. - *

- * The following connector configuration properties are supported: - *

    - *
  • {@link ApacheClientProperties#CONNECTION_MANAGER}
  • - *
  • {@link ApacheClientProperties#REQUEST_CONFIG}
  • - *
  • {@link ApacheClientProperties#CREDENTIALS_PROVIDER}
  • - *
  • {@link ApacheClientProperties#DISABLE_COOKIES}
  • - *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}
  • - *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}
  • - *
  • {@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}
  • - *
  • {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} - default value is - * {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}
  • - *
  • {@link ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION}
  • - *
  • {@link ApacheClientProperties#SSL_CONFIG}
  • - *
- *

- *

- * Connector instances created via this connector provider use {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked - * encoding} as a default setting. This can be overridden by the - * {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the - * {@link org.glassfish.jersey.client.ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported when using the default - * {@code org.apache.http.conn.HttpClientConnectionManager} instance. If custom connection manager is used, then chunked encoding size can - * be set by providing a custom {@code org.apache.http.HttpClientConnection} (via custom - * {@code org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) and overriding it's {@code createOutputStream} method. - *

- *

- * Use of authorization by the AHC-based connectors is dependent on the chunk encoding setting. If the entity buffering is enabled, the - * entity is buffered and authorization can be performed automatically in response to a 401 by sending the request again. When entity - * buffering is disabled (chunked encoding is used) then the property - * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must be set to {@code true}. - *

- *

- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then - * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release connection-based - * resources. - *

- *

- * If a response entity is obtained that is an instance of {@link java.io.Closeable} then the instance MUST be closed after processing the - * entity to release connection-based resources. - *

- *

- * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE. - *

- * - * @author Pavel Bucek (pavel.bucek at oracle.com) - * @author Arul Dhesiaseelan (aruld at acm.org) - * @author jorgeluisw at mac.com - * @author Marek Potociar (marek.potociar at oracle.com) - * @author Paul Sandoz (paul.sandoz at oracle.com) - * @since 2.5 - */ -public class ApacheConnectorProvider implements ConnectorProvider { - - @Override - public Connector getConnector(Client client, Configuration runtimeConfig) { - return new ApacheConnector(runtimeConfig); - } - - /** - * Retrieve the underlying Apache {@link HttpClient} instance from {@link org.glassfish.jersey.client.JerseyClient} or - * {@link org.glassfish.jersey.client.JerseyWebTarget} configured to use {@code ApacheConnectorProvider}. - * - * @param component - * {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use {@code ApacheConnectorProvider}. - * @return underlying Apache {@code HttpClient} instance. - * - * @throws java.lang.IllegalArgumentException - * in case the {@code component} is neither {@code JerseyClient} nor {@code JerseyWebTarget} instance or in case the - * component is not configured to use a {@code ApacheConnectorProvider}. - * @since 2.8 - */ - public static HttpClient getHttpClient(Configurable component) { - if (!(component instanceof Initializable)) { - throw new IllegalArgumentException(LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component - .getClass().getName())); - } - - final Initializable initializable = (Initializable) component; - Connector connector = initializable.getConfiguration().getConnector(); - if (connector == null) { - initializable.preInitialize(); - connector = initializable.getConfiguration().getConnector(); - } - - if (connector instanceof ApacheConnector) { - return ((ApacheConnector) connector).getHttpClient(); - } - - throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED()); - } -} diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt deleted file mode 100644 index c3c1415f1..000000000 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This package exists as a workaround to https://java.net/jira/browse/JERSEY-2852. -It introduces ApacheConnectorClientResponse which extends ClientResponse and closes -the underlying CloseableHttpResponse when close() is called. \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java index 21507e44e..f8bf33fef 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -1,5 +1,6 @@ package com.github.dockerjava.core.command; +import static org.apache.commons.lang.StringUtils.isEmpty; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.isEmptyString; @@ -11,7 +12,9 @@ import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; +import org.apache.commons.codec.binary.StringUtils; import org.testng.ITestResult; +import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; @@ -74,7 +77,7 @@ public void onNext(Frame frame) { assertThat(callback.toString(), containsString(snippet)); } - @Test + @Test(groups = "badTests", enabled = false) public void attachContainerWithTTY() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() @@ -97,14 +100,24 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) - .exec(callback).awaitCompletion(15, TimeUnit.SECONDS); + dockerClient.attachContainerCmd(container.getId()) + .withStdErr(true) + .withStdOut(true) + .withFollowStream(true) + .exec(callback) + .awaitCompletion(); +// .awaitCompletion(15, TimeUnit.SECONDS); callback.close(); + dockerClient.close(); + System.out.println("log: " + callback.toString()); // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); - + RuntimeException firstError = callback.getFirstError(); + if (isEmpty(callback.toString())) { + throw new SkipException("com.github.dockerjava.api.exception.InternalServerErrorException: http: Hijack is incompatible with use of CloseNotifier"); + } assertThat(callback.toString(), containsString("stdout\r\nstderr")); } @@ -145,6 +158,11 @@ public void onNext(Frame item) { super.onNext(item); } + @Override + public RuntimeException getFirstError() { + return super.getFirstError(); + } + @Override public String toString() { return log.toString(); diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java index 7f8e66609..ba3d5a9ca 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java @@ -134,8 +134,12 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) - .exec(callback).awaitCompletion(10, TimeUnit.SECONDS); + dockerClient.attachContainerCmd(container.getId()) + .withStdErr(true) + .withStdOut(true) + .withFollowStream(true) + .exec(callback) + .awaitCompletion(10, TimeUnit.SECONDS); callback.close(); // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); From 52ff6d82952a4b1ff2426a24e239547e32f38314 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 00:31:26 +0300 Subject: [PATCH 2/8] revert dep and test --- pom.xml | 18 ++++-------------- .../command/AttachContainerCmdImplTest.java | 11 ++--------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index cb43f2897..a13ac1fc0 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.7.21 1.54 - 2016-04-06T22-21-19 + 2015-01-27T15-02-14 19.0 @@ -104,20 +104,10 @@ jersey-client ${jersey.version} - - - - - - com.kohlschutter.junixsocket - junixsocket-common - 2.0.4 - - - com.kohlschutter.junixsocket - junixsocket-native-common - 2.0.4 + de.gesellix + unix-socket-factory + ${unix-socket-factory.version} diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java index f8bf33fef..ef69984f3 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -77,7 +77,7 @@ public void onNext(Frame frame) { assertThat(callback.toString(), containsString(snippet)); } - @Test(groups = "badTests", enabled = false) + @Test public void attachContainerWithTTY() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() @@ -105,19 +105,12 @@ public void onNext(Frame frame) { .withStdOut(true) .withFollowStream(true) .exec(callback) - .awaitCompletion(); -// .awaitCompletion(15, TimeUnit.SECONDS); + .awaitCompletion(15, TimeUnit.SECONDS); callback.close(); - dockerClient.close(); - System.out.println("log: " + callback.toString()); // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); - RuntimeException firstError = callback.getFirstError(); - if (isEmpty(callback.toString())) { - throw new SkipException("com.github.dockerjava.api.exception.InternalServerErrorException: http: Hijack is incompatible with use of CloseNotifier"); - } assertThat(callback.toString(), containsString("stdout\r\nstderr")); } From 1a148f2e51ac908cfa9a23e0f847a07b2c155797 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 01:14:28 +0300 Subject: [PATCH 3/8] Skip auth tests --- pom.xml | 3 ++- .../github/dockerjava/core/command/PushImageCmdImplTest.java | 2 +- .../com/github/dockerjava/netty/exec/PushImageCmdExecTest.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index a13ac1fc0..2437baa22 100644 --- a/pom.xml +++ b/pom.xml @@ -388,6 +388,7 @@ ${maven-surefire-plugin.version} integration + integration-auth @@ -403,7 +404,7 @@ integration - + integration-auth **/*Test.java diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index e89a071b8..a48750bd1 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -19,7 +19,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; -@Test(groups = "integration") +@Test(groups = "integration-auth") public class PushImageCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class); diff --git a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java index 777cc8eed..5e77a6765 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java @@ -21,7 +21,7 @@ import com.github.dockerjava.core.command.PushImageResultCallback; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; -@Test(groups = "integration") +@Test(groups = "integration-auth") public class PushImageCmdExecTest extends AbstractNettyDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdExecTest.class); From 3a782a9834449f78368c54356d5dd3412ae89917 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 01:26:19 +0300 Subject: [PATCH 4/8] Enable cache --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b6e6f953b..4491de529 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,7 +33,7 @@ env: cache: directories: - $HOME/.travis_cache -# - $HOME/.m2 install would pollute it + - $HOME/.m2 # install will pollute it before_install: - pip install --user codecov From 31d5627be8dad851941f126a5af0aa5385e002b4 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 01:45:09 +0300 Subject: [PATCH 5/8] Disable experimental/testing --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4491de529..9c96c5abd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,10 +25,10 @@ env: - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty" - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty" - - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375" - - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock" - - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375" - - repo="experimental" DOCKER_HOST="unix:///var/run/docker.sock" +# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375" +# - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock" +# - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375" +# - repo="experimental" DOCKER_HOST="unix:///var/run/docker.sock" cache: directories: From 007f66899f9a84bde102f4740631816973e2fb9a Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 02:12:48 +0300 Subject: [PATCH 6/8] run codecov only on one run --- .travis.yml | 3 +-- .travis/travis-after-success.sh | 4 +++- .travis/travis-before-install.sh | 3 +-- .../github/dockerjava/core/command/PushImageCmdImplTest.java | 2 +- .../github/dockerjava/netty/exec/PushImageCmdExecTest.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9c96c5abd..bb559fd93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,8 +21,7 @@ env: - COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com" matrix: - - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true FAST_BUILD=true COVERITY=true - - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" + - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty" - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty" # - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375" diff --git a/.travis/travis-after-success.sh b/.travis/travis-after-success.sh index 6d198daf5..695358122 100755 --- a/.travis/travis-after-success.sh +++ b/.travis/travis-after-success.sh @@ -1,7 +1,9 @@ #!/usr/bin/env bash +if [[ $CODECOV == "true" ]]; then + codecov +fi -codecov if [[ $TRAVIS_BRANCH == "master" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]] && [[ $DEPLOY == "true" ]]; then cat <> ~/settings.xml diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh index 13034fc74..970425f63 100755 --- a/.travis/travis-before-install.sh +++ b/.travis/travis-before-install.sh @@ -28,8 +28,7 @@ sudo -E apt-cache policy docker-engine # sudo apt-get -f install # sudo dpkg -i "$(ls *${DOCKER_VERSION}*)" #popd -#rm -f "src/test/resources/logback.xml" -mv "src/test/resources/travis-logback.xml" "src/test/resources/logback.xml" + echo 'DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=tcp://127.0.0.1:2375"' | sudo tee -a /etc/default/docker sudo -E restart docker diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java index a48750bd1..0fb32c311 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -19,7 +19,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; -@Test(groups = "integration-auth") +@Test(groups = {"integration-auth", "integration"}) public class PushImageCmdImplTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class); diff --git a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java index 5e77a6765..73e99af6d 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java @@ -21,7 +21,7 @@ import com.github.dockerjava.core.command.PushImageResultCallback; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; -@Test(groups = "integration-auth") +@Test(groups = {"integration", "integration-auth"}) public class PushImageCmdExecTest extends AbstractNettyDockerClientTest { public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdExecTest.class); From 3854e2efd477ae4cba4e0d1c85302ccc2d085c41 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 02:15:44 +0300 Subject: [PATCH 7/8] revert typo --- .travis/travis-before-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh index 970425f63..13034fc74 100755 --- a/.travis/travis-before-install.sh +++ b/.travis/travis-before-install.sh @@ -28,7 +28,8 @@ sudo -E apt-cache policy docker-engine # sudo apt-get -f install # sudo dpkg -i "$(ls *${DOCKER_VERSION}*)" #popd - +#rm -f "src/test/resources/logback.xml" +mv "src/test/resources/travis-logback.xml" "src/test/resources/logback.xml" echo 'DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=tcp://127.0.0.1:2375"' | sudo tee -a /etc/default/docker sudo -E restart docker From 24d3a15001da56083a5c83f47a1f5076e1468195 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 8 Jul 2016 02:31:08 +0300 Subject: [PATCH 8/8] tune timeout --- .../dockerjava/netty/exec/AttachContainerCmdExecTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java index ba3d5a9ca..675c11177 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java @@ -105,7 +105,9 @@ public void onNext(Frame frame) { InputStream stdin = new ByteArrayInputStream((snippet + "\n").getBytes()); dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) - .withStdIn(stdin).exec(callback).awaitCompletion(2, TimeUnit.SECONDS); + .withStdIn(stdin) + .exec(callback) + .awaitCompletion(5, TimeUnit.SECONDS); callback.close(); assertThat(callback.toString(), containsString(snippet));