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

de.gesellix.docker.client.system.ManageSystemClient.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client.system

import de.gesellix.docker.client.DockerAsyncCallback
import de.gesellix.docker.client.DockerAsyncConsumer
import de.gesellix.docker.client.DockerResponseHandler
import de.gesellix.docker.engine.EngineClient
import de.gesellix.docker.engine.EngineResponse
import de.gesellix.util.IOUtils
import de.gesellix.util.QueryUtil
import groovy.util.logging.Slf4j
import okio.Okio

import static java.util.concurrent.Executors.newSingleThreadExecutor

@Slf4j
class ManageSystemClient implements ManageSystem {

  private EngineClient client
  private DockerResponseHandler responseHandler
  private QueryUtil queryUtil

  ManageSystemClient(EngineClient client, DockerResponseHandler responseHandler) {
    this.client = client
    this.responseHandler = responseHandler
    this.queryUtil = new QueryUtil()
  }

  @Override
  EngineResponse systemDf(Map query = [:]) {
    log.info "docker system df"
    def actualQuery = query ?: [:]
    def response = client.get([path : "/system/df",
                               query: actualQuery])
    return response
  }

  @Override
  EngineResponse events(DockerAsyncCallback callback, Map query = [:]) {
    log.info "docker events"

    queryUtil.jsonEncodeFilters(query)
    def response = client.get([path : "/events",
                               query: query,
                               async: true])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker events failed"))
    def executor = newSingleThreadExecutor()
    def future = executor.submit(new DockerAsyncConsumer(response as EngineResponse, callback))
    response.taskFuture = future
    return response
  }

  @Override
  EngineResponse ping() {
    log.info "docker ping"
    def response = client.get([path: "/_ping", timeout: 2000])

    // Recently (no idea since when), the engine responds with a chunked transfer-encoding on this endpoint,
    // which we don't fully consume by default. In case of /_ping we try to keep the old behaviour
    // for consumers of our .ping() method, though.
    if (!response.content && response.stream) {
      response.content = Okio.buffer(Okio.source(response.stream)).readUtf8()
      IOUtils.closeQuietly(response.stream)
    }
    return response
  }

  @Override
  EngineResponse version() {
    log.info "docker version"
    def response = client.get([path: "/version"])
    return response
  }

  @Override
  EngineResponse info() {
    log.info "docker info"
    def response = client.get([path: "/info"])
    return response
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy