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

de.gesellix.docker.client.DockerClientImpl.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client

import de.gesellix.docker.client.authentication.ManageAuthentication
import de.gesellix.docker.client.authentication.ManageAuthenticationClient
import de.gesellix.docker.client.config.ManageConfig
import de.gesellix.docker.client.config.ManageConfigClient
import de.gesellix.docker.client.container.ManageContainer
import de.gesellix.docker.client.container.ManageContainerClient
import de.gesellix.docker.client.distribution.ManageDistribution
import de.gesellix.docker.client.distribution.ManageDistributionService
import de.gesellix.docker.client.image.ManageImage
import de.gesellix.docker.client.image.ManageImageClient
import de.gesellix.docker.client.network.ManageNetwork
import de.gesellix.docker.client.network.ManageNetworkClient
import de.gesellix.docker.client.node.ManageNode
import de.gesellix.docker.client.node.ManageNodeClient
import de.gesellix.docker.client.node.NodeUtil
import de.gesellix.docker.client.repository.RepositoryTagParser
import de.gesellix.docker.client.secret.ManageSecret
import de.gesellix.docker.client.secret.ManageSecretClient
import de.gesellix.docker.client.service.ManageService
import de.gesellix.docker.client.service.ManageServiceClient
import de.gesellix.docker.client.stack.ManageStack
import de.gesellix.docker.client.stack.ManageStackClient
import de.gesellix.docker.client.swarm.ManageSwarm
import de.gesellix.docker.client.swarm.ManageSwarmClient
import de.gesellix.docker.client.system.ManageSystem
import de.gesellix.docker.client.system.ManageSystemClient
import de.gesellix.docker.client.tasks.ManageTask
import de.gesellix.docker.client.tasks.ManageTaskClient
import de.gesellix.docker.client.volume.ManageVolume
import de.gesellix.docker.client.volume.ManageVolumeClient
import de.gesellix.docker.engine.DockerClientConfig
import de.gesellix.docker.engine.DockerEnv
import de.gesellix.docker.engine.EngineClient
import de.gesellix.docker.engine.OkDockerClient
import de.gesellix.util.QueryUtil
import groovy.util.logging.Slf4j

import static java.net.Proxy.NO_PROXY

@Slf4j
class DockerClientImpl implements DockerClient {

  DockerResponseHandler responseHandler
  RepositoryTagParser repositoryTagParser
  QueryUtil queryUtil

  Proxy proxy
  DockerClientConfig dockerClientConfig
  DockerEnv env
  EngineClient httpClient

  @Delegate
  ManageSystem manageSystem
  @Delegate
  ManageAuthentication manageAuthentication
  @Delegate
  ManageImage manageImage
  @Delegate
  ManageContainer manageContainer
  @Delegate
  ManageVolume manageVolume
  @Delegate
  ManageNetwork manageNetwork
  @Delegate
  ManageSwarm manageSwarm
  @Delegate
  ManageSecret manageSecret
  @Delegate
  ManageConfig manageConfig
  @Delegate
  ManageService manageService
  @Delegate
  ManageStack manageStack
  @Delegate
  ManageNode manageNode
  @Delegate
  ManageTask manageTask
  @Delegate
  ManageDistribution manageDistribution

  DockerClientImpl() {
    this(new DockerClientConfig())
  }

  DockerClientImpl(String dockerHost) {
    this(new DockerClientConfig(dockerHost))
  }

  DockerClientImpl(DockerEnv env, Proxy proxy = NO_PROXY) {
    this(new DockerClientConfig(env), proxy)
  }

  DockerClientImpl(DockerClientConfig dockerClientConfig, Proxy proxy = NO_PROXY) {
    apply(dockerClientConfig, proxy)
  }

  def apply(DockerClientConfig dockerClientConfig, Proxy proxy = NO_PROXY) {
    this.dockerClientConfig = dockerClientConfig
    this.env = dockerClientConfig.env
    this.proxy = proxy

    this.httpClient = new OkDockerClient(dockerClientConfig, proxy)
    log.info "using docker at '${env.dockerHost}'"

    this.responseHandler = new DockerResponseHandler()
    this.repositoryTagParser = new RepositoryTagParser()
    this.queryUtil = new QueryUtil()

    this.manageSystem = new ManageSystemClient(httpClient, responseHandler)
    this.manageAuthentication = new ManageAuthenticationClient(env, httpClient, manageSystem)
    this.manageImage = new ManageImageClient(httpClient, responseHandler, manageAuthentication)
    this.manageDistribution = new ManageDistributionService(httpClient, responseHandler)
    this.manageContainer = new ManageContainerClient(httpClient, responseHandler, manageImage)
    this.manageVolume = new ManageVolumeClient(httpClient, responseHandler)
    this.manageNetwork = new ManageNetworkClient(httpClient, responseHandler)
    this.manageSwarm = new ManageSwarmClient(httpClient, responseHandler)
    this.manageSecret = new ManageSecretClient(httpClient, responseHandler)
    this.manageConfig = new ManageConfigClient(httpClient, responseHandler)
    this.manageTask = new ManageTaskClient(httpClient, responseHandler)
    NodeUtil nodeUtil = new NodeUtil(manageSystem)
    this.manageService = new ManageServiceClient(httpClient, responseHandler, manageTask, nodeUtil)
    this.manageNode = new ManageNodeClient(httpClient, responseHandler, manageTask, nodeUtil)
    this.manageStack = new ManageStackClient(
        httpClient,
        responseHandler,
        manageService,
        manageTask,
        manageNode,
        manageNetwork,
        manageSecret,
        manageConfig,
        manageSystem,
        manageAuthentication)
  }

  void setDockerClientConfig(DockerClientConfig dockerClientConfig) {
    apply(dockerClientConfig, proxy)
  }

  void setEnv(DockerEnv env) {
    setDockerClientConfig(new DockerClientConfig(env))
  }

  /**
   * @deprecated Please use the prune* commands.
   * @see ManageContainer#pruneContainers(java.lang.Object)
   * @see ManageImage#pruneImages(java.lang.Object)
   * @see ManageVolume#pruneVolumes(java.lang.Object)
   */
  @Deprecated
  @Override
  cleanupStorage(Closure shouldKeepContainer, Closure shouldKeepVolume = { true }) {
    cleanupContainers shouldKeepContainer
    cleanupImages()
    cleanupVolumes shouldKeepVolume
  }

  /**
   * @deprecated Please use the prune* commands.
   * @see ManageContainer#pruneContainers(java.lang.Object)
   */
  @Deprecated
  @Override
  cleanupContainers(Closure shouldKeepContainer) {
    def allContainers = ps([filters: [status: ["exited"]]]).content
    allContainers.findAll { Map container ->
      !shouldKeepContainer(container)
    }.each { container ->
      log.debug "docker rm ${container.Id} (${container.Names.first()})"
      rm(container.Id)
    }
  }

  /**
   * @deprecated Please use the prune* commands.
   * @see ManageImage#pruneImages(java.lang.Object)
   */
  @Deprecated
  @Override
  cleanupImages() {
    images([filters: [dangling: ["true"]]]).content.each { image ->
      log.debug "docker rmi ${image.Id}"
      rmi(image.Id as String)
    }
  }

  /**
   * @deprecated Please use the prune* commands.
   * @see ManageVolume#pruneVolumes(java.lang.Object)
   */
  @Deprecated
  @Override
  cleanupVolumes(Closure shouldKeepVolume) {
    def allVolumes = volumes([filters: [dangling: ["true"]]]).content.Volumes
    allVolumes.findAll { Map volume ->
      !shouldKeepVolume(volume)
    }.each { volume ->
      log.debug "docker volume rm ${volume.Name}"
      rmVolume(volume.Name)
    }
  }

  @Override
  search(term) {
    log.info "docker search"
    def response = httpClient.get([path : "/images/search".toString(),
                                   query: [term: term]])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker search failed"))
    return response
  }

  @Override
  getSwarmMangerAddress() {
    log.info "docker get swarm manager address"
    def swarmNodeId = info().content.Swarm.NodeID
    def node = inspectNode(swarmNodeId).content
    return node.ManagerStatus.Addr
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy