
org.testifyproject.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl Maven / Gradle / Ivy
package org.testifyproject.testifyproject.github.dockerjava.jaxrs;
import static org.testifyproject.testifyproject.google.org.testifyproject.testifyprojectmon.base.Preconditions.checkNotNull;
import java.org.testifyproject.testifyproject.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import javax.net.ssl.SSLContext;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.client.WebTarget;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.UpdateContainerCmd;
import org.testifyproject.apache.http.config.RegistryBuilder;
import org.testifyproject.apache.http.conn.socket.ConnectionSocketFactory;
import org.testifyproject.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.testifyproject.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.testifyproject.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.testifyproject.glassfish.org.testifyproject.testifyproject.CommonProperties;
import org.testifyproject.glassfish.org.testifyproject.testifyproject.apache.connector.ApacheClientProperties;
import org.testifyproject.glassfish.org.testifyproject.testifyproject.client.ClientConfig;
import org.testifyproject.glassfish.org.testifyproject.testifyproject.client.ClientProperties;
import org.testifyproject.slf4j.Logger;
import org.testifyproject.slf4j.LoggerFactory;
import org.testifyproject.testifyproject.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.AttachContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.AuthCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.BuildImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CommitCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ConnectToNetworkCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ContainerDiffCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CopyArchiveFromContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CopyArchiveToContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CopyFileFromContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CreateContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CreateImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CreateNetworkCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.CreateVolumeCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.DisconnectFromNetworkCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.DockerCmdExecFactory;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.EventsCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ExecCreateCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ExecStartCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InfoCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InspectContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InspectExecCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InspectImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InspectNetworkCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.InspectVolumeCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.KillContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ListContainersCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ListImagesCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ListNetworksCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.ListVolumesCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.LogContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.PauseContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.PingCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.PullImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.PushImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RemoveContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RemoveImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RemoveNetworkCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RemoveVolumeCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RestartContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.SaveImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.SearchImagesCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.StartContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.StatsCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.StopContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.TagImageCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.TopContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.UnpauseContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.VersionCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.WaitContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.org.testifyproject.testifyprojectmand.RenameContainerCmd;
import org.testifyproject.testifyproject.github.dockerjava.api.exception.DockerClientException;
import org.testifyproject.testifyproject.github.dockerjava.core.DockerClientConfig;
import org.testifyproject.testifyproject.github.dockerjava.core.LocalDirectorySSLConfig;
import org.testifyproject.testifyproject.github.dockerjava.jaxrs.connector.ApacheConnectorProvider;
import org.testifyproject.testifyproject.github.dockerjava.jaxrs.filter.JsonClientFilter;
import org.testifyproject.testifyproject.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter;
import org.testifyproject.testifyproject.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter;
//import org.testifyproject.glassfish.org.testifyproject.testifyproject.apache.connector.ApacheConnectorProvider;
// see https://github.org.testifyproject.testifyproject/docker-java/docker-java/issues/196
public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName());
private Client client;
private WebTarget baseResource;
private Integer readTimeout = null;
private Integer connectTimeout = null;
private Integer maxTotalConnections = null;
private Integer maxPerRouteConnections = null;
private ClientRequestFilter[] clientRequestFilters = null;
private ClientResponseFilter[] clientResponseFilters = null;
private DockerClientConfig dockerClientConfig;
SSLContext sslContext = null;
@Override
public void init(DockerClientConfig dockerClientConfig) {
checkNotNull(dockerClientConfig, "config was not specified");
this.dockerClientConfig = dockerClientConfig;
ClientConfig clientConfig = new ClientConfig();
clientConfig.connectorProvider(new ApacheConnectorProvider());
clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
clientConfig.register(ResponseStatusExceptionFilter.class);
clientConfig.register(JsonClientFilter.class);
clientConfig.register(JacksonJsonProvider.class);
// logging may disabled via log level
clientConfig.register(new SelectiveLoggingFilter(LOGGER, true));
if (readTimeout != null) {
clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout);
}
if (connectTimeout != null) {
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, connectTimeout);
}
if (clientResponseFilters != null) {
for (ClientResponseFilter clientResponseFilter : clientResponseFilters) {
if (clientResponseFilter != null) {
clientConfig.register(clientResponseFilter);
}
}
}
if (clientRequestFilters != null) {
for (ClientRequestFilter clientRequestFilter : clientRequestFilters) {
if (clientRequestFilter != null) {
clientConfig.register(clientRequestFilter);
}
}
}
URI originalUri = dockerClientConfig.getDockerHost();
String protocol = null;
if (dockerClientConfig.getDockerTlsVerify()) {
protocol = "https";
try {
if (sslContext == null) {
sslContext = new LocalDirectorySSLConfig(dockerClientConfig.getDockerCertPath()).getSSLContext();
}
} catch (Exception ex) {
throw new DockerClientException("Error in SSL Configuration", ex);
}
} else {
protocol = "http";
}
if (!originalUri.getScheme().equals("unix")) {
try {
originalUri = new URI(originalUri.toString().replaceFirst("tcp", protocol));
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
configureProxy(clientConfig, protocol);
}
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(
originalUri, sslContext));
if (maxTotalConnections != null) {
connManager.setMaxTotal(maxTotalConnections);
}
if (maxPerRouteConnections != null) {
connManager.setDefaultMaxPerRoute(maxPerRouteConnections);
}
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager);
// Configure connection pool timeout
// clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom()
// .setConnectionRequestTimeout(1000).build());
ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig);
if (sslContext != null) {
clientBuilder.sslContext(sslContext);
}
client = clientBuilder.build();
baseResource = client.target(sanitizeUrl(originalUri).toString()).path(dockerClientConfig.getApiVersion().asWebPathPart());
}
private URI sanitizeUrl(URI originalUri) {
if (originalUri.getScheme().equals("unix")) {
return UnixConnectionSocketFactory.sanitizeUri(originalUri);
}
return originalUri;
}
private void configureProxy(ClientConfig clientConfig, String protocol) {
List proxies = ProxySelector.getDefault().select(dockerClientConfig.getDockerHost());
for (Proxy proxy : proxies) {
InetSocketAddress address = (InetSocketAddress) proxy.address();
if (address != null) {
String hostname = address.getHostName();
int port = address.getPort();
clientConfig.property(ClientProperties.PROXY_URI, "http://" + hostname + ":" + port);
String httpProxyUser = System.getProperty(protocol + ".proxyUser");
if (httpProxyUser != null) {
clientConfig.property(ClientProperties.PROXY_USERNAME, httpProxyUser);
String httpProxyPassword = System.getProperty(protocol + ".proxyPassword");
if (httpProxyPassword != null) {
clientConfig.property(ClientProperties.PROXY_PASSWORD, httpProxyPassword);
}
}
}
}
}
private org.testifyproject.apache.http.config.Registry getSchemeRegistry(final URI originalUri,
SSLContext sslContext) {
RegistryBuilder registryBuilder = RegistryBuilder.create();
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
if (sslContext != null) {
registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
}
registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri));
return registryBuilder.build();
}
protected WebTarget getBaseResource() {
checkNotNull(baseResource, "Factory not initialized, baseResource not set. You probably forgot to call init()!");
return baseResource;
}
protected DockerClientConfig getDockerClientConfig() {
checkNotNull(dockerClientConfig,
"Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
return dockerClientConfig;
}
@Override
public AuthCmd.Exec createAuthCmdExec() {
return new AuthCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InfoCmd.Exec createInfoCmdExec() {
return new InfoCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public PingCmd.Exec createPingCmdExec() {
return new PingCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public VersionCmd.Exec createVersionCmdExec() {
return new VersionCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public PullImageCmd.Exec createPullImageCmdExec() {
return new PullImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public PushImageCmd.Exec createPushImageCmdExec() {
return new PushImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public SaveImageCmd.Exec createSaveImageCmdExec() {
return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RemoveImageCmd.Exec createRemoveImageCmdExec() {
return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ListImagesCmd.Exec createListImagesCmdExec() {
return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InspectImageCmd.Exec createInspectImageCmdExec() {
return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ListContainersCmd.Exec createListContainersCmdExec() {
return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CreateContainerCmd.Exec createCreateContainerCmdExec() {
return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public StartContainerCmd.Exec createStartContainerCmdExec() {
return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InspectContainerCmd.Exec createInspectContainerCmdExec() {
return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ExecCreateCmd.Exec createExecCmdExec() {
return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public WaitContainerCmd.Exec createWaitContainerCmdExec() {
return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public AttachContainerCmd.Exec createAttachContainerCmdExec() {
return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ExecStartCmd.Exec createExecStartCmdExec() {
return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InspectExecCmd.Exec createInspectExecCmdExec() {
return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public LogContainerCmd.Exec createLogContainerCmdExec() {
return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public StopContainerCmd.Exec createStopContainerCmdExec() {
return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public KillContainerCmd.Exec createKillContainerCmdExec() {
return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RenameContainerCmd.Exec createRenameContainerCmdExec() {
return new RenameContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RestartContainerCmd.Exec createRestartContainerCmdExec() {
return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CommitCmd.Exec createCommitCmdExec() {
return new CommitCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public BuildImageCmd.Exec createBuildImageCmdExec() {
return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public TopContainerCmd.Exec createTopContainerCmdExec() {
return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public TagImageCmd.Exec createTagImageCmdExec() {
return new TagImageCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public PauseContainerCmd.Exec createPauseContainerCmdExec() {
return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public EventsCmd.Exec createEventsCmdExec() {
return new EventsCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public StatsCmd.Exec createStatsCmdExec() {
return new StatsCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ListVolumesCmd.Exec createListVolumesCmdExec() {
return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ListNetworksCmd.Exec createListNetworksCmdExec() {
return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
@Override
public void close() throws IOException {
checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");
client.close();
}
@Override
public DockerCmdExecFactoryImpl withSSLContext(SSLContext sslContext) {
this.sslContext = sslContext;
return this;
}
public DockerCmdExecFactoryImpl withReadTimeout(Integer readTimeout) {
this.readTimeout = readTimeout;
return this;
}
public DockerCmdExecFactoryImpl withConnectTimeout(Integer connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}
public DockerCmdExecFactoryImpl withMaxTotalConnections(Integer maxTotalConnections) {
this.maxTotalConnections = maxTotalConnections;
return this;
}
public DockerCmdExecFactoryImpl withMaxPerRouteConnections(Integer maxPerRouteConnections) {
this.maxPerRouteConnections = maxPerRouteConnections;
return this;
}
public DockerCmdExecFactoryImpl withClientResponseFilters(ClientResponseFilter... clientResponseFilter) {
this.clientResponseFilters = clientResponseFilter;
return this;
}
public DockerCmdExecFactoryImpl withClientRequestFilters(ClientRequestFilter... clientRequestFilters) {
this.clientRequestFilters = clientRequestFilters;
return this;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy