hiera_zookeeper 0.2.2 → 0.2.3
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.
- data/lib/hiera/backend/zookeeper_backend.rb +46 -41
- metadata +4 -4
@@ -2,12 +2,30 @@ class Hiera
|
|
2
2
|
module Backend
|
3
3
|
class Zookeeper_backend
|
4
4
|
# ZooKeeper backend for Hiera. Recognizes :server and :datadir config options. If no :server is specified, uses localhost:2181.
|
5
|
-
# The node data is expected to be in YAML.
|
5
|
+
# The node data is expected to be in YAML or JSON (YAML is the default).
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
require 'rubygems'
|
9
|
-
require 'yaml'
|
10
9
|
require 'zookeeper'
|
10
|
+
# Set default values
|
11
|
+
Config[:zookeeper] = Hash.new() if Config[:zookeeper].nil?
|
12
|
+
Config[:zookeeper][:timeout] = 1 if Config[:zookeeper][:timeout].nil?
|
13
|
+
Config[:zookeeper][:datadir] = '/hiera' if Config[:zookeeper][:datadir].nil?
|
14
|
+
Config[:zookeeper][:format] = 'yaml' if Config[:zookeeper][:format].nil?
|
15
|
+
Config[:zookeeper][:format].downcase!
|
16
|
+
if Config[:zookeeper][:server].nil? then
|
17
|
+
Config[:zookeeper][:servers] = ['localhost:2181'] if Config[:zookeeper][:servers].nil?
|
18
|
+
else
|
19
|
+
Hiera.warn("The :server option is deprecated. Use :servers. Option :server will go away very soon.")
|
20
|
+
Config[:zookeeper][:servers] = Config[:zookeeper][:server]
|
21
|
+
end
|
22
|
+
|
23
|
+
case Config[:zookeeper][:format]
|
24
|
+
when 'json'
|
25
|
+
require 'json'
|
26
|
+
else
|
27
|
+
require 'yaml'
|
28
|
+
end
|
11
29
|
|
12
30
|
Hiera.debug("Hiera ZooKeeper backend starting")
|
13
31
|
end
|
@@ -17,29 +35,15 @@ class Hiera
|
|
17
35
|
Hiera.debug("Looking up #{key} in ZooKeeper backend")
|
18
36
|
# Establish server(s) to check
|
19
37
|
servers = []
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Config[:zookeeper][:server].each do |server|
|
24
|
-
servers.push(Backend.parse_string(server, scope))
|
25
|
-
end
|
26
|
-
else
|
27
|
-
servers.push(Backend.parse_string(Config[:zookeeper][:server], scope))
|
28
|
-
end
|
29
|
-
else
|
30
|
-
servers.push('localhost:2181')
|
31
|
-
end
|
32
|
-
# Establish connection timeout
|
33
|
-
if Config[:zookeeper].nil? or Config[:zookeeper][:timeout].nil? then
|
34
|
-
timeout = 1
|
35
|
-
else
|
36
|
-
timeout = Config[:zookeeper][:timeout]
|
38
|
+
Config[:zookeeper][:servers].shuffle!
|
39
|
+
Config[:zookeeper][:servers].each do |s|
|
40
|
+
servers.push(Backend.parse_string(s, scope))
|
37
41
|
end
|
38
42
|
# Establish connection
|
39
43
|
zk = nil
|
40
44
|
servers.each do |s|
|
41
45
|
begin
|
42
|
-
zk = Zookeeper.new(s, timeout)
|
46
|
+
zk = Zookeeper.new(s, Config[:zookeeper][:timeout])
|
43
47
|
break if zk.connected?
|
44
48
|
rescue => e
|
45
49
|
Hiera.debug(e.message)
|
@@ -48,34 +52,35 @@ class Hiera
|
|
48
52
|
end
|
49
53
|
# If it did not work, raise that exception!
|
50
54
|
if zk.nil? or not zk.connected? then
|
51
|
-
raise(ZookeeperExceptions::ZookeeperException, "Could not connect to any server in configuration")
|
55
|
+
raise(ZookeeperExceptions::ZookeeperException, "Could not connect to any zookeeper server in configuration")
|
52
56
|
end
|
53
57
|
|
54
58
|
Backend.datasources(scope, order_override) do |source|
|
55
59
|
Hiera.debug("Looking for data source #{source}")
|
56
|
-
# Determine the zookeeper path
|
57
|
-
|
58
|
-
datadir = "#{Backend.datadir(Config[:zookeeper][:datadir], scope)}/#{source}"
|
59
|
-
else
|
60
|
-
datadir = "/hiera/#{source}"
|
61
|
-
end
|
60
|
+
# Determine the zookeeper path to get data from
|
61
|
+
datadir = "#{Backend.parse_string(Config[:zookeeper][:datadir], scope)}/#{source}"
|
62
62
|
data = zk.get(:path => "#{datadir}/#{key}")
|
63
63
|
if data[:stat].exists then
|
64
64
|
Hiera.debug("Found #{key} in #{source}")
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
65
|
+
case Config[:zookeeper][:format]
|
66
|
+
when 'json'
|
67
|
+
new_answer = Backend.resolve_answer(JSON.load(data[:data]), resolution_type)
|
68
|
+
else
|
69
|
+
new_answer = Backend.resolve_answer(YAML.load(data[:data]), resolution_type)
|
70
|
+
end
|
71
|
+
case resolution_type
|
72
|
+
when :array
|
73
|
+
raise(Exception, "Hiera type mismatch: expected Array and got #{new_answer.class}") unless new_answer.kind_of?(Array) or new_answer.kind_of?(String)
|
74
|
+
answer ||= []
|
75
|
+
answer << new_answer
|
76
|
+
when :hash
|
77
|
+
raise(Exception, "Hiera type mismatch: expected Hash and got #{new_answer.class}") unless new_answer.kind_of?(Hash)
|
78
|
+
answer ||= {}
|
79
|
+
answer = new_answer.merge(answer)
|
80
|
+
else
|
81
|
+
answer = new_answer
|
82
|
+
break
|
83
|
+
end
|
79
84
|
end
|
80
85
|
end
|
81
86
|
zk.close if not zk.nil? and zk.connected?
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hiera_zookeeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- zahna
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-09-
|
18
|
+
date: 2012-09-26 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: hiera
|