hiera_zookeeper 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|