Class: DockerBoss::Module::Etcd

Inherits:
DockerBoss::Module show all
Defined in:
lib/docker_boss/module/etcd.rb

Instance Method Summary collapse

Methods inherited from DockerBoss::Module

inherited, #run

Constructor Details

#initialize(config) ⇒ Etcd

Returns a new instance of Etcd.



11
12
13
14
15
16
17
18
# 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

Instance Method Details

#process_specs(containers) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 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

#setupObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 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