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

de.gesellix.docker.client.node.ManageNodeClient.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client.node

import de.gesellix.docker.client.DockerResponseHandler
import de.gesellix.docker.client.tasks.ManageTask
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

@Slf4j
class ManageNodeClient implements ManageNode {

  private EngineClient client
  private DockerResponseHandler responseHandler
  private QueryUtil queryUtil
  private ManageTask manageTask
  private NodeUtil nodeUtil

  ManageNodeClient(
      EngineClient client,
      DockerResponseHandler responseHandler,
      ManageTask manageTask,
      NodeUtil nodeUtil) {
    this.client = client
    this.responseHandler = responseHandler
    this.queryUtil = new QueryUtil()
    this.manageTask = manageTask
    this.nodeUtil = nodeUtil
  }

  @Override
  EngineResponse nodes(query = [:]) {
    log.info "docker node ls"
    def actualQuery = query ?: [:]
    queryUtil.jsonEncodeFilters(actualQuery)
    def response = client.get([path : "/nodes",
                               query: actualQuery])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node ls failed"))
    return response
  }

  @Override
  inspectNode(name) {
    log.info "docker node inspect"
    def response = client.get([path: "/nodes/$name".toString()])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node inspect failed"))
    return response
  }

  @Override
  rmNode(name) {
    log.info "docker node rm"
    def response = client.delete([path: "/nodes/$name".toString()])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node rm failed"))
    return response
  }

  @Override
  updateNode(name, query, config) {
    log.info "docker node update"
    def actualQuery = query ?: [:]
    config = config ?: [:]
    def response = client.post([path              : "/nodes/$name/update".toString(),
                                query             : actualQuery,
                                body              : config,
                                requestContentType: "application/json"])
    responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node update failed"))
    IOUtils.closeQuietly(response.stream)
    return response
  }

  @Override
  promoteNodes(... nodes) {
    log.info "docker node promote"
    nodes?.each { node ->
      def nodeInfo = inspectNode(node).content
      def nodeSpec = nodeInfo.Spec

      if (nodeSpec.Role == "manager") {
        log.warn("Node ${node} is already a manager.")
      }
      else {
        nodeSpec.Role = "manager"
        def response = updateNode(
            node,
            ["version": nodeInfo.Version.Index],
            nodeSpec)
        responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node promote failed for node ${node}"))
        log.info("Node ${node} promoted to a manager in the swarm.")
      }
    }
  }

  @Override
  demoteNodes(... nodes) {
    log.info "docker node demote"
    nodes?.each { node ->
      def nodeInfo = inspectNode(node).content
      def nodeSpec = nodeInfo.Spec

      if (nodeSpec.Role == "worker") {
        log.warn("Node ${node} is already a worker.")
      }
      else {
        nodeSpec.Role = "worker"
        def response = updateNode(
            node,
            ["version": nodeInfo.Version.Index],
            nodeSpec)
        responseHandler.ensureSuccessfulResponse(response, new IllegalStateException("docker node demote failed for node ${node}"))
        log.info("Manager ${node} demoted in the swarm.")
      }
    }
  }

  @Override
  tasksOnNode(node, query = [:]) {
    log.info "docker node ps"
    def actualQuery = query ?: [:]
    if (!actualQuery.containsKey('filters')) {
      actualQuery.filters = [:]
    }
    actualQuery.filters['node'] = nodeUtil.resolveNodeId(node)
    return manageTask.tasks(actualQuery)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy