Menu

Configure Swarm Manager hosts

module.exports = (service) ->
  options = service.options

Docker Daemon options

  options.docker ?= {}
  options.docker[opt] ?= service.deps.docker.options[opt] for opt in [
    'host'
    'default_port'
    'tlscacert'
    'tlscert'
    'tlskey'
    'tlsverify'
    'conf_dir'
  ]
  options.fqdn ?= service.node.fqdn

Swarm Image

  options.image ?= 'swarm'
  options.tag ?= 'latest'
  options.conf_dir ?= '/etc/docker-swarm'
  options.name ?= 'swarm_agent'
  options.iptables ?= service.deps.iptables and service.deps.iptables.options.action is 'start'

Cluster discovery from manager

  #Note for docker to be able to start the ip address must be set (instead of hostname)
  options.advertise_host ?= service.node.fqdn
  options.advertise_port ?= options.docker.default_port
  options.swarm_manager_host ?= "#{service.deps.swarm_manager[0].node.fqdn}:3376"

Docker Deamon Configuration

Pass docker start option to docker daemon to use it with swarm.

TCP Socket

Swarm nodes use the advertise address to communicate. It must be specified in the start option of the local daemon engine to enable it.

  tcp_socket = "#{service.node.fqdn}:#{options.advertise_port}"
  if service.deps.docker?.options.sockets.tcp.indexOf(tcp_socket) is -1
  then service.deps.docker.options.sockets.tcp.push tcp_socket

SSL

Inherits properties from local docker daemon

  options.ssl ?= merge {}, service.deps.docker.options.ssl
  options.other_args ?= {}
  options.other_args['tlscacert'] ?= service.deps.docker.options.other_args['tlscacert']
  options.other_args['tlscert'] ?= service.deps.docker.options.other_args['tlscert']
  options.other_args['tlskey'] ?= service.deps.docker.options.other_args['tlskey']

Swarm Cluster & Discovery

This starting options should be injected to @config.docker variable. For now ryba/swarm/agent modify the starting options and restart docker engine.

  options.cluster ?= {}
  options.cluster =  merge service.deps.swarm_manager[0].options.cluster, options.cluster
  # @config.docker.other_args['cluster-store'] ?= swarm.cluster.zk_store
  # @config.docker.other_args['cluster-advertise'] ?= "#{swarm.manager.advertise_host}:#{swarm.manager.advertise_port}"
  options.other_args['cluster-store'] ?= options.cluster.zk_store
  options.other_args['cluster-advertise'] ?= "#{service.node.ip}:#{options.advertise_port}"
  service.deps.docker.options.other_args = merge service.deps.docker.options.other_args, options.other_args if service.deps.docker?
  service.deps.docker.options.daemon ?= {}
  service.deps.docker.options.daemon['cluster-advertise'] ?= options.other_args['cluster-advertise']
  service.deps.docker.options.daemon['cluster-store'] ?= options.other_args['cluster-store']

Wait

  options.wait_manager ?= service.deps.swarm_manager[0].options.wait

Dependencies

{merge} = require '@nikitajs/core/lib/misc'