corl 0.4.3 → 0.4.4

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.
@@ -1,63 +1,46 @@
1
- begin
2
- require 'hiera/backend'
3
1
 
4
- class Hiera
5
- module Backend
6
- #
7
- # NOTE: This function is overridden so we can collect accumulated hiera
8
- # parameters and their values on a particular puppet run for reporting
9
- # purposes.
10
- #
11
- # Calls out to all configured backends in the order they
12
- # were specified. The first one to answer will win.
13
- #
14
- # This lets you declare multiple backends, a possible
15
- # use case might be in Puppet where a Puppet module declares
16
- # default data using in-module data while users can override
17
- # using JSON/YAML etc. By layering the backends and putting
18
- # the Puppet one last you can override module author data
19
- # easily.
20
- #
21
- # Backend instances are cached so if you need to connect to any
22
- # databases then do so in your constructor, future calls to your
23
- # backend will not create new instances
24
- def lookup(key, default, scope, order_override, resolution_type)
25
- @backends ||= {}
26
- answer = nil
2
+ class Hiera
3
+ module Backend
4
+ class << self
5
+ #
6
+ # NOTE: This function is overridden so we can collect accumulated hiera
7
+ # parameters and their values on a particular provisioning run for reporting
8
+ # purposes.
9
+ #
10
+ def lookup(key, default, scope, order_override, resolution_type)
11
+ @backends ||= {}
12
+ answer = nil
27
13
 
28
- Config[:backends].each do |backend|
29
- if constants.include?("#{backend.capitalize}_backend") || constants.include?("#{backend.capitalize}_backend".to_sym)
30
- @backends[backend] ||= Backend.const_get("#{backend.capitalize}_backend").new
31
- new_answer = @backends[backend].lookup(key, scope, order_override, resolution_type)
14
+ Config[:backends].each do |backend|
15
+ if constants.include?("#{backend.capitalize}_backend") || constants.include?("#{backend.capitalize}_backend".to_sym)
16
+ @backends[backend] ||= Backend.const_get("#{backend.capitalize}_backend").new
17
+ new_answer = @backends[backend].lookup(key, scope, order_override, resolution_type)
32
18
 
33
- if not new_answer.nil?
34
- case resolution_type
35
- when :array
36
- raise Exception, "Hiera type mismatch: expected Array and got #{new_answer.class}" unless new_answer.kind_of? Array or new_answer.kind_of? String
37
- answer ||= []
38
- answer << new_answer
39
- when :hash
40
- raise Exception, "Hiera type mismatch: expected Hash and got #{new_answer.class}" unless new_answer.kind_of? Hash
41
- answer ||= {}
42
- answer = merge_answer(new_answer,answer)
43
- else
44
- answer = new_answer
45
- break
46
- end
47
- end
19
+ if not new_answer.nil?
20
+ case resolution_type
21
+ when :array
22
+ raise Exception, "Hiera type mismatch: expected Array and got #{new_answer.class}" unless new_answer.kind_of? Array or new_answer.kind_of? String
23
+ answer ||= []
24
+ answer << new_answer
25
+ when :hash
26
+ raise Exception, "Hiera type mismatch: expected Hash and got #{new_answer.class}" unless new_answer.kind_of? Hash
27
+ answer ||= {}
28
+ answer = merge_answer(new_answer,answer)
29
+ else
30
+ answer = new_answer
31
+ break
48
32
  end
49
33
  end
50
-
51
- answer = resolve_answer(answer, resolution_type) unless answer.nil?
52
- answer = parse_string(default, scope) if answer.nil? and default.is_a?(String)
53
-
54
- answer = default if answer.nil?
55
-
56
- CORL::Config.set_property(key, answer) # This is why we override this function!!
57
- return answer
58
34
  end
59
35
  end
60
- end
61
36
 
62
- rescue LoadError
37
+ answer = resolve_answer(answer, resolution_type) unless answer.nil?
38
+ answer = parse_string(default, scope) if answer.nil? and default.is_a?(String)
39
+ answer = default if answer.nil?
40
+
41
+ CORL::Config.set_property(key, answer) # This is why we override this function!!
42
+ return answer
43
+ end
44
+ end
45
+ end
63
46
  end
@@ -225,24 +225,23 @@ class Provisioner < CORL.plugin_class(:base)
225
225
 
226
226
  def lookup(property, default = nil, options = {})
227
227
  # Implement in providers
228
+ nil
228
229
  end
229
-
230
- #--
231
-
232
- def import(files, options = {})
233
- # Implement in providers
234
- end
235
-
236
- #---
237
-
238
- def include(resource_name, properties = {}, options = {})
239
- # Implement in providers
240
- end
241
-
230
+
242
231
  #---
243
232
 
244
233
  def provision(profiles, options = {})
245
- # Implement in providers
234
+ config = Config.ensure(options)
235
+
236
+ use_colors = Util::Console.use_colors
237
+ Util::Console.use_colors = config.get(:color, true)
238
+
239
+ success = yield(config) if block_given?
240
+ Config.save_properties(Config.get_options(:corl_log)) if success
241
+ success
242
+
243
+ ensure
244
+ Util::Console.use_colors = use_colors
246
245
  end
247
246
 
248
247
  #-----------------------------------------------------------------------------
@@ -92,6 +92,13 @@ module Puppet
92
92
  return unless puppet_scope
93
93
 
94
94
  info = type_info(type_name, options)
95
+
96
+ if config.get(:debug, false)
97
+ CORL.ui.info("\n", { :prefix => false })
98
+ CORL.ui_group(Util::Console.purple(info[:name])) do |ui|
99
+ ui.info("-----------------------------------------------------")
100
+ end
101
+ end
95
102
  ResourceGroup.new(info, defaults).add(resources, config)
96
103
  end
97
104
 
@@ -107,15 +114,19 @@ module Puppet
107
114
  type = type_info(type, config)
108
115
  end
109
116
 
117
+ display_name = puppet_scope.parent_module_name ? puppet_scope.parent_module_name : 'toplevel'
118
+
110
119
  case type[:type]
111
120
  when :type, :define
112
- CORL.ui_group(puppet_scope.source.module_name) do |ui|
113
- #ui.info("Adding #{type[:name]} #{title} definition")
121
+ CORL.ui_group(Util::Console.cyan(display_name)) do |ui|
122
+ rendered_title = Util::Console.blue(title)
123
+ ui.info("Adding #{type[:name]} #{rendered_title}")
114
124
  end
115
125
  add_definition(type, title, properties, config)
116
126
  when :class
117
- CORL.ui_group(puppet_scope.source.module_name) do |ui|
118
- #ui.info("Adding #{title} class")
127
+ CORL.ui_group(Util::Console.cyan(display_name)) do |ui|
128
+ rendered_title = Util::Console.blue(title)
129
+ ui.info("Adding class #{rendered_title}")
119
130
  end
120
131
  add_class(title, properties, config)
121
132
  end
@@ -131,7 +142,7 @@ module Puppet
131
142
  klass = puppet_scope.find_hostclass(title)
132
143
  return unless klass
133
144
 
134
- #dbg(properties, "class #{title}")
145
+ debug_resource(config, title, properties)
135
146
  klass.ensure_in_catalog(puppet_scope, properties)
136
147
  puppet_scope.catalog.add_class(title)
137
148
  end
@@ -140,7 +151,7 @@ module Puppet
140
151
  #---
141
152
 
142
153
  def self.add_definition(type, title, properties, options = {})
143
- config = Config.ensure(options)
154
+ config = Config.ensure(options)
144
155
 
145
156
  puppet_scope = config.get(:puppet_scope, nil)
146
157
  return unless puppet_scope
@@ -153,14 +164,16 @@ module Puppet
153
164
 
154
165
  namevar = namevar(type[:name], title).to_sym
155
166
  resource_name = properties.has_key?(namevar) ? properties[namevar] : title
167
+ properties = { :name => resource_name }.merge(properties)
156
168
 
157
- { :name => resource_name }.merge(properties).each do |key, value|
169
+ properties.each do |key, value|
158
170
  resource.set_parameter(key, value)
159
171
  end
160
172
  if type[:type] == :define
161
173
  type[:resource].instantiate_resource(puppet_scope, resource)
162
174
  end
163
- #dbg(resource, "definition/type #{type[:type]} #{title}")
175
+
176
+ debug_resource(config, title, properties)
164
177
  puppet_scope.compiler.add_resource(puppet_scope, resource)
165
178
  end
166
179
 
@@ -188,6 +201,8 @@ module Puppet
188
201
  puppet_scope = config.get(:puppet_scope, nil)
189
202
  return false unless puppet_scope
190
203
 
204
+ display_name = puppet_scope.parent_module_name ? puppet_scope.parent_module_name : 'toplevel'
205
+
191
206
  if resource_name.is_a?(Array)
192
207
  resource_name = resource_name.flatten
193
208
  else
@@ -198,10 +213,23 @@ module Puppet
198
213
  classes = Config.lookup(name, nil, config)
199
214
  if classes.is_a?(Array)
200
215
  classes.each do |klass|
216
+ CORL.ui_group(Util::Console.cyan(display_name)) do |ui|
217
+ ui.info("Including class #{klass}")
218
+ end
201
219
  class_data[klass] = properties
202
220
  end
203
- else
204
- class_data[name.to_s] = properties
221
+ end
222
+ end
223
+
224
+ if config.get(:debug, false)
225
+ CORL.ui.info("\n", { :prefix => false })
226
+ CORL.ui_group(Util::Console.cyan("#{display_name} include")) do |ui|
227
+ ui.info("-----------------------------------------------------")
228
+
229
+ dump = Util::Console.green(Util::Data.to_json(class_data, true))
230
+
231
+ ui.info(":\n#{dump}")
232
+ ui.info("\n", { :prefix => false })
205
233
  end
206
234
  end
207
235
 
@@ -237,7 +265,11 @@ module Puppet
237
265
  base_names = base_names.reverse if reverse_lookup
238
266
 
239
267
  base_names.each do |base|
240
- value = puppet_scope.lookupvar("::#{base}::#{property}")
268
+ search_property_name = "#{base}::#{property}"
269
+
270
+ value = puppet_scope.lookupvar("::#{search_property_name}")
271
+ Config.debug_lookup(config, search_property_name, value, "Puppet override lookup")
272
+
241
273
  break unless Util::Data.undef?(value)
242
274
  end
243
275
  end
@@ -245,12 +277,16 @@ module Puppet
245
277
  components = property.to_s.split('::')
246
278
 
247
279
  if components.length > 1
248
- components += [ 'default', components.pop ]
249
- value = puppet_scope.lookupvar('::' + components.flatten.join('::'))
280
+ components += [ 'default', components.pop ]
281
+ search_property_name = components.flatten.join('::')
282
+
283
+ value = puppet_scope.lookupvar("::#{search_property_name}")
284
+ Config.debug_lookup(config, search_property_name, value, "Puppet default lookup")
250
285
  end
251
286
  end
252
287
  if Util::Data.undef?(value) && search_name
253
288
  value = puppet_scope.lookupvar("::#{property}")
289
+ Config.debug_lookup(config, property, value, "Puppet name lookup")
254
290
  end
255
291
 
256
292
  ::Puppet::Util::Log.level = log_level
@@ -297,6 +333,19 @@ module Puppet
297
333
  else
298
334
  'name'
299
335
  end
336
+ end
337
+
338
+ #---
339
+
340
+ def self.debug_resource(config, title, properties)
341
+ if config.get(:debug, false)
342
+ CORL.ui_group(Util::Console.cyan(title.to_s)) do |ui|
343
+ dump = Util::Console.green(Util::Data.to_json(properties, true))
344
+
345
+ ui.info(":\n#{dump}")
346
+ ui.info("\n", { :prefix => false })
347
+ end
348
+ end
300
349
  end
301
350
  end
302
351
  end
@@ -75,16 +75,12 @@ class ResourceGroup < Core
75
75
  #---
76
76
 
77
77
  def add(resources, options = {})
78
- config = Config.ensure(options)
79
-
80
- dbg(resources, 'before')
81
- dbg(default, 'defaults')
78
+ config = Config.ensure(options)
82
79
  resources = normalize(info[:name], resources, config)
83
80
 
84
81
  unless Data.empty?(resources)
85
82
  collection = self.resources
86
83
  resources.each do |title, resource|
87
- dbg(resource.export, "#{info[:type]} #{info[:name]}: #{title}")
88
84
  Puppet.add_resource(info, title, resource.export, config)
89
85
  collection[title] = resource
90
86
  end
@@ -9,7 +9,20 @@ begin
9
9
  network = CORL.network(CORL.sha1(network_config), network_config, :default)
10
10
 
11
11
  if network && node = network.local_node
12
- CORL::Util::Data.hash(node[:facts]).each do |name, value|
12
+ Facter.add(:corl_provider) do
13
+ setcode do
14
+ node.plugin_provider
15
+ end
16
+ end
17
+
18
+ corl_facts = CORL::Util::Data.merge([ {
19
+ :corl_identity => "test",
20
+ :corl_stage => "maintain",
21
+ :corl_type => "core",
22
+ :corl_environment => "development"
23
+ }, node[:facts] ])
24
+
25
+ CORL::Util::Data.hash(corl_facts).each do |name, value|
13
26
  Facter.add(name) do
14
27
  confine :kernel => :linux # TODO: Extend this to work with more systems
15
28
 
@@ -1,10 +1,10 @@
1
1
 
2
2
  require 'puppet/indirector/terminus'
3
3
 
4
- class Puppet::Indirector::CORL < Puppet::Indirector::Terminus
4
+ class Puppet::Indirector::Corl < Puppet::Indirector::Terminus
5
5
 
6
6
  def initialize(*args)
7
- unless CORL::Config.initialized?
7
+ unless CORL::Config.config_initialized?
8
8
  raise "CORL terminus not supported without the CORL library"
9
9
  end
10
10
  super
@@ -13,15 +13,28 @@ class Puppet::Indirector::CORL < Puppet::Indirector::Terminus
13
13
  #---
14
14
 
15
15
  def find(request)
16
- config = CORL::Config.init_flat({}, [ :param, :data_binding ], {
17
- :provisioner => :puppetnode,
18
- :hiera_scope => request.options[:variables],
19
- :puppet_scope => request.options[:variables],
20
- :search => 'core::default',
21
- :search_name => false,
22
- :force => true,
23
- :merge => true
24
- })
16
+ puppet_scope = request.options[:variables]
17
+ module_name = nil
18
+ module_name = puppet_scope.source.module_name if puppet_scope.source
19
+ contexts = [ :param, :data_binding, request.key ]
20
+
21
+ default_options = {
22
+ :provisioner => :puppetnode,
23
+ :hiera_scope => puppet_scope,
24
+ :puppet_scope => puppet_scope,
25
+ :search => 'core::default',
26
+ :search_name => false,
27
+ :force => true,
28
+ :merge => true,
29
+ :undefined_value => :undef
30
+ }
31
+
32
+ if module_name
33
+ config = CORL::Config.init({}, contexts, module_name, default_options)
34
+ else
35
+ config = CORL::Config.init_flat({}, contexts, default_options)
36
+ end
37
+
25
38
  value = CORL::Config.lookup(request.key, nil, config)
26
39
  end
27
40
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  require 'puppet/indirector/corl'
3
3
 
4
- class Puppet::DataBinding::CORL < Puppet::Indirector::CORL
4
+ class Puppet::DataBinding::Corl < Puppet::Indirector::Corl
5
5
  desc "Retrieve data using CORL lookup methods."
6
6
  end
@@ -23,17 +23,28 @@ If no value is found in the defined sources, it does not include any classes.
23
23
  raise(Puppet::ParseError, "corl_include(): Define at least the variable name " +
24
24
  "given (#{args.size} for 1)") if args.size < 1
25
25
 
26
- var_name = args[0]
27
- parameters = ( args.size > 1 ? args[1] : {} )
28
- options = ( args.size > 2 ? args[2] : {} )
26
+ var_name = args[0]
27
+ parameters = ( args.size > 1 ? args[1] : {} )
28
+ options = ( args.size > 2 ? args[2] : {} )
29
+
30
+ module_name = parent_module_name
31
+ contexts = [ :include, var_name ]
32
+
33
+ default_options = {
34
+ :hiera_scope => self,
35
+ :puppet_scope => self,
36
+ :search => 'core::default',
37
+ :force => true,
38
+ :merge => true,
39
+ :undefined_value => :undef
40
+ }
41
+
42
+ if module_name
43
+ config = CORL::Config.init(options, contexts, module_name, default_options)
44
+ else
45
+ config = CORL::Config.init_flat(options, contexts, default_options)
46
+ end
29
47
 
30
- config = CORL::Config.init_flat(options, [ :include ], {
31
- :hiera_scope => self,
32
- :puppet_scope => self,
33
- :search => 'core::default',
34
- :force => true,
35
- :merge => true
36
- })
37
48
  CORL::Util::Puppet.include(var_name, parameters, config)
38
49
  end
39
50
  end
@@ -9,7 +9,17 @@ This function initializes the CORL plugin system through Puppet.
9
9
  EOS
10
10
  ) do |args|
11
11
  CORL.run do
12
+ # Register all Nucleon plugins defined by Puppet modules.
12
13
  CORL::Util::Puppet.register_plugins({ :puppet_scope => self })
14
+
15
+ # Make sure defaults are evaluated first!
16
+ if compiler.node.classes.is_a?(Hash)
17
+ compiler.node.classes.each do |name, parameters|
18
+ if name.match(/::default:?/)
19
+ compiler.evaluate_classes({ name => parameters }, self, false)
20
+ end
21
+ end
22
+ end
13
23
  end
14
24
  end
15
25
  end