consul_loader 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 20f10a4a9c506b7e9cf0034cd30973e50e245a92
4
+ data.tar.gz: fa03e35d6ab293751fe7d7d34d1a076ffc5efdc1
5
+ SHA512:
6
+ metadata.gz: fff98f4516bd948167bac6d59205cc0d6fa8fed5736715663f19e875cd967f891ee89540b794add33cf3ad4f4de85cb55c2ea6eb2abe431e1549da4a3d97817f
7
+ data.tar.gz: 57545c00c9dd92a39ea459d49d5e12c81d61d33a00d6871d141079988dd51a7b009c8d15ca5a54f096450d0f8d246d7f4a7ab58632507d55fff5ebc2316d674e
@@ -0,0 +1,7 @@
1
+ require 'yaml'
2
+ require 'rest-client'
3
+ require "base64"
4
+
5
+ require "consul_loader/loader.rb"
6
+ require "consul_loader/config_parser.rb"
7
+ require "consul_loader/response_decoder.rb"
@@ -0,0 +1,25 @@
1
+ module ConsulLoader
2
+ class ConfigParser
3
+ attr_accessor :config
4
+
5
+ def initialize
6
+ self.config = []
7
+ end
8
+
9
+ def process_yaml root, hash
10
+ keys = []
11
+ return [] unless hash
12
+
13
+ hash.each do |key, value|
14
+ if value.is_a?(Hash)
15
+ process_yaml(root + "/" + key, value).each do |k|
16
+ keys << k
17
+ end
18
+ else
19
+ keys << {:k => root + "/" + key, :v => value}
20
+ end
21
+ end
22
+ return keys
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,64 @@
1
+ module ConsulLoader
2
+ class Loader
3
+
4
+ attr_accessor :parser
5
+
6
+ def initialize parser
7
+ self.parser = parser
8
+ end
9
+
10
+ def load_config location, server
11
+ if File.directory? location
12
+ load_folder location, server
13
+ elsif load_file_and_upload location, server
14
+ else
15
+ raise Errno::ENOENT
16
+ end
17
+ end
18
+
19
+ private
20
+ def load_folder folder, server
21
+ Dir.glob("#{folder}/*.yaml").each do |x|
22
+ load_file_and_upload x, server
23
+ end
24
+ end
25
+
26
+ def load_file_and_upload filename, server
27
+ yaml = YAML.load_file(filename)
28
+ self.parser.process_yaml("", yaml).each {|k|
29
+ upload_config k, server
30
+ }
31
+ end
32
+
33
+ def upload_config c, server
34
+ case c[:v]
35
+ when Array
36
+ value = c[:v].to_json
37
+ when String, Fixnum, TrueClass
38
+ value = c[:v]
39
+ end
40
+
41
+ check_and_send_value c[:k], value, server
42
+ end
43
+
44
+ def check_and_send_value key, value, server
45
+ send_data = true
46
+
47
+ begin
48
+ response = RestClient.get "#{server}/v1/kv#{key}"
49
+ decoder = ConsulLoader::ResponseDecoder.new
50
+ existing_value = decoder.decode_value response.body
51
+ if value.to_s == existing_value.to_s
52
+ send_data = false
53
+ end
54
+ rescue
55
+ send_data = true
56
+ end
57
+
58
+ if send_data
59
+ puts "Updating key: #{key} with value: #{value}"
60
+ RestClient.put "#{server}/v1/kv#{key}", value.to_s
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,24 @@
1
+ # Consul returns responses like so...
2
+ #[{"CreateIndex":7809,"ModifyIndex":32838,"LockIndex":0,"Key":"api/eventsauce/retry_intervals","Flags":0,"Value":"WyIxMHMiLCIxbSIsIjE1bSIsIjFoIiwiMWQiXQ=="}]
3
+ module ConsulLoader
4
+ class ResponseDecoder
5
+ def decode_value response
6
+ return nil if response == nil
7
+
8
+ json = JSON.parse response
9
+
10
+ return nil if json == nil
11
+ return nil if json[0]["Value"] == nil
12
+
13
+ base64_decode json[0]["Value"]
14
+ end
15
+
16
+ def base64_decode value
17
+ begin
18
+ return Base64.strict_decode64(value)
19
+ rescue
20
+ return nil
21
+ end
22
+ end
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: consul_loader
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nic Jackson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webmock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rest-client
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Use consul loader to convert your heirachical yaml file into key value
84
+ paths in consul, this may be useful if you want to load a config file into your
85
+ consul server.
86
+ email: jackson.nic@gmail.com
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - lib/consul_loader.rb
92
+ - lib/consul_loader/config_parser.rb
93
+ - lib/consul_loader/loader.rb
94
+ - lib/consul_loader/response_decoder.rb
95
+ homepage: https://github.com/nicholasjackson/consul-loader
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.4.5.1
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Consul loader allows you to import a yaml file into Consul's key value store.
119
+ test_files: []