hiera-router 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a12b6ae4e10045577873f02b0b2425cace302ea5
4
+ data.tar.gz: 065154f07b55c5db435f02ab23e2c1bf096e5057
5
+ SHA512:
6
+ metadata.gz: 870db9815df5d7f3288ad6556f784aa1d2fe8b5d12d990412a02c5970f56ce95a925b2905420c51ff5b564852fd92a6acffc2966a50c8dac58f8e2c8daf59be5
7
+ data.tar.gz: d9fbb8ac71a1999729ecdd2238f6df585d2d50b3482876e584049e755c7502e1c02913d1e5f3a00bbca58d87d7f01d43c6e29360f0a81df65ab93b8b78dcf994
@@ -0,0 +1,109 @@
1
+ class Hiera
2
+ module Backend
3
+ class Router_backend
4
+ attr_reader :backends
5
+
6
+ def initialize(cache = nil)
7
+ require 'hiera/filecache'
8
+ require 'yaml'
9
+ @cache = cache || Filecache.new
10
+ @backends = {}
11
+ if backend_list = Config[:router][:backends]
12
+ backend_list.each do |backend|
13
+ require "hiera/backend/#{backend.downcase}_backend"
14
+ @backends[backend] = Hiera::Backend.const_get("#{backend.capitalize}_backend").new
15
+ end
16
+ end
17
+
18
+ Hiera.debug("hiera router initialized")
19
+ end
20
+ def lookup(key, scope, order_override, resolution_type)
21
+ options = {
22
+ :key => key,
23
+ :scope => scope,
24
+ :order_override => order_override,
25
+ :resolution_type => resolution_type,
26
+ }
27
+ answer = nil
28
+
29
+ Hiera.debug("Looking up #{key} in yaml backend")
30
+
31
+ Backend.datasources(scope, order_override) do |source|
32
+ Hiera.debug("Looking for data source #{source}")
33
+ yaml_file = Backend.datafile(:router, scope, source, 'yaml') || next
34
+
35
+ next unless File.exists?(yaml_file)
36
+
37
+ data = @cache.read(yaml_file, Hash) do |cached_data|
38
+ YAML.load(cached_data) || {}
39
+ end
40
+
41
+ next if data.empty?
42
+ next unless data.include?(key)
43
+
44
+ Hiera.debug("Found #{key} in #{source}")
45
+
46
+ new_answer = parse_answer(data[key], scope, options)
47
+ next if new_answer.nil?
48
+
49
+ case resolution_type
50
+ when :array
51
+ raise Exception, "Hiera type mismatch: expected Array and got #{new_answer.class}" unless new_answer.kind_of? Array or new_answer.kind_of? String
52
+ answer ||= []
53
+ answer << new_answer
54
+ when :hash
55
+ raise Exception, "Hiera type mismatch: expected Hash and got #{new_answer.class}" unless new_answer.kind_of? Hash
56
+ answer ||= {}
57
+ answer = Backend.merge_answer(new_answer,answer)
58
+ else
59
+ answer = new_answer
60
+ break
61
+ end
62
+ end
63
+
64
+ return answer
65
+ end
66
+
67
+ def parse_answer(data, scope, options)
68
+ if data.is_a?(Numeric) or data.is_a?(TrueClass) or data.is_a?(FalseClass)
69
+ return data
70
+ elsif data.is_a?(String)
71
+ return parse_string(data, scope, options)
72
+ elsif data.is_a?(Hash)
73
+ answer = {}
74
+ data.each_pair do |key, val|
75
+ interpolated_key = Backend.parse_string(key, scope)
76
+ answer[interpolated_key] = parse_answer(val, scope, options)
77
+ end
78
+
79
+ return answer
80
+ elsif data.is_a?(Array)
81
+ answer = []
82
+ data.each do |item|
83
+ answer << parse_answer(item, scope, options)
84
+ end
85
+
86
+ return answer
87
+ end
88
+ end
89
+
90
+ def parse_string(data, scope, options)
91
+ if match = data.match(/^backend\[([^,]+)(?:,(.*))?\]$/)
92
+ backend_name, backend_parameters = match.captures
93
+ backend_options = options
94
+ backend_options = backend_options.merge(backend_parameters) if backend_parameters
95
+ Hiera.debug "Calling hiera with '#{backend_name}'..."
96
+ if backend = backends[backend_name]
97
+ result = backend.lookup(backend_options[:key], backend_options[:scope], nil, backend_options[:resolution_type])
98
+ else
99
+ raise "Backend '#{backend_name}' was not configured."
100
+ end
101
+ Hiera.debug "Call to '#{backend_name}' finished."
102
+ return result
103
+ else
104
+ Backend.parse_string(data, scope)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hiera-router
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - Jo Vandeginste
8
+ - Tom Leuse
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-06-23 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: |
15
+ This hiera backend replaces the default yaml backend, but will resend queries to other hiera backends based on the value returned by the yaml files.
16
+
17
+ When hiera-router gets a string matching "BACKEND[otherbackendname]", it will resend the same query to "otherbackendname".
18
+ email:
19
+ - jo.vandeginste@kuleuven.be
20
+ - tom.leuse@kuleuven.be
21
+ executables: []
22
+ extensions: []
23
+ extra_rdoc_files: []
24
+ files:
25
+ - lib/hiera/backend/router_backend.rb
26
+ homepage: https://github.com/jovandeginste/hiera-router
27
+ licenses:
28
+ - Apache-2.0
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.4.5
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: This hiera backend to selectively forward requests to different hiera backends
50
+ test_files: []