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.EngineResponseContent
import de.gesellix.docker.client.tasks.ManageTask
import de.gesellix.docker.remote.api.EngineApiClient
import de.gesellix.docker.remote.api.Node
import de.gesellix.docker.remote.api.NodeSpec
import de.gesellix.docker.remote.api.Task
import de.gesellix.util.QueryUtil
import org.slf4j.Logger
import org.slf4j.LoggerFactory

class ManageNodeClient implements ManageNode {

  private final Logger log = LoggerFactory.getLogger(ManageNodeClient)

  private EngineApiClient client
  private ManageTask manageTask
  private NodeUtil nodeUtil

  ManageNodeClient(
      EngineApiClient client,
      ManageTask manageTask,
      NodeUtil nodeUtil) {
    this.client = client
    this.manageTask = manageTask
    this.nodeUtil = nodeUtil
  }

  @Override
  EngineResponseContent> nodes(Map query) {
    Map actualQuery = [:]
    if (query) {
      actualQuery.putAll(query)
    }
    new QueryUtil().jsonEncodeQueryParameter(actualQuery, "filters")
    return nodes(actualQuery.filters as String)
  }

  @Override
  EngineResponseContent> nodes(String filters = null) {
    log.info("docker node ls")
    List response = client.nodeApi.nodeList(filters)
    return new EngineResponseContent>(response)
  }

  @Override
  EngineResponseContent inspectNode(String name) {
    log.info("docker node inspect")
    Node nodeInspect = client.nodeApi.nodeInspect(name)
    return new EngineResponseContent(nodeInspect)
  }

  @Override
  void rmNode(String name) {
    log.info("docker node rm")
    client.nodeApi.nodeDelete(name, null)
  }

  @Override
  void updateNode(String name, long version, NodeSpec nodeSpec) {
    log.info("docker node update")
    client.nodeApi.nodeUpdate(name, version, nodeSpec)
  }

  @Override
  void promoteNodes(String... nodes) {
    log.info("docker node promote")
    nodes?.each { String node ->
      Node nodeInfo = inspectNode(node).content
      if (nodeInfo.spec.role == NodeSpec.Role.Manager) {
        log.warn("Node ${node} is already a manager.")
      }
      else {
        def nodeSpec = new NodeSpec(nodeInfo.spec.name, nodeInfo.spec.labels, NodeSpec.Role.Manager, nodeInfo.spec.availability)
        updateNode(nodeInfo.ID, nodeInfo.version.index, nodeSpec)
        log.info("Node ${node} promoted to a manager in the swarm.")
      }
    }
  }

  @Override
  void demoteNodes(String... nodes) {
    log.info("docker node demote")
    nodes?.each { String node ->
      Node nodeInfo = inspectNode(node).content
      if (nodeInfo.spec.role == NodeSpec.Role.Worker) {
        log.warn("Node ${node} is already a worker.")
      }
      else {
        def nodeSpec = new NodeSpec(nodeInfo.spec.name, nodeInfo.spec.labels, NodeSpec.Role.Worker, nodeInfo.spec.availability)
        updateNode(nodeInfo.ID, nodeInfo.version.index, nodeSpec)
        log.info("Manager ${node} demoted in the swarm.")
      }
    }
  }

  @Override
  EngineResponseContent> tasksOnNode(String node, Map query = [:]) {
    log.info("docker node ps")
    Map 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