blob: 92cab1fb4a2be3be59b31f45b7b2e9fb055269a5 [file] [log] [blame]
/*
* 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;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.DockerCmdExecFactory;
import com.github.dockerjava.core.DefaultDockerClientConfig;
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;
import org.apache.camel.support.ObjectHelper;
/**
* Methods for communicating with Docker
*/
public final class DockerClientFactory {
private DockerClientFactory() {
// Helper class
}
/**
* Produces a {@link DockerClient} to communicate with Docker
*/
@SuppressWarnings("resource")
public static DockerClient getDockerClient(DockerComponent dockerComponent, DockerConfiguration dockerConfiguration, Message message) throws DockerException {
org.apache.camel.util.ObjectHelper.notNull(dockerConfiguration, "dockerConfiguration");
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());
Integer maxTotalConnections = DockerHelper.getProperty(DockerConstants.DOCKER_MAX_TOTAL_CONNECTIONS, dockerConfiguration, message, Integer.class,
dockerConfiguration.getMaxTotalConnections());
Integer maxPerRouteConnections = DockerHelper.getProperty(DockerConstants.DOCKER_MAX_PER_ROUTE_CONNECTIONS, dockerConfiguration, message, Integer.class,
dockerConfiguration.getMaxPerRouteConnections());
String username = DockerHelper.getProperty(DockerConstants.DOCKER_USERNAME, dockerConfiguration, message, String.class, dockerConfiguration.getUsername());
String password = DockerHelper.getProperty(DockerConstants.DOCKER_PASSWORD, dockerConfiguration, message, String.class, dockerConfiguration.getPassword());
String email = DockerHelper.getProperty(DockerConstants.DOCKER_EMAIL, dockerConfiguration, message, String.class, dockerConfiguration.getEmail());
Integer requestTimeout = DockerHelper.getProperty(DockerConstants.DOCKER_API_REQUEST_TIMEOUT, dockerConfiguration, message, Integer.class,
dockerConfiguration.getRequestTimeout());
String serverAddress = DockerHelper.getProperty(DockerConstants.DOCKER_SERVER_ADDRESS, dockerConfiguration, message, String.class, dockerConfiguration.getServerAddress());
String certPath = DockerHelper.getProperty(DockerConstants.DOCKER_CERT_PATH, dockerConfiguration, message, String.class, dockerConfiguration.getCertPath());
Boolean secure = DockerHelper.getProperty(DockerConstants.DOCKER_SECURE, dockerConfiguration, message, Boolean.class, dockerConfiguration.isSecure());
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.setEmail(email);
clientProfile.setUsername(username);
clientProfile.setPassword(password);
clientProfile.setRequestTimeout(requestTimeout);
clientProfile.setServerAddress(serverAddress);
clientProfile.setCertPath(certPath);
clientProfile.setMaxTotalConnections(maxTotalConnections);
clientProfile.setMaxPerRouteConnections(maxPerRouteConnections);
clientProfile.setSecure(secure);
clientProfile.setTlsVerify(tlsVerify);
clientProfile.setSocket(socket);
clientProfile.setCmdExecFactory(cmdExecFactory);
if (!socket) {
clientProfile.setPort(port);
}
DockerClient dockerClient = dockerComponent.getClient(clientProfile);
if (dockerClient != null) {
return dockerClient;
}
SSLConfig sslConfig;
if (clientProfile.isSecure() != null && clientProfile.isSecure()) {
org.apache.camel.util.ObjectHelper.notNull(clientProfile.getCertPath(), "certPath must be specified in secure mode");
sslConfig = new LocalDirectorySSLConfig(clientProfile.getCertPath());
} else {
// docker-java requires an implementation of SslConfig interface
// to be available for DockerCmdExecFactoryImpl
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);
if (clientProfile.getCertPath() != null) {
configBuilder.withDockerCertPath(clientProfile.getCertPath());
}
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);
return dockerClient;
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Unable to resolve DockerCmdExecFactory class: " + cmdExecFactory, e);
}
}
}