module CORL::Mixin::Lookup

Public Instance Methods

config_initialized?() click to toggle source
    # File lib/core/mixin/lookup.rb
168 def config_initialized?
169   ready = false
170   if hiera
171     if CORL.admin?
172       if network_path = fact(:corl_network)
173         ready = File.directory?(File.join(network_path, 'config'))
174       end
175     else
176       ready = hiera_override_dir && File.directory?(hiera_override_dir)
177     end
178   end
179   ready
180 end
create_facts(data, reset = false) click to toggle source
   # File lib/core/mixin/lookup.rb
29 def create_facts(data, reset = false)
30   facts(reset, false)
31 
32   data = hash(data)
33   data.each do |name, value|
34     fact_var[name.to_sym] = value
35   end
36   create_facts_post(fact_var.clone, data.keys)
37 end
create_facts_post(data, names) click to toggle source
   # File lib/core/mixin/lookup.rb
39 def create_facts_post(data, names)
40   data
41 end
debug_lookup(config, property, value, label) click to toggle source
    # File lib/core/mixin/lookup.rb
363 def debug_lookup(config, property, value, label)
364   if config.get(:debug, false)
365     CORL.ui_group(Util::Console.cyan(property.to_s)) do |ui|
366       dump = Util::Console.green(Util::Data.to_json(value, true))
367 
368       if dump.match(/\n+/)
369         ui.info("#{label}:\n#{dump}")
370       else
371         ui.info("#{label}: #{dump}")
372       end
373     end
374   end
375 end
delete_facts(names, reset = false) click to toggle source
   # File lib/core/mixin/lookup.rb
45 def delete_facts(names, reset = false)
46   facts(reset, false)
47 
48   names = [ names ] unless names.is_a?(Array)
49   data  = {}
50 
51   names.each do |name|
52     name       = name.to_sym
53     data[name] = fact_var.delete(name)
54   end
55   delete_facts_post(fact_var.clone, data)
56 end
delete_facts_post(data, old_data) click to toggle source
   # File lib/core/mixin/lookup.rb
58 def delete_facts_post(data, old_data)
59   data
60 end
fact(name, reset = false) click to toggle source
   # File lib/core/mixin/lookup.rb
64 def fact(name, reset = false)
65   facts(reset, false)
66   fact_var[name.to_sym]
67 end
fact_var() click to toggle source
   # File lib/core/mixin/lookup.rb
11 def fact_var
12   @@facts
13 end
fact_var=(facts) click to toggle source
   # File lib/core/mixin/lookup.rb
15 def fact_var=facts
16   @@facts = facts
17 end
facts(reset = false, clone = true) click to toggle source
   # File lib/core/mixin/lookup.rb
21 def facts(reset = false, clone = true) # Override if needed. (See node plugin)
22   self.fact_var = CORL.facts if reset || fact_var.nil?
23   return fact_var.clone if clone
24   fact_var
25 end
hiera(reset = false) click to toggle source
    # File lib/core/mixin/lookup.rb
160 def hiera(reset = false)
161   self.hiera_var = Hiera.new(:config => hiera_configuration(facts(reset))) if reset || hiera_var.nil?
162   hiera_var
163 end
hiera_configuration(local_facts = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
 96 def hiera_configuration(local_facts = {})
 97   Kernel.load File.join(File.dirname(__FILE__), '..', 'mod', 'hiera_backend.rb')
 98 
 99   backends    = CORL.value(:hiera_backends, [ "json", "yaml" ])
100   config_file = CORL.value(:hiera_config_file, File.join(Hiera::Util.config_dir, 'hiera.yaml'))
101   config      = {}
102 
103   if CORL.admin? && config_file && File.exist?(config_file)
104     config = Hiera::Config.load(config_file)
105   end
106 
107   # Need some way to tell if we have installed our own Hiera configuration.
108   # TODO: Figure something else out.  This is bad.
109   config = {} if config[:merge_behavior] == :native
110 
111   config[:logger] = :corl
112 
113   unless config[:merge_behavior]
114     config[:merge_behavior] = "deeper"
115   end
116 
117   unless config[:backends]
118     config[:backends] = backends
119   end
120 
121   if override_dir = hiera_override_dir
122     backends.each do |backend|
123       if config[:backends].include?(backend)
124         backend = backend.to_sym
125         config[backend] = {} unless config[backend]
126         config[backend][:datadir] = override_dir
127       end
128     end
129   end
130 
131   hiera_config = CORL.config(:hiera, config)
132   loaded_facts = Util::Data.prefix(hiera_lookup_prefix, local_facts, '')
133 
134   if hiera_config[:hierarchy]
135     hiera_config[:hierarchy].delete('common')
136   end
137 
138   unless loaded_facts.empty?
139     hiera_config[:hierarchy].collect! do |search|
140       Hiera::Interpolate.interpolate(search, loaded_facts, {})
141     end
142   end
143 
144   unless hiera_config[:hierarchy]
145     hiera_config[:hierarchy] = [ 'common' ]
146   end
147   unless hiera_config[:hierarchy].include?('common')
148     hiera_config[:hierarchy] << 'common'
149   end
150 
151   hiera_config[:hierarchy].each_with_index do |path, index|
152     hiera_config[:hierarchy][index] = path.gsub('//', '/')
153   end
154 
155   hiera_config.export
156 end
hiera_lookup_prefix() click to toggle source
   # File lib/core/mixin/lookup.rb
90 def hiera_lookup_prefix
91   '::'
92 end
hiera_override_dir() click to toggle source
   # File lib/core/mixin/lookup.rb
84 def hiera_override_dir
85   nil # Override if needed. (See network and node plugins)
86 end
hiera_var() click to toggle source
   # File lib/core/mixin/lookup.rb
74 def hiera_var
75   @@hiera
76 end
hiera_var=(hiera) click to toggle source
   # File lib/core/mixin/lookup.rb
78 def hiera_var=hiera
79   @@hiera = hiera
80 end
lookup(properties, default = nil, options = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
262 def lookup(properties, default = nil, options = {})
263   lookup_base(properties, default, options)
264 end
lookup_array(properties, default = [], options = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
268 def lookup_array(properties, default = [], options = {})
269   config          = Config.ensure(options).defaults({ :basic => false })
270   value, property = lookup(properties, nil, config.import({ :return_property => true, :context => :array }))
271 
272   if Util::Data.undef?(value)
273     value = default
274     debug_lookup(config, property, value, "Array default value")
275 
276   elsif ! Util::Data.empty?(default)
277     if config.get(:merge, false)
278       value = Util::Data.merge([default, value], config)
279       debug_lookup(config, property, value, "Merged array value with default")
280     end
281   end
282 
283   unless value.is_a?(Array)
284     value = ( Util::Data.empty?(value) ? [] : [ value ] )
285   end
286 
287   value = Util::Data.value(value, config.get(:undefined_value, :undefined))
288   debug_lookup(config, property, value, "Final array value")
289 
290   Config.set_property(property, value)
291   CORL.ui.info("\n", { :prefix => false }) if config.get(:debug, false)
292   value
293 end
lookup_base(properties, default = nil, options = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
184 def lookup_base(properties, default = nil, options = {})
185   config      = Config.new(Config.ensure(options).export)
186   value       = nil
187 
188   node        = config.delete(:node, nil)
189 
190   provisioner = config.get(:provisioner, nil)
191 
192   hiera_scope = config.get(:hiera_scope, {})
193   override    = config.get(:override, nil)
194   context     = config.get(:context, :priority)
195   debug       = config.get(:debug, false)
196 
197   return_property = config.get(:return_property, false)
198 
199   return node.lookup(properties, default, config) if node
200 
201   unless properties.is_a?(Array)
202     properties = [ properties ].flatten
203   end
204 
205   first_property = nil
206   properties.each do |property|
207     property       = property.to_sym
208     first_property = property unless first_property
209 
210     if debug
211       CORL.ui.info("\n", { :prefix => false })
212       CORL.ui_group(Util::Console.purple(property)) do |ui|
213         ui.info("-----------------------------------------------------")
214       end
215     end
216 
217     # Try to load facts first (these can not be overridden)
218     value = fact(property)
219     debug_lookup(config, property, value, "Fact lookup")
220 
221     unless value
222       if config_initialized?
223         # Try to find in Hiera data store
224         unless hiera_scope.respond_to?('[]')
225           hiera_scope = Hiera::Scope.new(hiera_scope)
226         end
227 
228         hiera_scope = string_map(hiera_scope) if hiera_scope.is_a?(Hash)
229         value       = hiera.lookup(property.to_s, nil, hiera_scope, override, context.to_sym)
230 
231         debug_lookup(config, property, value, "Hiera lookup")
232       end
233 
234       if provisioner && value.nil?
235         # Search the provisioner scope (only admins can provision a machine)
236         value = CORL.provisioner({ :name => :lookup }, provisioner).lookup(property, default, config)
237         debug_lookup(config, property, value, "Provisioner lookup")
238       end
239     end
240   end
241   if value.nil? # Resort to default
242     value = default
243     debug_lookup(config, first_property, value, "Default value")
244   end
245   value = Util::Data.value(value, config.get(:undefined_value, :undefined))
246 
247   if Config.get_property(first_property).nil? || value
248     Config.set_property(first_property, value)
249   end
250 
251   debug_lookup(config, first_property, value, 'Internalized value')
252 
253   if return_property
254     return value, first_property
255   end
256   CORL.ui.info("\n", { :prefix => false }) if debug
257   value
258 end
lookup_hash(properties, default = {}, options = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
297 def lookup_hash(properties, default = {}, options = {})
298   config          = Config.ensure(options).defaults({ :basic => false })
299   value, property = lookup(properties, nil, config.import({ :return_property => true, :context => :hash }))
300 
301   if Util::Data.undef?(value)
302     value = default
303     debug_lookup(config, property, value, "Hash default value")
304 
305   elsif ! Util::Data.empty?(default)
306     if config.get(:merge, false)
307       value = Util::Data.merge([default, value], config)
308       debug_lookup(config, property, value, "Merged hash value with default")
309     end
310   end
311 
312   unless value.is_a?(Hash)
313     value = ( Util::Data.empty?(value) ? {} : { :value => value } )
314   end
315 
316   value = Util::Data.value(value, config.get(:undefined_value, :undefined))
317   debug_lookup(config, property, value, "Final hash value")
318 
319   Config.set_property(property, value)
320   CORL.ui.info("\n", { :prefix => false }) if config.get(:debug, false)
321   value
322 end
normalize(data, override = nil, options = {}) click to toggle source
    # File lib/core/mixin/lookup.rb
326 def normalize(data, override = nil, options = {})
327   config  = Config.ensure(options).import({ :context => :hash }).defaults({ :basic => false })
328   results = {}
329 
330   unless Util::Data.undef?(override)
331     case data
332     when String, Symbol
333       data = [ data, override ] if data != override
334     when Array
335       data << override unless data.include?(override)
336     when Hash
337       data = [ data, override ]
338     end
339   end
340 
341   case data
342   when String, Symbol
343     results = lookup(data.to_s, {}, config)
344 
345   when Array
346     data.each do |item|
347       if item.is_a?(String) || item.is_a?(Symbol)
348         item = lookup(item.to_s, {}, config)
349       end
350       unless Util::Data.undef?(item)
351         results = Util::Data.merge([ results, item ], config)
352       end
353     end
354 
355   when Hash
356     results = data
357   end
358   results
359 end