You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/03/07 09:02:19 UTC

camel git commit: CAMEL-10950: Enable configuration of a custom DockerCmdExecFactory

Repository: camel
Updated Branches:
  refs/heads/master 886e3a9d6 -> efdf259da


CAMEL-10950: Enable configuration of a custom DockerCmdExecFactory


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/efdf259d
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/efdf259d
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/efdf259d

Branch: refs/heads/master
Commit: efdf259da9c2927251c7cf99d93e75a5d00c44ff
Parents: 886e3a9
Author: James Netherton <ja...@gmail.com>
Authored: Mon Mar 6 12:14:43 2017 +0000
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Mar 7 09:59:33 2017 +0100

----------------------------------------------------------------------
 components/camel-docker/README.md               |   1 +
 .../src/main/docs/docker-component.adoc         |   3 +-
 .../component/docker/DockerClientFactory.java   |  60 +++-
 .../component/docker/DockerClientProfile.java   |  18 +
 .../component/docker/DockerConfiguration.java   |  14 +-
 .../camel/component/docker/DockerConstants.java |   8 +-
 .../camel/component/docker/DockerHelper.java    |  10 +-
 .../docker/DockerClientProfileTest.java         |   4 +-
 .../docker/headers/BaseDockerHeaderTest.java    |   7 +-
 .../it/DockerCustomCmdExecFactoryTestIT.java    |  64 ++++
 .../docker/it/DockerITTestSupport.java          |  53 +++
 .../it/DockerNettyCmdExecFactoryTestIT.java     |  50 +++
 .../docker/it/DockerProducerTestIT.java         |  12 +-
 .../docker/it/DockerStatsConsumerTestIT.java    |  13 +-
 .../docker/it/FakeDockerCmdExecFactory.java     | 357 +++++++++++++++++++
 .../component/docker/util/DockerTestUtils.java  |   2 +
 .../src/test/resources/test-options.properties  |  25 ++
 .../DockerComponentConfiguration.java           |  13 +
 18 files changed, 671 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/README.md
----------------------------------------------------------------------
diff --git a/components/camel-docker/README.md b/components/camel-docker/README.md
index 7909b76..30f66fe 100644
--- a/components/camel-docker/README.md
+++ b/components/camel-docker/README.md
@@ -38,6 +38,7 @@ The following are the the primary options for communicating with the Docker serv
 |serverAddress | CamelDockerServerAddress | Address of the Docker registry server (If not specified, *host* will be used) | https://index.docker.io/v1/ |
 |maxTotalConnections | CamelDockerMaxTotalConnections | Maximum number of total connections | 100 |
 |maxPerRouteConnections | CamelDockerMaxPerRouteConnections | Maximum number of connections per route | 100 |
+| cmdExecFactory | CamelDockerCmdExecFactory | The fully qualified class name of the DockerCmdExecFactory implementation to use |  com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory |
 
 
 ## Consumer Operations

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/docs/docker-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/docs/docker-component.adoc b/components/camel-docker/src/main/docs/docker-component.adoc
index 3c7502f..5e0107a 100644
--- a/components/camel-docker/src/main/docs/docker-component.adoc
+++ b/components/camel-docker/src/main/docs/docker-component.adoc
@@ -50,7 +50,7 @@ The Docker endpoint is configured using URI syntax:
 | operation |  | DockerOperation | *Required* Which operation to use
 |=======================================================================
 
-#### Query Parameters (19 parameters):
+#### Query Parameters (20 parameters):
 
 [width="100%",cols="2,1,1m,1m,5",options="header"]
 |=======================================================================
@@ -62,6 +62,7 @@ The Docker endpoint is configured using URI syntax:
 | bridgeErrorHandler | consumer | false | boolean | Allows for bridging the consumer to the Camel routing Error Handler which mean any exceptions occurred while the consumer is trying to pickup incoming messages or the likes will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions that will be logged at WARN or ERROR level and ignored.
 | exceptionHandler | consumer (advanced) |  | ExceptionHandler | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this options is not in use. By default the consumer will deal with exceptions that will be logged at WARN or ERROR level and ignored.
 | exchangePattern | consumer (advanced) |  | ExchangePattern | Sets the exchange pattern when the consumer creates an exchange.
+| cmdExecFactory | advanced | com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory | String | The fully qualified class name of the DockerCmdExecFactory implementation to use
 | followRedirectFilter | advanced | false | boolean | Whether to follow redirect filter
 | loggingFilter | advanced | false | boolean | Whether to use logging filter
 | maxPerRouteConnections | advanced | 100 | Integer | Maximum route connections

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientFactory.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientFactory.java
index 00f79b3..dc801c0 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientFactory.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientFactory.java
@@ -23,6 +23,9 @@ import com.github.dockerjava.core.DockerClientBuilder;
 import com.github.dockerjava.core.LocalDirectorySSLConfig;
 import com.github.dockerjava.core.SSLConfig;
 import com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory;
+import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
+
+import org.apache.camel.CamelContext;
 import org.apache.camel.Message;
 import org.apache.camel.component.docker.exception.DockerException;
 import org.apache.camel.component.docker.ssl.NoImplSslConfig;
@@ -45,8 +48,6 @@ public final class DockerClientFactory {
 
         ObjectHelper.notNull(dockerConfiguration, "dockerConfiguration");
 
-        DockerClientProfile clientProfile = new DockerClientProfile();
-
         Integer port = DockerHelper.getProperty(DockerConstants.DOCKER_PORT, dockerConfiguration, message, Integer.class, dockerConfiguration.getPort());
         String host = DockerHelper.getProperty(DockerConstants.DOCKER_HOST, dockerConfiguration, message, String.class, dockerConfiguration.getHost());
 
@@ -66,6 +67,10 @@ public final class DockerClientFactory {
         Boolean tlsVerify = DockerHelper.getProperty(DockerConstants.DOCKER_TLSVERIFY, dockerConfiguration, message, Boolean.class, dockerConfiguration.isTlsVerify());
         Boolean socket = DockerHelper.getProperty(DockerConstants.DOCKER_SOCKET_ENABLED, dockerConfiguration, message, Boolean.class, dockerConfiguration.isSocket());
 
+        String cmdExecFactory = DockerHelper.getProperty(DockerConstants.DOCKER_CMD_EXEC_FACTORY,
+            dockerConfiguration, message, String.class, dockerConfiguration.getCmdExecFactory());
+
+        DockerClientProfile clientProfile = new DockerClientProfile();
         clientProfile.setHost(host);
         clientProfile.setPort(port);
         clientProfile.setEmail(email);
@@ -79,6 +84,7 @@ public final class DockerClientFactory {
         clientProfile.setSecure(secure);
         clientProfile.setTlsVerify(tlsVerify);
         clientProfile.setSocket(socket);
+        clientProfile.setCmdExecFactory(cmdExecFactory);
 
         DockerClient dockerClient = dockerComponent.getClient(clientProfile);
 
@@ -96,25 +102,49 @@ public final class DockerClientFactory {
             sslConfig = new NoImplSslConfig();
         }
 
-        DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost(clientProfile.toUrl())
-            .withDockerTlsVerify(clientProfile.isTlsVerify()).withRegistryUsername(clientProfile.getUsername()).withRegistryPassword(clientProfile.getPassword())
-            .withRegistryEmail(clientProfile.getEmail()).withRegistryUrl(clientProfile.getServerAddress()).withCustomSslConfig(sslConfig);
+        DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder()
+            .withDockerHost(clientProfile.toUrl())
+            .withDockerTlsVerify(clientProfile.isTlsVerify())
+            .withRegistryUsername(clientProfile.getUsername())
+            .withRegistryPassword(clientProfile.getPassword())
+            .withRegistryEmail(clientProfile.getEmail())
+            .withRegistryUrl(clientProfile.getServerAddress())
+            .withCustomSslConfig(sslConfig);
 
         if (clientProfile.getCertPath() != null) {
             configBuilder.withDockerCertPath(clientProfile.getCertPath());
         }
 
-        // @Deprecated: isFollowRedirectFilterEnabled, isLoggingFilterEnabled
+        CamelContext camelContext = dockerComponent.getCamelContext();
+        try {
+            DockerCmdExecFactory factory = null;
+
+            if (cmdExecFactory.equals(JerseyDockerCmdExecFactory.class.getName())) {
+                factory = new JerseyDockerCmdExecFactory();
+                ((JerseyDockerCmdExecFactory) factory)
+                    .withReadTimeout(clientProfile.getRequestTimeout())
+                    .withConnectTimeout(clientProfile.getRequestTimeout())
+                    .withMaxTotalConnections(clientProfile.getMaxTotalConnections())
+                    .withMaxPerRouteConnections(clientProfile.getMaxPerRouteConnections());
+            } else if (cmdExecFactory.equals(NettyDockerCmdExecFactory.class.getName())) {
+                factory = new NettyDockerCmdExecFactory();
+                ((NettyDockerCmdExecFactory) factory)
+                    .withConnectTimeout(clientProfile.getRequestTimeout());
+            } else {
+                Class<DockerCmdExecFactory> clazz = camelContext.getClassResolver().resolveMandatoryClass(cmdExecFactory, DockerCmdExecFactory.class);
+                factory = ObjectHelper.newInstance(clazz);
+            }
+
+            dockerClient = DockerClientBuilder.getInstance(configBuilder)
+                .withDockerCmdExecFactory(factory)
+                .build();
+
+            dockerComponent.setClient(clientProfile, dockerClient);
 
-        DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory().withReadTimeout(clientProfile.getRequestTimeout())
-            .withConnectTimeout(clientProfile.getRequestTimeout()).withMaxTotalConnections(clientProfile.getMaxTotalConnections())
-            .withMaxPerRouteConnections(clientProfile.getMaxPerRouteConnections());
-
-        dockerClient = DockerClientBuilder.getInstance(configBuilder).withDockerCmdExecFactory(dockerCmdExecFactory).build();
-
-        dockerComponent.setClient(clientProfile, dockerClient);
-
-        return dockerClient;
+            return dockerClient;
+        } catch (ClassNotFoundException e) {
+            throw new IllegalStateException("Unable to resolve DockerCmdExecFactory class: " + cmdExecFactory, e);
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientProfile.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientProfile.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientProfile.java
index c99dbed..3da5320 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientProfile.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerClientProfile.java
@@ -50,6 +50,8 @@ public class DockerClientProfile {
 
     private Boolean socket;
 
+    private String cmdExecFactory;
+
     public String getHost() {
         return host;
     }
@@ -161,6 +163,14 @@ public class DockerClientProfile {
         this.socket = socket;
     }
 
+    public String getCmdExecFactory() {
+        return cmdExecFactory;
+    }
+
+    public void setCmdExecFactory(String cmdExecFactory) {
+        this.cmdExecFactory = cmdExecFactory;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -178,6 +188,7 @@ public class DockerClientProfile {
         result = prime * result + ((secure == null) ? 0 : secure.hashCode());
         result = prime * result + ((serverAddress == null) ? 0 : serverAddress.hashCode());
         result = prime * result + ((username == null) ? 0 : username.hashCode());
+        result = prime * result + ((cmdExecFactory == null) ? 0 : cmdExecFactory.hashCode());
         return result;
     }
 
@@ -284,6 +295,13 @@ public class DockerClientProfile {
         } else if (!username.equals(other.username)) {
             return false;
         }
+        if (cmdExecFactory == null) {
+            if (other.cmdExecFactory != null) {
+                return false;
+            }
+        } else if (!cmdExecFactory.equals(other.cmdExecFactory)) {
+            return false;
+        }
         return true;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConfiguration.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConfiguration.java
index 297f28f..1adf0aa 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConfiguration.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConfiguration.java
@@ -63,6 +63,8 @@ public class DockerConfiguration implements Cloneable {
     private boolean tlsVerify;
     @UriParam(label = "advanced", defaultValue = "true")
     private boolean socket;
+    @UriParam(label = "advanced", defaultValue = "com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory")
+    private String cmdExecFactory = "com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory";
     
     private Map<String, Object> parameters = new HashMap<String, Object>();
 
@@ -253,6 +255,17 @@ public class DockerConfiguration implements Cloneable {
         this.socket = socket;
     }
 
+    public String getCmdExecFactory() {
+        return cmdExecFactory;
+    }
+
+    /**
+     * The fully qualified class name of the DockerCmdExecFactory implementation to use
+     */
+    public void setCmdExecFactory(String cmdExecFactory) {
+        this.cmdExecFactory = cmdExecFactory;
+    }
+
     public DockerConfiguration copy() {
         try {
             return (DockerConfiguration) clone();
@@ -260,5 +273,4 @@ public class DockerConfiguration implements Cloneable {
             throw new RuntimeCamelException(e);
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
index 99bdc72..acf5668 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
@@ -29,6 +29,11 @@ public final class DockerConstants {
     public static final Map<String, Class<?>> DOCKER_DEFAULT_PARAMETERS = new HashMap<String, Class<?>>();
 
     /**
+     * Endpoint configuration defaults
+     */
+    public static final String DEFAULT_CMD_EXEC_FACTORY = "com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory";
+
+    /**
      * Connectivity *
      */
     public static final String DOCKER_CLIENT_PROFILE = "CamelDockerClientProfile";
@@ -47,6 +52,7 @@ public final class DockerConstants {
     public static final String DOCKER_LOGGING_FILTER = "CamelDockerLoggingFilter";
     public static final String DOCKER_TLSVERIFY = "CamelDockerTlsVerify";
     public static final String DOCKER_SOCKET_ENABLED = "CamelDockerSocketEnabled";
+    public static final String DOCKER_CMD_EXEC_FACTORY = "CamelDockerCmdExecFactory";
 
     /**
      * List Images *
@@ -222,7 +228,6 @@ public final class DockerConstants {
     public static final String DOCKER_DETACH = "CamelDockerDetach";
     public static final String DOCKER_EXEC_ID = "CamelDockerExecId";
 
-
     static {
         DOCKER_DEFAULT_PARAMETERS.put(DOCKER_CERT_PATH, String.class);
         DOCKER_DEFAULT_PARAMETERS.put(DOCKER_CLIENT_PROFILE, String.class);
@@ -233,6 +238,7 @@ public final class DockerConstants {
         DOCKER_DEFAULT_PARAMETERS.put(DOCKER_SECURE, Boolean.class);
         DOCKER_DEFAULT_PARAMETERS.put(DOCKER_SERVER_ADDRESS, String.class);
         DOCKER_DEFAULT_PARAMETERS.put(DOCKER_USERNAME, String.class);
+        DOCKER_DEFAULT_PARAMETERS.put(DOCKER_CMD_EXEC_FACTORY, String.class);
     }
 
     private DockerConstants() {

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerHelper.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerHelper.java
index a0adc62..7b886ab 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerHelper.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerHelper.java
@@ -33,7 +33,7 @@ public final class DockerHelper {
     private static final String STRING_DELIMITER = ";";
 
     private DockerHelper() {
-        // Helpser class
+        // Helper class
     }
 
     /**
@@ -73,11 +73,10 @@ public final class DockerHelper {
                 throw new DockerClientException("Failed to validate parameter type for property " + key);
             }
         }
-
     }
 
     /**
-     * Transforms a Docker Component header value to its' analogous URI
+     * Transforms a Docker Component header value to its analogous URI
      * parameter
      *
      * @param name
@@ -99,7 +98,7 @@ public final class DockerHelper {
     }
 
     /**
-     * Transforms a Docker Component URI parameter to its' analogous header
+     * Transforms a Docker Component URI parameter to its analogous header
      * value
      *
      * @param name
@@ -174,7 +173,6 @@ public final class DockerHelper {
         }
 
         return null;
-
     }
 
     /**
@@ -212,7 +210,6 @@ public final class DockerHelper {
         }
 
         return null;
-
     }
 
     /**
@@ -236,7 +233,6 @@ public final class DockerHelper {
         }
 
         return null;
-
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/DockerClientProfileTest.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/DockerClientProfileTest.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/DockerClientProfileTest.java
index 23a9a87..0f49994 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/DockerClientProfileTest.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/DockerClientProfileTest.java
@@ -35,7 +35,7 @@ public class DockerClientProfileTest {
         Integer requestTimeout = 40;
         boolean secure = true;
         String certPath = "/docker/cert/path";
-
+        String cmdExecFactory = DockerConstants.DEFAULT_CMD_EXEC_FACTORY;
 
         DockerClientProfile clientProfile1 = new DockerClientProfile();
         clientProfile1.setHost(host);
@@ -46,6 +46,7 @@ public class DockerClientProfileTest {
         clientProfile1.setRequestTimeout(requestTimeout);
         clientProfile1.setSecure(secure);
         clientProfile1.setCertPath(certPath);
+        clientProfile1.setCmdExecFactory(cmdExecFactory);
 
         DockerClientProfile clientProfile2 = new DockerClientProfile();
         clientProfile2.setHost(host);
@@ -56,6 +57,7 @@ public class DockerClientProfileTest {
         clientProfile2.setRequestTimeout(requestTimeout);
         clientProfile2.setSecure(secure);
         clientProfile2.setCertPath(certPath);
+        clientProfile2.setCmdExecFactory(cmdExecFactory);
 
         assertEquals(clientProfile1, clientProfile2);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/BaseDockerHeaderTest.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/BaseDockerHeaderTest.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/BaseDockerHeaderTest.java
index 12fd713..11655a9 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/BaseDockerHeaderTest.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/BaseDockerHeaderTest.java
@@ -116,6 +116,10 @@ public abstract class BaseDockerHeaderTest<T> extends CamelTestSupport {
         return false;
     }
 
+    public String getCmdExecFactory() {
+        return DockerConstants.DEFAULT_CMD_EXEC_FACTORY;
+    }
+
     public T getMockObject() {
         return mockObject;
     }
@@ -131,7 +135,7 @@ public abstract class BaseDockerHeaderTest<T> extends CamelTestSupport {
         parameters.put(DockerConstants.DOCKER_SECURE, isSecure());
         parameters.put(DockerConstants.DOCKER_TLSVERIFY, isTlsVerify());
         parameters.put(DockerConstants.DOCKER_SOCKET_ENABLED, isSocket());
-
+        parameters.put(DockerConstants.DOCKER_CMD_EXEC_FACTORY, getCmdExecFactory());
         return parameters;
     }
 
@@ -146,6 +150,7 @@ public abstract class BaseDockerHeaderTest<T> extends CamelTestSupport {
         clientProfile.setSecure(isSecure());
         clientProfile.setTlsVerify(isTlsVerify());
         clientProfile.setSocket(isSocket());
+        clientProfile.setCmdExecFactory(getCmdExecFactory());
 
         return clientProfile;
 

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerCustomCmdExecFactoryTestIT.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerCustomCmdExecFactoryTestIT.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerCustomCmdExecFactoryTestIT.java
new file mode 100644
index 0000000..1077527
--- /dev/null
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerCustomCmdExecFactoryTestIT.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.docker.it;
+
+import java.util.concurrent.TimeUnit;
+
+import com.github.dockerjava.api.model.Version;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class DockerCustomCmdExecFactoryTestIT extends DockerITTestSupport  {
+
+    @Test
+    public void testNettyCmdExecFactoryConfig() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.expectedBodiesReceived(FakeDockerCmdExecFactory.FAKE_VERSION);
+
+        template.sendBody("direct:in", "");
+
+        assertMockEndpointsSatisfied(60, TimeUnit.SECONDS);
+        mock.getExchanges();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        FakeDockerCmdExecFactory.class.getDeclaredConstructors();
+
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:in")
+                    .to("docker://version?cmdExecFactory=" + FakeDockerCmdExecFactory.class.getName())
+                    .log("${body}")
+                    .process(new Processor() {
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            Version version = exchange.getIn().getBody(Version.class);
+                            exchange.getOut().setBody(version.getVersion());
+                        }
+                    })
+                    .to("mock:result");
+            }
+        };
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerITTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerITTestSupport.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerITTestSupport.java
new file mode 100644
index 0000000..62c5b30
--- /dev/null
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerITTestSupport.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.docker.it;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.docker.DockerComponent;
+import org.apache.camel.component.docker.DockerConfiguration;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.IntrospectionSupport;
+
+public class DockerITTestSupport extends CamelTestSupport {
+
+    private static final String TEST_OPTIONS_PROPERTIES = "/test-options.properties";
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        // Read Docker component configuration properties
+        Properties properties = new Properties();
+        properties.load(getClass().getResourceAsStream(TEST_OPTIONS_PROPERTIES));
+
+        Map<String, Object> options = new HashMap<>();
+        properties.entrySet().forEach((e) -> options.put(e.getKey().toString(), e.getValue()));
+
+        DockerConfiguration configuration = new DockerConfiguration();
+        IntrospectionSupport.setProperties(configuration, options);
+
+        DockerComponent component = new DockerComponent();
+        component.setConfiguration(configuration);
+        context.addComponent("docker", component);
+
+        return context;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerNettyCmdExecFactoryTestIT.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerNettyCmdExecFactoryTestIT.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerNettyCmdExecFactoryTestIT.java
new file mode 100644
index 0000000..5dfb4f6
--- /dev/null
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerNettyCmdExecFactoryTestIT.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.docker.it;
+
+import java.util.concurrent.TimeUnit;
+
+import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Test;
+
+public class DockerNettyCmdExecFactoryTestIT extends DockerITTestSupport {
+
+    @Test
+    public void testNettyCmdExecFactoryConfig() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(1);
+
+        template.sendBody("direct:in", "");
+
+        assertMockEndpointsSatisfied(60, TimeUnit.SECONDS);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:in")
+                    .to("docker://version?cmdExecFactory=" + NettyDockerCmdExecFactory.class.getName())
+                    .log("${body}")
+                    .to("mock:result");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerProducerTestIT.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerProducerTestIT.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerProducerTestIT.java
index e6794be..07826b7 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerProducerTestIT.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerProducerTestIT.java
@@ -20,16 +20,12 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
 /**
  * Integration test listing images on Docker Platform
  */
-public class DockerProducerTestIT extends CamelTestSupport {
-
-    private String host = "192.168.59.103";
-    private String port = "2376";
+public class DockerProducerTestIT extends DockerITTestSupport {
 
     @Test
     public void testDocker() throws Exception {
@@ -46,9 +42,9 @@ public class DockerProducerTestIT extends CamelTestSupport {
         return new RouteBuilder() {
             public void configure() {
                 from("direct:in")
-                        .to("docker://imagelist?host=" + host + "&port=" + port + "&certPath=/Users/cameluser/.docker/boot2docker-vm&secure=true")
-                        .log("${body}")
-                        .to("mock:result");
+                    .to("docker://imagelist")
+                    .log("${body}")
+                    .to("mock:result");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerStatsConsumerTestIT.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerStatsConsumerTestIT.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerStatsConsumerTestIT.java
index 20be0f7..2742710 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerStatsConsumerTestIT.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/DockerStatsConsumerTestIT.java
@@ -20,17 +20,14 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
 /**
  * Integration test consuming statistics on Docker Platform
  */
-public class DockerStatsConsumerTestIT extends CamelTestSupport {
+public class DockerStatsConsumerTestIT extends DockerITTestSupport {
 
-    private String host = "192.168.59.103";
-    private String port = "2376";
-    private String containerId = "470b9b823e6c";
+    private static final String CONTAINER_ID = "470b9b823e6c";
 
     @Test
     public void testDocker() throws Exception {
@@ -45,9 +42,9 @@ public class DockerStatsConsumerTestIT extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() {
-                from("docker://stats?host=" + host + "&port=" + port + "&certPath=/Users/cameluser/.docker/boot2docker-vm&secure=true&containerId=" + containerId)
-                        .log("${body}")
-                        .to("mock:result");
+                fromF("docker://stats?containerId=%s", CONTAINER_ID)
+                    .log("${body}")
+                    .to("mock:result");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/FakeDockerCmdExecFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/FakeDockerCmdExecFactory.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/FakeDockerCmdExecFactory.java
new file mode 100644
index 0000000..130ee06
--- /dev/null
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/it/FakeDockerCmdExecFactory.java
@@ -0,0 +1,357 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.docker.it;
+
+import java.io.IOException;
+
+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.ConnectToNetworkCmd;
+import com.github.dockerjava.api.command.ContainerDiffCmd;
+import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
+import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
+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.CreateNetworkCmd;
+import com.github.dockerjava.api.command.CreateVolumeCmd;
+import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
+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.InspectNetworkCmd;
+import com.github.dockerjava.api.command.InspectVolumeCmd;
+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.ListNetworksCmd;
+import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
+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.RemoveNetworkCmd;
+import com.github.dockerjava.api.command.RemoveVolumeCmd;
+import com.github.dockerjava.api.command.RenameContainerCmd;
+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.StatsCmd;
+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.UpdateContainerCmd;
+import com.github.dockerjava.api.command.VersionCmd;
+import com.github.dockerjava.api.command.WaitContainerCmd;
+import com.github.dockerjava.api.model.Version;
+import com.github.dockerjava.core.DockerClientConfig;
+
+public class FakeDockerCmdExecFactory implements DockerCmdExecFactory {
+
+    public static final String FAKE_VERSION = "Fake Camel Version 1.0";
+
+    public FakeDockerCmdExecFactory() {
+    }
+
+    @Override
+    public void init(DockerClientConfig dockerClientConfig) {
+        // Noop
+    }
+
+    @Override
+    public VersionCmd.Exec createVersionCmdExec() {
+        return new VersionCmd.Exec() {
+            @Override
+            public Version exec(VersionCmd versionCmd) {
+                return new Version() {
+                    @Override
+                    public String getVersion() {
+                        return FAKE_VERSION;
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public AuthCmd.Exec createAuthCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InfoCmd.Exec createInfoCmdExec() {
+        return null;
+    }
+
+    @Override
+    public PingCmd.Exec createPingCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ExecCreateCmd.Exec createExecCmdExec() {
+        return null;
+    }
+
+    @Override
+    public PullImageCmd.Exec createPullImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public PushImageCmd.Exec createPushImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public SaveImageCmd.Exec createSaveImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CreateImageCmd.Exec createCreateImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public LoadImageCmd.Exec createLoadImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public SearchImagesCmd.Exec createSearchImagesCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RemoveImageCmd.Exec createRemoveImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ListImagesCmd.Exec createListImagesCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InspectImageCmd.Exec createInspectImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ListContainersCmd.Exec createListContainersCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CreateContainerCmd.Exec createCreateContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public StartContainerCmd.Exec createStartContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InspectContainerCmd.Exec createInspectContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public WaitContainerCmd.Exec createWaitContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public AttachContainerCmd.Exec createAttachContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ExecStartCmd.Exec createExecStartCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InspectExecCmd.Exec createInspectExecCmdExec() {
+        return null;
+    }
+
+    @Override
+    public LogContainerCmd.Exec createLogContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public StopContainerCmd.Exec createStopContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
+        return null;
+    }
+
+    @Override
+    public KillContainerCmd.Exec createKillContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RenameContainerCmd.Exec createRenameContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RestartContainerCmd.Exec createRestartContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CommitCmd.Exec createCommitCmdExec() {
+        return null;
+    }
+
+    @Override
+    public BuildImageCmd.Exec createBuildImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public TopContainerCmd.Exec createTopContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public TagImageCmd.Exec createTagImageCmdExec() {
+        return null;
+    }
+
+    @Override
+    public PauseContainerCmd.Exec createPauseContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
+        return null;
+    }
+
+    @Override
+    public EventsCmd.Exec createEventsCmdExec() {
+        return null;
+    }
+
+    @Override
+    public StatsCmd.Exec createStatsCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ListVolumesCmd.Exec createListVolumesCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ListNetworksCmd.Exec createListNetworksCmdExec() {
+        return null;
+    }
+
+    @Override
+    public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
+        return null;
+    }
+
+    @Override
+    public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
+        return null;
+    }
+
+    @Override
+    public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
+        return null;
+    }
+
+    @Override
+    public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
+        return null;
+    }
+
+    @Override
+    public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
+        return null;
+    }
+
+    @Override
+    public void close() throws IOException {
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/java/org/apache/camel/component/docker/util/DockerTestUtils.java
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/util/DockerTestUtils.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/util/DockerTestUtils.java
index 76fe942..94d5bbf 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/util/DockerTestUtils.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/util/DockerTestUtils.java
@@ -40,6 +40,7 @@ public final class DockerTestUtils {
         parameters.put(DockerConstants.DOCKER_SECURE, dockerConfiguration.isSecure());
         parameters.put(DockerConstants.DOCKER_TLSVERIFY, dockerConfiguration.isTlsVerify());
         parameters.put(DockerConstants.DOCKER_SOCKET_ENABLED, dockerConfiguration.isSocket());
+        parameters.put(DockerConstants.DOCKER_CMD_EXEC_FACTORY, dockerConfiguration.getCmdExecFactory());
 
         return parameters;
     }
@@ -55,6 +56,7 @@ public final class DockerTestUtils {
         clientProfile.setSecure(dockerConfiguration.isSecure());
         clientProfile.setTlsVerify(dockerConfiguration.isTlsVerify());
         clientProfile.setSocket(dockerConfiguration.isSocket());
+        clientProfile.setCmdExecFactory(dockerConfiguration.getCmdExecFactory());
         
         return clientProfile;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/components/camel-docker/src/test/resources/test-options.properties
----------------------------------------------------------------------
diff --git a/components/camel-docker/src/test/resources/test-options.properties b/components/camel-docker/src/test/resources/test-options.properties
new file mode 100644
index 0000000..96313ab
--- /dev/null
+++ b/components/camel-docker/src/test/resources/test-options.properties
@@ -0,0 +1,25 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Docker host
+host=localhost
+# Docker port
+port=2375
+# Uncomment these if you need boot2docker / security
+# Certificate path
+#certPath=/Users/cameluser/.docker/boot2docker-vm
+# Enable HTTPS
+#secure=true

http://git-wip-us.apache.org/repos/asf/camel/blob/efdf259d/platforms/spring-boot/components-starter/camel-docker-starter/src/main/java/org/apache/camel/component/docker/springboot/DockerComponentConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-docker-starter/src/main/java/org/apache/camel/component/docker/springboot/DockerComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-docker-starter/src/main/java/org/apache/camel/component/docker/springboot/DockerComponentConfiguration.java
index a89e760..bc8c6eb 100644
--- a/platforms/spring-boot/components-starter/camel-docker-starter/src/main/java/org/apache/camel/component/docker/springboot/DockerComponentConfiguration.java
+++ b/platforms/spring-boot/components-starter/camel-docker-starter/src/main/java/org/apache/camel/component/docker/springboot/DockerComponentConfiguration.java
@@ -127,6 +127,11 @@ public class DockerComponentConfiguration {
          * Socket connection mode
          */
         private Boolean socket;
+        /**
+         * The fully qualified class name of the DockerCmdExecFactory
+         * implementation to use
+         */
+        private String cmdExecFactory = "com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory";
 
         public String getHost() {
             return host;
@@ -263,5 +268,13 @@ public class DockerComponentConfiguration {
         public void setSocket(Boolean socket) {
             this.socket = socket;
         }
+
+        public String getCmdExecFactory() {
+            return cmdExecFactory;
+        }
+
+        public void setCmdExecFactory(String cmdExecFactory) {
+            this.cmdExecFactory = cmdExecFactory;
+        }
     }
 }
\ No newline at end of file