consul-template-generator 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aaef7a186c5c1fca60d93587c591ae1784f43fc5
4
- data.tar.gz: 2a718fbc572f86694d7baa45d3fe2fe00e6d116c
3
+ metadata.gz: 11a123a605164b3bf85c7d874ae9d731db56cb99
4
+ data.tar.gz: 9091f83f039d537c0a1b13fac6a99a7546247881
5
5
  SHA512:
6
- metadata.gz: 0ec46a6583238a47068a2ecb2d9a248c03fcd37484c780f742eb152f79aeb639aa7526249d31384d1a1057aaae91d7b881dd2a03bf2e8fe2d87e0e06371654c1
7
- data.tar.gz: fe1eea1260ecc10e3247ecabcf92ab1e05b4e74663c3afdfe6913ba96c36a4c48c704d8f51764df6cdf5d3b8dd0f9fefae0dc2e9399a9da38c83d15f8ce680bd
6
+ metadata.gz: 4330d15eb334469bad07257f6e66eaaf29dd9f787a652006e9afd9116e714a9d45072c4dce4fbf3fb80d142012f69e0571ac764f349cb39798ad0ae65ff9ca53
7
+ data.tar.gz: 33406c87edc31d2b4534104bcbbe2a5378690346ca834cadbec809797ab3ad5f7792e9650ff7903c6a00ddf0e0f37c29db140c9506fe496a009c7e1dd51f3d0b
@@ -5,7 +5,7 @@ require 'consul/template/generator/cmd'
5
5
  include Consul::Template::Generator
6
6
 
7
7
  def verify_opts(opts)
8
- !opts[:key].nil? && !opts[:template].nil?
8
+ !(opts[:templates].empty? || opts[:templates].any? { |k,v| v.nil? })
9
9
  end
10
10
 
11
11
 
@@ -26,14 +26,14 @@ EOC
26
26
  options[:consul] = h
27
27
  end
28
28
 
29
- options[:template] = nil
30
- opts.on('-t TEMPLATE', '--template TEMPLATE', 'Consul-Template ctmpl file to monitor (required)') do |t|
31
- options[:template] = t
29
+ options[:templates] = {}
30
+ opts.on('-t TEMPLATES', '--templates TEMPLATES', 'Comma separated list of consul-template ctmpl file and keys to monitor, tmple.ctmpl:tmple-key,tmple2.ctmpl:templ-key2 (required)') do |t|
31
+ options[:templates] = Hash[t.split(',').collect { |v| v.split(':') } ]
32
32
  end
33
33
 
34
- options[:key] = nil
35
- opts.on('-k KEY', '--key KEY', 'Key to store rendered template in (required)') do |k|
36
- options[:key] = k
34
+ options[:session_key] = 'consul-template-generator'
35
+ opts.on('-s SESSION_KEY', '--session-key SESSION_KEY', 'Key used to lock template generation session [default: consul-template-generator') do |l|
36
+ options[:session_key] = l
37
37
  end
38
38
 
39
39
  options[:proxy] = nil
@@ -64,8 +64,9 @@ end
64
64
 
65
65
  opt_parser.parse!
66
66
 
67
+
67
68
  unless verify_opts(options)
68
- STDOUT.puts "Both '--key' and '--template' must be provided"
69
+ STDOUT.puts "'--templates' must be provided with <template>:<key> pairs\n\n"
69
70
  puts opt_parser
70
71
  exit(1)
71
72
  end
@@ -74,7 +75,7 @@ if options[:unset_proxy]
74
75
  ENV['http_proxy'] = nil
75
76
  end
76
77
 
77
- CMD.configure(options[:consul], options[:template], options[:key], options[:log_level], options[:proxy])
78
+ CMD.configure(options[:consul], options[:templates], options[:session_key], options[:log_level], options[:proxy])
78
79
 
79
80
  ec = 1
80
81
  cmd = ARGV[0]
@@ -31,14 +31,10 @@ module Consul
31
31
  self.config.consul_template_binary = ct_binary
32
32
  end
33
33
 
34
- if self.config.template.nil?
34
+ if self.config.templates.empty? || self.config.templates.any? { |k,v| v.nil? }
35
35
  raise "template must be defined in configuration"
36
36
  end
37
37
 
38
- if self.config.template_key.nil?
39
- raise "template_key must be defined in configuration"
40
- end
41
-
42
38
  Diplomat.configure do |config|
43
39
  config.url = "http://#{self.config.consul_host}"
44
40
  config.options = self.config.client_options
@@ -6,11 +6,11 @@ module Consul
6
6
  module CMD
7
7
  include Consul::Template::Generator
8
8
 
9
- def self.configure(consul_host, template, template_key, log_level, proxy = nil)
9
+ def self.configure(consul_host, templates, session_key, log_level, proxy = nil)
10
10
  Consul::Template::Generator.configure do |config|
11
11
  config.log_level = log_level
12
- config.template = template
13
- config.template_key = template_key
12
+ config.templates = templates
13
+ config.session_key = session_key
14
14
  config.consul_host = consul_host
15
15
  end
16
16
  end
@@ -19,14 +19,16 @@ module Consul
19
19
  cycle_sleep ||= 0.5
20
20
  lock_sleep ||= 1.0
21
21
  config = Consul::Template::Generator.config
22
- uploaded_hash = nil
22
+ uploaded_hashes = {}
23
23
  begin
24
24
  runner = CTRunner.new
25
25
  runner.acquire_session_lock do
26
26
  config.logger.info "Session lock acquired..."
27
27
  begin
28
- uploaded_hash = runner.run(uploaded_hash) || uploaded_hash
29
- sleep cycle_sleep
28
+ config.templates.each do |template,template_key|
29
+ uploaded_hashes[template] = runner.run(template, template_key, uploaded_hashes[template]) || uploaded_hashes[template]
30
+ sleep cycle_sleep
31
+ end
30
32
  rescue Interrupt
31
33
  raise # Re-raise to break this rescue block
32
34
  rescue ConsulSessionExpired
@@ -60,8 +62,10 @@ module Consul
60
62
  def self.run_once
61
63
  config = Consul::Template::Generator.config
62
64
  begin
63
- runner = CTRunner.new
64
- result = runner.run
65
+ config.templates.each do |template,template_key|
66
+ runner = CTRunner.new
67
+ result = runner.run template, template_key
68
+ end
65
69
  rescue Exception => e
66
70
  config.logger.error "An unexpected error occurred, unable to process template: #{e.message}"
67
71
  1
@@ -39,25 +39,25 @@ module Consul
39
39
  end
40
40
 
41
41
  class Configuration
42
- attr_accessor :template, :template_key, :consul_template_binary, :logger, :log_level
42
+ attr_accessor :templates, :session_key, :consul_template_binary, :logger, :log_level
43
43
  attr_accessor :consul_host, :node, :client_options
44
44
 
45
45
  def initialize
46
46
  @log_level = :debug
47
47
  @node = nil
48
48
  @consul_host = nil
49
- @template = nil
50
- @template_key = nil
49
+ @templates = {}
50
+ @session_key = 'consul-template-generator'
51
51
  @client_options = {}
52
52
  @logger = Consul::Template::Generator::STDLogger
53
53
  end
54
54
 
55
- def lock_key
56
- "/lock/#{@template_key.sub(/^\//, '')}"
55
+ def lock_key(key)
56
+ "/lock/#{key.sub(/^\//, '')}"
57
57
  end
58
58
 
59
59
  def session_lock_key
60
- "/lock/session/#{@template_key.sub(/^\//, '')}"
60
+ @session_key
61
61
  end
62
62
  end
63
63
  end
@@ -5,9 +5,9 @@ module Consul
5
5
  module Template
6
6
  module Generator
7
7
  class CTRunner
8
- def render_template
8
+ def render_template(template)
9
9
  body = nil
10
- cmd = %{#{@config.consul_template_binary} -dry -once -template #{@config.template}}
10
+ cmd = %{#{@config.consul_template_binary} -dry -once -template #{template}}
11
11
  procs = ::Open4.popen4(*cmd) do |pid, stdin, stdout, stderr|
12
12
  body = stdout.read.strip
13
13
  # consul-template -dry inserts '> \n' at the top of stdout, remove it
@@ -5,8 +5,8 @@ module Consul
5
5
  module Generator
6
6
  class CTRunner
7
7
 
8
- def acquire_lock(lock_key = nil)
9
- lock_key ||= @config.lock_key
8
+ def acquire_lock(target_key)
9
+ lock_key = @config.lock_key target_key
10
10
  @config.logger.debug "Attempting to acquire lock on key: #{lock_key}"
11
11
  Consul::Template::Generator.renew_session @session
12
12
  unless Diplomat::Lock.acquire(lock_key, @session)
@@ -27,10 +27,10 @@ module Consul
27
27
  end
28
28
  end
29
29
 
30
- def upload_template(raw_template)
31
- @config.logger.info "Uploading key: #{@config.template_key}"
30
+ def upload_template(template_key, raw_template)
31
+ @config.logger.info "Uploading key: #{template_key}"
32
32
  begin
33
- Diplomat::Kv.put(@config.template_key, raw_template)
33
+ Diplomat::Kv.put(template_key, raw_template)
34
34
  rescue Exception => e
35
35
  raise TemplateUploadError, "Encountered an unexpected error while uploading template: #{e.message}"
36
36
  end
@@ -4,11 +4,11 @@ module Consul
4
4
  module Template
5
5
  module Generator
6
6
  class CTRunner
7
- def run(comp_hash = nil)
7
+ def run(template, template_key, comp_hash = nil)
8
8
  status, body, hash, uploaded_hash = nil, nil, nil, nil
9
- acquire_lock do
10
- @config.logger.debug "Attempting to render template: #{@config.template}"
11
- status, body, hash = render_template
9
+ acquire_lock template_key do
10
+ @config.logger.debug "Attempting to render template: #{template}"
11
+ status, body, hash = render_template template
12
12
  unless status == 0
13
13
  raise TemplateRenderError, "consul-template exited with on-zero exit status"
14
14
  end
@@ -17,9 +17,9 @@ module Consul
17
17
  end
18
18
  @config.logger.debug "Template rendered..."
19
19
  if comp_hash.nil? || comp_hash != hash
20
- @config.logger.info "Change in template discovered, attempting to upload to key #{@config.template_key}"
20
+ @config.logger.info "Change in template discovered, attempting to upload to key #{template_key}"
21
21
  @config.logger.debug "Existing hash: #{comp_hash || 'nil'}, new hash: #{hash}"
22
- uploaded = upload_template(body)
22
+ uploaded = upload_template(template_key, body)
23
23
  if uploaded
24
24
  @config.logger.info "New template uploaded..."
25
25
  uploaded_hash = hash
@@ -1,7 +1,7 @@
1
1
  module Consul
2
2
  module Template
3
3
  module Generator
4
- VERSION = '0.1.2'
4
+ VERSION = '0.2.0'
5
5
  end
6
6
  end
7
7
  end
data/spec/ct_spec.rb CHANGED
@@ -24,8 +24,7 @@ end
24
24
  describe 'Consul::Template::Generator::CTRunner' '#render_template' do
25
25
  before do
26
26
  Consul::Template::Generator.configure do |config|
27
- config.template = '/etc/test-template.ctmpl'
28
- config.template_key = '/test-template'
27
+ config.templates = {'/etc/test-template.ctmpl' => '/test-template'}
29
28
  config.consul_template_binary = 'consul-template'
30
29
  end
31
30
  end
@@ -36,7 +35,7 @@ describe 'Consul::Template::Generator::CTRunner' '#render_template' do
36
35
  exp_hash = '54b0c58c7ce9f2a8b551351102ee0938'
37
36
  setup_open4(exp_out, 0, 101)
38
37
  runner = CTRunner.new('test-session')
39
- exit_code, body, hash = runner.render_template
38
+ exit_code, body, hash = runner.render_template Consul::Template::Generator.config.templates['/etc/test-template.ctmpl']
40
39
  expect(body).to eql(exp_out)
41
40
  expect(hash).to eql(exp_hash)
42
41
  expect(exit_code).to eql(@status)
data/spec/init_spec.rb CHANGED
@@ -8,8 +8,7 @@ include Consul::Template::Generator
8
8
  describe 'Consul::Template::Generator::CTRunner' '#initialize' do
9
9
  before(:each) do
10
10
  Consul::Template::Generator.configure do |config|
11
- config.template = 'test-session-template.ctmpl'
12
- config.template_key = 'test-session-template'
11
+ config.templates = {'test-session-template.ctmpl' => 'test-session-template' }
13
12
  config.node = 'test-node'
14
13
  config.log_level = :off
15
14
  config.consul_template_binary = 'consul-template'
@@ -10,18 +10,18 @@ include Consul::Template::Generator
10
10
  describe 'Consul::Template::Generator::CTRunner' '#acquire_lock' do
11
11
  before do
12
12
  Consul::Template::Generator.configure do |config|
13
- config.template = 'test-template.ctmpl'
14
- config.template_key = '/test-template'
13
+ config.templates = { 'test-template.ctmpl' => '/test-template' }
15
14
  config.consul_host = '127.0.0.1:8500'
16
15
  config.consul_template_binary = 'consul-template'
17
16
  config.log_level = :off
18
17
  end
18
+ @config = Consul::Template::Generator.config
19
19
  end
20
20
 
21
21
  context 'acquires lock' do
22
22
  it 'clean lock acquisition' do
23
23
  runner = CTRunner.new('test-session')
24
- runner.acquire_lock do
24
+ runner.acquire_lock @config.templates['test-template.ctmpl'] do
25
25
  expect(true).to be_truthy ## This is simply to assert we are able to execute code in the block
26
26
  end
27
27
  expect(WebMock).to have_requested(:put, 'http://127.0.0.1:8500/v1/kv/lock/test-template').with(:query => {:acquire => 'test-session'})
@@ -30,7 +30,7 @@ describe 'Consul::Template::Generator::CTRunner' '#acquire_lock' do
30
30
 
31
31
  it 'handles being unable to acquire lock' do
32
32
  runner = CTRunner.new('test-session-lock-fail')
33
- expect { runner.acquire_lock { puts 'hi' } }.to raise_error(KeyNotLockedError)
33
+ expect { runner.acquire_lock @config.templates['test-template.ctmpl'] { puts 'hi' } }.to raise_error(KeyNotLockedError)
34
34
  expect(WebMock).to have_requested(:put, 'http://127.0.0.1:8500/v1/kv/lock/test-template').with(:query => {:acquire => 'test-session-lock-fail'})
35
35
  expect(WebMock).to_not have_requested(:put, 'http://127.0.0.1:8500/v1/kv/lock/test-template').with(:query => {:release => 'test-session-lock-fail'})
36
36
  end
@@ -40,8 +40,8 @@ end
40
40
  describe 'Consul::Template::Generator::CTRunner' '#acquire_session_lock' do
41
41
  before do
42
42
  Consul::Template::Generator.configure do |config|
43
- config.template = 'test-template.ctmpl'
44
- config.template_key = '/test-template'
43
+ config.templates = { 'test-template.ctmpl' => '/test-template' }
44
+ config.session_key = '/session/test-template'
45
45
  config.consul_host = '127.0.0.1:8500'
46
46
  config.consul_template_binary = 'consul-template'
47
47
  config.log_level = :off
@@ -71,17 +71,17 @@ describe 'Consul::Template::Generator::CTRunner' '#upload_template' do
71
71
  context 'uploads template' do
72
72
  before do
73
73
  Consul::Template::Generator.configure do |config|
74
- config.template = 'test-template.ctmpl'
75
- config.template_key = '/test-template'
74
+ config.templates = { 'test-template.ctmpl' => '/test-template' }
76
75
  config.consul_host = '127.0.0.1:8500'
77
76
  config.consul_template_binary = 'consul-template'
78
77
  config.log_level = :off
79
78
  end
79
+ @config = Consul::Template::Generator.config
80
80
  end
81
81
 
82
82
  it 'does a clean upload' do
83
83
  runner = CTRunner.new('test-session')
84
- success = runner.upload_template('this is a test')
84
+ success = runner.upload_template(@config.templates['test-template.ctmpl'], 'this is a test')
85
85
  expect(success).to be_truthy
86
86
  expect(WebMock).to have_requested(:put, 'http://127.0.0.1:8500/v1/kv/test-template').with(:body => 'this is a test')
87
87
  end
@@ -90,17 +90,17 @@ describe 'Consul::Template::Generator::CTRunner' '#upload_template' do
90
90
  context 'handles template upload failure' do
91
91
  before do
92
92
  Consul::Template::Generator.configure do |config|
93
- config.template = 'test-template.ctmpl'
94
- config.template_key = '/test-template-failure'
93
+ config.templates = { 'test-template.ctmpl' => '/test-template-failure' }
95
94
  config.consul_host = '127.0.0.1:8500'
96
95
  config.consul_template_binary = 'consul-template'
97
96
  config.log_level = :off
98
97
  end
98
+ @config = Consul::Template::Generator.config
99
99
  end
100
100
 
101
101
  it 'does a clean upload' do
102
102
  runner = CTRunner.new('test-session')
103
- expect { runner.upload_template('this is a fail test') }.to raise_error(TemplateUploadError)
103
+ expect { runner.upload_template(@config.templates['test-template.ctmpl'], 'this is a fail test') }.to raise_error(TemplateUploadError)
104
104
  expect(WebMock).to have_requested(:put, 'http://127.0.0.1:8500/v1/kv/test-template-failure').with(:body => 'this is a fail test')
105
105
  end
106
106
  end
data/spec/run_spec.rb CHANGED
@@ -13,37 +13,37 @@ describe 'Consul::Template::Generator::CTRunner' '#run' do
13
13
  context 'run' do
14
14
  it 'handles a clean run' do
15
15
  exp_hash = 'bbf9afe7431caf5f89a608bc31e8d822'
16
- expect(@runner).to receive(:render_template).with(no_args).and_return([0, 'test body', exp_hash])
17
- expect(@runner).to receive(:upload_template).with('test body').and_return(true)
18
- hash = @runner.run
16
+ expect(@runner).to receive(:render_template).with('test-template').and_return([0, 'test body', exp_hash])
17
+ expect(@runner).to receive(:upload_template).with('/test-template', 'test body').and_return(true)
18
+ hash = @runner.run 'test-template', '/test-template'
19
19
  expect(hash).to eql(exp_hash)
20
20
  end
21
21
 
22
22
  it "doesn't upload unchanged template" do
23
23
  exp_hash = 'bbf9afe7431caf5f89a608bc31e8d822'
24
- expect(@runner).to receive(:render_template).with(no_args).and_return([0, 'test body', exp_hash])
24
+ expect(@runner).to receive(:render_template).with('test-template').and_return([0, 'test body', exp_hash])
25
25
  expect(@runner).not_to receive(:upload_template)
26
- hash = @runner.run exp_hash
26
+ hash = @runner.run 'test-template', '/test-template', exp_hash
27
27
  expect(hash).to be_nil
28
28
  end
29
29
 
30
30
  it 'handles non-zero exit status' do
31
- expect(@runner).to receive(:render_template).with(no_args).and_return([1, 'not used', 'not used'])
31
+ expect(@runner).to receive(:render_template).with('test-template').and_return([1, 'not used', 'not used'])
32
32
  expect(@runner).not_to receive(:upload_template)
33
- expect { @runner.run }.to raise_exception(TemplateRenderError)
33
+ expect { @runner.run 'test-template', '/test-template' }.to raise_exception(TemplateRenderError)
34
34
  end
35
35
 
36
36
  it 'handles empty rendered template' do
37
- expect(@runner).to receive(:render_template).with(no_args).and_return([0, '', 'not used'])
37
+ expect(@runner).to receive(:render_template).with('test-template').and_return([0, '', 'not used'])
38
38
  expect(@runner).not_to receive(:upload_template)
39
- expect { @runner.run }.to raise_exception(TemplateRenderError)
39
+ expect { @runner.run 'test-template', '/test-template' }.to raise_exception(TemplateRenderError)
40
40
  end
41
41
 
42
42
  it 'handles bad return from upload_template' do
43
43
  exp_hash = 'bbf9afe7431caf5f89a608bc31e8d822'
44
- expect(@runner).to receive(:render_template).with(no_args).and_return([0, 'test body', exp_hash])
45
- expect(@runner).to receive(:upload_template).with('test body').and_return(false)
46
- expect { @runner.run }.to raise_exception(TemplateUploadError)
44
+ expect(@runner).to receive(:render_template).with('test-template').and_return([0, 'test body', exp_hash])
45
+ expect(@runner).to receive(:upload_template).with('/test-template', 'test body').and_return(false)
46
+ expect { @runner.run 'test-template', '/test-template' }.to raise_exception(TemplateUploadError)
47
47
  end
48
48
  end
49
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consul-template-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Oldfield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-26 00:00:00.000000000 Z
11
+ date: 2015-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler