All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.testifyproject.github.dockerjava.netty.DockerCmdExecFactoryImpl Maven / Gradle / Ivy

package org.testifyproject.testifyproject.github.dockerjava.netty;

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.UpdateContainerCmd;
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.core.DockerClientConfig;
import org.testifyproject.testifyproject.github.dockerjava.core.DockerClientImpl;
import org.testifyproject.testifyproject.github.dockerjava.core.LocalDirectorySSLConfig;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.AttachContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.AuthCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.BuildImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CommitCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ConnectToNetworkCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ContainerDiffCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CopyArchiveFromContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CopyArchiveToContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CreateContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CreateImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CreateNetworkCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.CreateVolumeCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.DisconnectFromNetworkCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.EventsCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ExecCreateCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ExecStartCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InfoCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InspectContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InspectExecCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InspectImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InspectNetworkCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.InspectVolumeCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.KillContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ListContainersCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ListImagesCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ListNetworksCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.ListVolumesCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.LogContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.PauseContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.PingCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.PullImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.PushImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RemoveContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RemoveImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RemoveNetworkCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RemoveVolumeCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RestartContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.SaveImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.SearchImagesCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.StartContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.StatsCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.StopContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.TagImageCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.TopContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.UnpauseContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.UpdateContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.VersionCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.WaitContainerCmdExec;
import org.testifyproject.testifyproject.github.dockerjava.netty.exec.RenameContainerCmdExec;

import org.testifyproject.testifyproject.netty.bootstrap.Bootstrap;
import org.testifyproject.testifyproject.netty.channel.ChannelInitializer;
import org.testifyproject.testifyproject.netty.channel.EventLoopGroup;
import org.testifyproject.testifyproject.netty.channel.epoll.EpollDomainSocketChannel;
import org.testifyproject.testifyproject.netty.channel.epoll.EpollEventLoopGroup;
import org.testifyproject.testifyproject.netty.channel.nio.NioEventLoopGroup;
import org.testifyproject.testifyproject.netty.channel.socket.DuplexChannel;
import org.testifyproject.testifyproject.netty.channel.socket.SocketChannel;
import org.testifyproject.testifyproject.netty.channel.socket.nio.NioSocketChannel;
import org.testifyproject.testifyproject.netty.channel.unix.DomainSocketAddress;
import org.testifyproject.testifyproject.netty.channel.unix.UnixChannel;
import org.testifyproject.testifyproject.netty.handler.codec.http.HttpClientCodec;
import org.testifyproject.testifyproject.netty.handler.logging.LoggingHandler;
import org.testifyproject.testifyproject.netty.handler.ssl.SslHandler;
import org.testifyproject.testifyproject.netty.util.concurrent.DefaultThreadFactory;

import org.testifyproject.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;

import java.org.testifyproject.testifyproject.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.security.Security;

import static org.testifyproject.testifyproject.google.org.testifyproject.testifyprojectmon.base.Preconditions.checkNotNull;

/**
 * Experimental implementation of {@link DockerCmdExecFactory} that supports http connection hijacking that is needed to pass STDIN to the
 * container.
 *
 * To use it just pass an instance via {@link DockerClientImpl#withDockerCmdExecFactory(DockerCmdExecFactory)}
 *
 * @see https://docs.docker.org.testifyproject.testifyproject/engine/reference/api/docker_remote_api_v1.21/#attach-to-a-container
 * @see https://docs.docker.org.testifyproject.testifyproject/engine/reference/api/docker_remote_api_v1.21/#exec-start
 *
 *
 * @author Marcus Linke
 */
public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory {

    private static String threadPrefix = "dockerjava-netty";

    /*
     * useful links:
     *
     * http://stackoverflow.org.testifyproject.testifyproject/questions/33296749/netty-connect-to-unix-domain-socket-failed
     * http://netty.org.testifyproject.testifyproject/wiki/native-transports.html
     * https://github.org.testifyproject.testifyproject/netty/netty/blob/master/example/src/main/java/org.testifyproject.testifyproject/netty/example/http/snoop/HttpSnoopClient.java
     * https://github.org.testifyproject.testifyproject/slandelle/netty-request-chunking/blob/master/src/test/java/slandelle/ChunkingTest.java
     */

    private DockerClientConfig dockerClientConfig;

    private Bootstrap bootstrap;

    private EventLoopGroup eventLoopGroup;

    private NettyInitializer nettyInitializer;

    private SSLContext sslContext = null;

    private ChannelProvider channelProvider = new ChannelProvider() {
        @Override
        public DuplexChannel getChannel() {
            DuplexChannel channel = connect();
            channel.pipeline().addLast(new LoggingHandler(getClass()));
            return channel;
        }
    };

    @Override
    public void init(DockerClientConfig dockerClientConfig) {
        checkNotNull(dockerClientConfig, "config was not specified");
        this.dockerClientConfig = dockerClientConfig;

        bootstrap = new Bootstrap();

        String scheme = dockerClientConfig.getDockerHost().getScheme();

        if ("unix".equals(scheme)) {
            nettyInitializer = new UnixDomainSocketInitializer();
        } else if ("tcp".equals(scheme)) {
            nettyInitializer = new InetSocketInitializer();
        }

        eventLoopGroup = nettyInitializer.init(bootstrap, dockerClientConfig);
    }

    private DuplexChannel connect() {
        try {
            return connect(bootstrap);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    private DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException {
        return nettyInitializer.connect(bootstrap);
    }

    private interface NettyInitializer {
        EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig);

        DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException;
    }

    private class UnixDomainSocketInitializer implements NettyInitializer {
        @Override
        public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) {
            EventLoopGroup epollEventLoopGroup = new EpollEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
            bootstrap.group(epollEventLoopGroup).channel(EpollDomainSocketChannel.class)
                    .handler(new ChannelInitializer() {
                        @Override
                        protected void initChannel(final UnixChannel channel) throws Exception {
                            channel.pipeline().addLast(new HttpClientCodec());
                        }
                    });
            return epollEventLoopGroup;
        }

        @Override
        public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
            return (DuplexChannel) bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel();
        }
    }

    private class InetSocketInitializer implements NettyInitializer {
        @Override
        public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerClientConfig) {
            EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));

            InetAddress addr = InetAddress.getLoopbackAddress();

            final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008);

            Security.addProvider(new BouncyCastleProvider());

            bootstrap.group(nioEventLoopGroup).channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer() {
                        @Override
                        protected void initChannel(final SocketChannel channel) throws Exception {
                            // channel.pipeline().addLast(new
                            // HttpProxyHandler(proxyAddress));
                            channel.pipeline().addLast(new HttpClientCodec());
                        }
                    });

            return nioEventLoopGroup;
        }

        @Override
        public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
            String host = dockerClientConfig.getDockerHost().getHost();
            int port = dockerClientConfig.getDockerHost().getPort();

            if (port == -1) {
                throw new RuntimeException("no port configured for " + host);
            }

            DuplexChannel channel = (DuplexChannel) bootstrap.connect(host, port).sync().channel();

            if (dockerClientConfig.getDockerTlsVerify()) {
                final SslHandler ssl = initSsl(dockerClientConfig);

                if (ssl != null) {
                    channel.pipeline().addFirst(ssl);
                }
            }

            return channel;
        }

        private SslHandler initSsl(DockerClientConfig dockerClientConfig) {
            SslHandler ssl = null;

            try {
                String host = dockerClientConfig.getDockerHost().getHost();
                int port = dockerClientConfig.getDockerHost().getPort();

                if (sslContext == null) {
                    sslContext = new LocalDirectorySSLConfig(dockerClientConfig.getDockerCertPath()).getSSLContext();
                }

                SSLEngine engine = sslContext.createSSLEngine(host, port);
                engine.setUseClientMode(true);
                engine.setSSLParameters(enableHostNameVerification(engine.getSSLParameters()));

                // in the future we may use HostnameVerifier like here:
                // https://github.org.testifyproject.testifyproject/AsyncHttpClient/async-http-client/blob/1.8.x/src/main/java/org.testifyproject.testifyproject/ning/http/client/providers/netty/NettyConnectListener.java#L76

                ssl = new SslHandler(engine);

            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            return ssl;
        }
    }

    protected DockerClientConfig getDockerClientConfig() {
        checkNotNull(dockerClientConfig,
                "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
        return dockerClientConfig;
    }

    public SSLParameters enableHostNameVerification(SSLParameters sslParameters) {
        sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
        return sslParameters;
    }

    @Override
    public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
        return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
    }

    @Override
    public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
        return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
    }

    @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 CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
        return new CopyFileFromContainerCmdExec(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(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!");

        eventLoopGroup.shutdownGracefully();
    }

    @Override
    public DockerCmdExecFactory withSSLContext(SSLContext sslContext) {
        this.sslContext = sslContext;
        return this;
    }

    private WebTarget getBaseResource() {
        return new WebTarget(channelProvider);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy