class DockerBoss::Module::Etcd

Public Class Methods

new(config) click to toggle source
# File lib/docker_boss/module/etcd.rb, line 11
def initialize(config)
  @config = config
  @host = DockerBoss::Helpers.render_erb(@config['server']['host'], {})
  DockerBoss.logger.debug "etcd: Set up to connect to #{@host}, port #{@config['server']['port']}"
  @client = ::Etcd.client(host: @host, port: @config['server']['port'])
  @previous_keys = {}
  setup
end

Public Instance Methods

process_specs(containers) click to toggle source
# File lib/docker_boss/module/etcd.rb, line 68
def process_specs(containers)
  values = {}
  @config['sets'].each do |name,template|
    tmpl = ERB.new(template)
    containers.each do |container|
      ns = OpenStruct.new({ container: container })
      ns.extend(DockerBoss::Helpers::TemplateHelpers)
      entries = tmpl.result(ns.instance_eval { binding })
      entries.lines.each do |line|
        (keyword, key, value) = line.lstrip.chomp.split(" ", 3)
        values[key] = value.to_s if keyword == 'ensure'
      end
    end
  end
  values
end
setup() click to toggle source
# File lib/docker_boss/module/etcd.rb, line 20
def setup
  setup = DockerBoss::Helpers.render_erb(@config.fetch('setup', ''), {})
  setup.lines.each do |line|
    (kw, k, v) = line.lstrip.chomp.split(" ", 3)
    case kw
    when 'absent'
      begin
        DockerBoss.logger.debug "etcd: (setup) Remove key `#{k}`"
        @client.delete(k)
      rescue ::Etcd::KeyNotFound
      end
    when 'absent_recursive'
      begin
        DockerBoss.logger.debug "etcd: (setup) Remove key `#{k}` recursively"
        @client.delete(k, recursive: true)
      rescue ::Etcd::KeyNotFound
      end
    when 'ensure_dir'
      DockerBoss.logger.debug "etcd: (setup) Set key `#{k}` (dir)"
      @client.set(k, dir: true)
    when 'ensure'
      DockerBoss.logger.debug "etcd: (setup) Set key `#{k}` => `#{v}`"
      @client.set(k, value: v)
    end
  end
end
trigger(containers, trigger_id) click to toggle source
# File lib/docker_boss/module/etcd.rb, line 47
def trigger(containers, trigger_id)
  @new_keys = process_specs(containers)
  changes = DockerBoss::Helpers.hash_diff(@previous_keys, @new_keys)
  @previous_keys = @new_keys

  changes[:removed].each do |k,v|
    DockerBoss.logger.debug "etcd: Remove key `#{k}`"
    @client.delete(k)
  end

  changes[:added].each do |k,v|
    DockerBoss.logger.debug "etcd: Add key `#{k}` => `#{v}`"
    @client.set(k, value: v)
  end

  changes[:changed].each do |k,v|
    DockerBoss.logger.debug "etcd: Update key `#{k}` => `#{v}`"
    @client.set(k, value: v)
  end
end