corl 0.4.16 → 0.4.17

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/core/facade.rb CHANGED
@@ -22,9 +22,9 @@ module Facade
22
22
 
23
23
  #---
24
24
 
25
- def vagrant_config(directory, config)
25
+ def vagrant_config(directory, config, &code)
26
26
  require File.join(File.dirname(__FILE__), 'vagrant', 'config.rb')
27
- Vagrant::Config.register(directory, config)
27
+ Vagrant::Config.register(directory, config, &code)
28
28
  end
29
29
 
30
30
  #-----------------------------------------------------------------------------
@@ -110,7 +110,7 @@ module Lookup
110
110
  debug_lookup(config, property, value, "Hiera lookup")
111
111
  end
112
112
 
113
- if provisioner && Util::Data.undef?(value)
113
+ if provisioner && value.nil?
114
114
  # Search the provisioner scope (only admins can provision a machine)
115
115
  value = CORL.provisioner({ :name => :lookup }, provisioner).lookup(property, default, config)
116
116
  debug_lookup(config, property, value, "Provisioner lookup")
@@ -118,14 +118,14 @@ module Lookup
118
118
  end
119
119
  end
120
120
  end
121
- if Util::Data.undef?(value) # Resort to default
121
+ if value.nil? # Resort to default
122
122
  value = default
123
123
  debug_lookup(config, first_property, value, "Default value")
124
124
  end
125
125
  value = Util::Data.value(value, config.get(:undefined_value, :undefined))
126
126
 
127
- if ! Config.get_property(first_property) || ! Util::Data.undef?(value)
128
- Config.set_property(first_property.to_s, value)
127
+ if Config.get_property(first_property).nil? || value
128
+ Config.set_property(first_property, value)
129
129
  end
130
130
 
131
131
  debug_lookup(config, first_property, value, 'Internalized value')
@@ -161,7 +161,7 @@ module Lookup
161
161
  value = Util::Data.value(value, config.get(:undefined_value, :undefined))
162
162
  debug_lookup(config, property, value, "Final array value")
163
163
 
164
- Config.set_property(property.to_s, value)
164
+ Config.set_property(property, value)
165
165
  CORL.ui.info("\n", { :prefix => false }) if config.get(:debug, false)
166
166
  value
167
167
  end
@@ -190,7 +190,7 @@ module Lookup
190
190
  value = Util::Data.value(value, config.get(:undefined_value, :undefined))
191
191
  debug_lookup(config, property, value, "Final hash value")
192
192
 
193
- Config.set_property(property.to_s, value)
193
+ Config.set_property(property, value)
194
194
  CORL.ui.info("\n", { :prefix => false }) if config.get(:debug, false)
195
195
  value
196
196
  end
@@ -0,0 +1,15 @@
1
+
2
+ module Facter
3
+ module Util
4
+ class Loader
5
+ def load_dir(dir)
6
+ # TODO: If this works submit a patch to Facter project
7
+ return if dir =~ /\/\.+$/ or dir =~ /\/util$/ or dir =~ /\/core$/ or dir =~ /\/lib$/
8
+
9
+ Dir.entries(dir).find_all { |f| f =~ /\.rb$/ }.sort.each do |file|
10
+ load_file(File.join(dir, file))
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -3,7 +3,7 @@ class Hiera
3
3
  module Backend
4
4
  class << self
5
5
  #
6
- # NOTE: This function is overridden so we can collect accumulated hiera
6
+ # NOTE: This method is overridden so we can collect accumulated hiera
7
7
  # parameters and their values on a particular provisioning run for reporting
8
8
  # purposes.
9
9
  #
@@ -37,8 +37,12 @@ class << self
37
37
  answer = resolve_answer(answer, resolution_type) unless answer.nil?
38
38
  answer = parse_string(default, scope) if answer.nil? and default.is_a?(String)
39
39
  answer = default if answer.nil?
40
-
41
- CORL::Config.set_property(key, answer) # This is why we override this function!!
40
+
41
+ # This is why we override this method!!
42
+ # TODO: Submit a patch that allows for some kind of hook into the process.
43
+ if CORL::Config.get_property(key).nil? || answer
44
+ CORL::Config.set_property(key, answer)
45
+ end
42
46
  return answer
43
47
  end
44
48
  end
@@ -159,13 +159,8 @@ class CloudAction < CORL.plugin_class(:action)
159
159
  end
160
160
 
161
161
  # Load network if it exists
162
- network_config = extended_config(:network, { :directory => network_path, :name => network_path })
163
-
164
- network = CORL.network(
165
- CORL.sha1(network_config),
166
- network_config,
167
- settings[:net_provider]
168
- )
162
+ network_config = extended_config(:network, { :directory => network_path })
163
+ network = CORL.network(network_path, network_config, settings[:net_provider])
169
164
  network
170
165
  end
171
166
 
@@ -32,6 +32,12 @@ class Configuration < CORL.plugin_class(:base)
32
32
 
33
33
  set_location(@project)
34
34
  end
35
+
36
+ #---
37
+
38
+ def remove_plugin
39
+ CORL.remove_plugin(@project)
40
+ end
35
41
 
36
42
  #-----------------------------------------------------------------------------
37
43
  # Checks
@@ -3,7 +3,7 @@ module Nucleon
3
3
  module Plugin
4
4
  class Network < CORL.plugin_class(:base)
5
5
 
6
- init_plugin_collection
6
+ init_plugin_collection(:add_node, :batch)
7
7
 
8
8
  #-----------------------------------------------------------------------------
9
9
  # Cloud plugin interface
@@ -17,6 +17,16 @@ class Network < CORL.plugin_class(:base)
17
17
  ignore('build')
18
18
  end
19
19
 
20
+ #---
21
+
22
+ def remove_plugin
23
+ CORL.remove_plugin(config)
24
+
25
+ each_plugin do |type, provider, name, plugin|
26
+ CORL.remove_plugin(plugin)
27
+ end
28
+ end
29
+
20
30
  #-----------------------------------------------------------------------------
21
31
  # Checks
22
32
 
@@ -226,8 +236,6 @@ class Network < CORL.plugin_class(:base)
226
236
 
227
237
  #---
228
238
 
229
- execute_block_on_receiver :add_node
230
-
231
239
  def add_node(provider, name, options = {})
232
240
  config = Config.ensure(options)
233
241
 
@@ -247,7 +255,7 @@ class Network < CORL.plugin_class(:base)
247
255
  })
248
256
 
249
257
  # Set node data
250
- node = set_node(provider, name, node_options)
258
+ node = set_node(provider, name, node_options)
251
259
  hook_config = { :node => node, :remote => remote_name, :config => config }
252
260
  success = true
253
261
 
@@ -260,50 +268,86 @@ class Network < CORL.plugin_class(:base)
260
268
  end
261
269
 
262
270
  if success && node.save({ :remote => remote_name, :message => "Created machine #{name} on #{provider}" })
263
- # Bootstrap new machine
264
- success = node.bootstrap(home, extended_config(:bootstrap, config)) do |op, data|
265
- block_given? ? yield("bootstrap_#{op}".to_sym, data) : data
266
- end
271
+ success = init_node(node, config.defaults({ :bootstrap => true, :seed => true })) do |op, data|
272
+ block_given? ? yield(op, data) : data
273
+ end
274
+ end
275
+ end
276
+ success
277
+ end
278
+
279
+ #---
280
+
281
+ def init_node(node, options = {})
282
+ config = Config.ensure(options)
283
+ success = true
284
+
285
+ bootstrap = config.delete(:bootstrap, false)
286
+ seed = config.delete(:seed, false)
287
+
288
+ unless node.cache_setting(:initialized)
289
+ bootstrap = true
290
+ seed = true
291
+ end
292
+
293
+ provision = config.delete(:provision, true)
294
+
295
+ if bootstrap
296
+ # Bootstrap machine
297
+ success = node.bootstrap(home, extended_config(:bootstrap, config)) do |op, data|
298
+ block_given? ? yield("bootstrap_#{op}".to_sym, data) : data
299
+ end
300
+ end
267
301
 
268
- if success
269
- seed_project = config.get(:project_reference, nil)
270
- save_config = { :commit => true, :remote => remote_name, :push => true }
302
+ if success
303
+ if seed
304
+ seed_project = config.get(:project_reference, nil)
305
+ save_config = { :commit => true, :remote => remote_name, :push => true }
271
306
 
272
- if seed_project && remote_name
273
- # Reset project remote
274
- seed_info = Plugin::Project.translate_reference(seed_project)
307
+ if seed_project && remote_name
308
+ # Reset project remote
309
+ seed_info = Plugin::Project.translate_reference(seed_project)
275
310
 
276
- if seed_info
277
- seed_url = seed_info[:url]
278
- seed_branch = seed_info[:revision] if seed_info[:revision]
279
- else
280
- seed_url = seed_project
281
- end
282
- set_remote(:origin, seed_url) if remote_name.to_sym == :edit
283
- set_remote(remote_name, seed_url)
284
- save_config[:pull] = false
311
+ if seed_info
312
+ seed_url = seed_info[:url]
313
+ seed_branch = seed_info[:revision] if seed_info[:revision]
314
+ else
315
+ seed_url = seed_project
285
316
  end
317
+ set_remote(:origin, seed_url) if remote_name.to_sym == :edit
318
+ set_remote(remote_name, seed_url)
319
+ save_config[:pull] = false
320
+ end
286
321
 
287
- # Save network changes (preliminary)
288
- success = node.save(extended_config(:node_save, save_config))
322
+ # Save network changes (preliminary)
323
+ success = node.save(extended_config(:node_save, save_config))
289
324
 
290
- if success && seed_project
291
- # Seed machine with remote project reference
292
- result = node.seed({
293
- :project_reference => seed_project,
294
- :project_branch => seed_branch
295
- }) do |op, data|
296
- yield("seed_#{op}".to_sym, data)
297
- end
298
- success = result.status == code.success
325
+ if success && seed_project
326
+ # Seed machine with remote project reference
327
+ result = node.seed({
328
+ :project_reference => seed_project,
329
+ :project_branch => seed_branch
330
+ }) do |op, data|
331
+ yield("seed_#{op}".to_sym, data)
299
332
  end
300
-
301
- # Update local network project
302
- success = load({ :remote => remote_name, :pull => true }) if success
333
+ success = result.status == code.success
303
334
  end
304
335
  end
305
- end
306
- success
336
+
337
+ node.set_cache_setting(:initialized, true) if success
338
+
339
+ if success && provision
340
+ # Run configured provisioners on machine
341
+ result = node.provision(config) do |op, data|
342
+ yield("provision_#{op}".to_sym, data)
343
+ end
344
+ success = result.status == code.success
345
+ end
346
+
347
+ # Update local network project
348
+ success = load({ :remote => remote_name, :pull => true }) if success
349
+ end
350
+ success
307
351
  end
308
352
 
309
353
  #-----------------------------------------------------------------------------
@@ -321,8 +365,6 @@ class Network < CORL.plugin_class(:base)
321
365
 
322
366
  #---
323
367
 
324
- execute_block_on_receiver :batch
325
-
326
368
  def batch(node_references, default_provider = nil, parallel = true, &code)
327
369
  success = true
328
370
 
@@ -330,7 +372,7 @@ class Network < CORL.plugin_class(:base)
330
372
  # Execute action on selected nodes
331
373
  nodes = nodes_by_reference(node_references, default_provider)
332
374
 
333
- if parallel
375
+ if CORL.parallel? && parallel
334
376
  values = []
335
377
  nodes.each do |node|
336
378
  values << Celluloid::Future.new(node, &code)
@@ -3,7 +3,8 @@ module Nucleon
3
3
  module Plugin
4
4
  class Node < CORL.plugin_class(:base)
5
5
 
6
- include Celluloid
6
+ include Parallel
7
+ external_block_exec :exec, :command, :action
7
8
 
8
9
  #-----------------------------------------------------------------------------
9
10
  # Node plugin interface
@@ -56,6 +57,13 @@ class Node < CORL.plugin_class(:base)
56
57
  @local_context = true
57
58
  myself.local_machine = create_machine(:local_machine, :physical)
58
59
  end
60
+
61
+ #---
62
+
63
+ def remove_plugin
64
+ CORL.remove_plugin(local_machine) if local_machine
65
+ CORL.remove_plugin(machine) if machine
66
+ end
59
67
 
60
68
  #-----------------------------------------------------------------------------
61
69
  # Checks
@@ -567,8 +575,6 @@ class Node < CORL.plugin_class(:base)
567
575
 
568
576
  #---
569
577
 
570
- execute_block_on_receiver :exec
571
-
572
578
  def exec(options = {})
573
579
  default_error = Util::Shell::Result.new(:error, 255)
574
580
  results = [ default_error ]
@@ -636,8 +642,6 @@ class Node < CORL.plugin_class(:base)
636
642
 
637
643
  #---
638
644
 
639
- execute_block_on_receiver :command
640
-
641
645
  def command(command, options = {})
642
646
  config = Config.ensure(options)
643
647
  as_admin = config.delete(:as_admin, false)
@@ -654,14 +658,14 @@ class Node < CORL.plugin_class(:base)
654
658
 
655
659
  results = exec({ :commands => [ "#{admin_command} #{command.to_s}".strip ] }) do |op, data|
656
660
  yield(op, data) if block_given?
657
- end
661
+ end
662
+
663
+ CORL.remove_plugin(command)
658
664
  results.first
659
665
  end
660
666
 
661
667
  #---
662
668
 
663
- execute_block_on_receiver :action
664
-
665
669
  def action(provider, options = {})
666
670
  codes :network_load_error
667
671
 
@@ -3,7 +3,7 @@ module Nucleon
3
3
  module Plugin
4
4
  class Provisioner < CORL.plugin_class(:base)
5
5
 
6
- include Celluloid
6
+ include Parallel
7
7
 
8
8
  #-----------------------------------------------------------------------------
9
9
  # Provisioner plugin interface
@@ -105,25 +105,25 @@ class Provisioner < CORL.plugin_class(:base)
105
105
  #---
106
106
 
107
107
  def build_locations(reset = false)
108
- locations = hash(myself[:build_locations])
108
+ locations = cache_setting(:build_locations, {}, :hash)
109
109
  build if reset || locations.empty?
110
- myself[:build_locations]
110
+ cache_setting(:build_locations, {}, :hash)
111
111
  end
112
112
 
113
113
  #---
114
114
 
115
115
  def build_info(reset = false)
116
- info = hash(myself[:build_info])
116
+ info = cache_setting(:build_info, {}, :hash)
117
117
  build if reset || info.empty?
118
- myself[:build_info]
118
+ cache_setting(:build_info, {}, :hash)
119
119
  end
120
120
 
121
121
  #---
122
122
 
123
123
  def build_profiles(reset = false)
124
- profiles = array(myself[:build_profiles])
124
+ profiles = cache_setting(:build_profiles, [], :array)
125
125
  build if reset || profiles.empty?
126
- myself[:build_profiles]
126
+ cache_setting(:build_profiles, [], :array)
127
127
  end
128
128
 
129
129
  #-----------------------------------------------------------------------------
@@ -196,17 +196,10 @@ class Provisioner < CORL.plugin_class(:base)
196
196
  success = yield(locations, package_info) if block_given?
197
197
 
198
198
  if success
199
- # Save the updates (should build the same on all nodes in same system)
200
- myself[:build_locations] = locations.export
201
- myself[:build_info] = package_info.get([ :provisioners, plugin_provider ])
202
- myself[:build_profiles] = find_profiles
203
-
204
- success = network.save(config.import({
205
- :commit => true,
206
- :allow_empty => true,
207
- :message => config.get(:message, "Built #{plugin_provider} provisioner #{plugin_name}"),
208
- :remote => config.get(:remote, :edit)
209
- }))
199
+ # Save the updates in the local project cache
200
+ set_cache_setting(:build_locations, locations.export)
201
+ set_cache_setting(:build_info, package_info.get([ :provisioners, plugin_provider ]))
202
+ set_cache_setting(:build_profiles, find_profiles)
210
203
  end
211
204
  end
212
205
  success
@@ -270,10 +270,10 @@ module Puppet
270
270
  value = puppet_scope.lookupvar("::#{search_property_name}")
271
271
  Config.debug_lookup(config, search_property_name, value, "Puppet override lookup")
272
272
 
273
- break unless Util::Data.undef?(value)
273
+ break unless value.nil?
274
274
  end
275
275
  end
276
- if Util::Data.undef?(value)
276
+ if value.nil?
277
277
  components = property.to_s.split('::')
278
278
 
279
279
  if components.length > 1
@@ -284,7 +284,7 @@ module Puppet
284
284
  Config.debug_lookup(config, search_property_name, value, "Puppet default lookup")
285
285
  end
286
286
  end
287
- if Util::Data.undef?(value) && search_name
287
+ if value.nil? && search_name
288
288
  value = puppet_scope.lookupvar("::#{property}")
289
289
  Config.debug_lookup(config, property, value, "Puppet name lookup")
290
290
  end
@@ -0,0 +1,39 @@
1
+
2
+ module VagrantPlugins
3
+ module CORL
4
+ class BaseAction
5
+
6
+ #-----------------------------------------------------------------------------
7
+ # Constructor / Destructor
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ @env = env[:machine].env
12
+
13
+ @network = nil
14
+ @node = nil
15
+ @vm = nil
16
+ end
17
+
18
+ #-----------------------------------------------------------------------------
19
+ # Property accessor / modifiers
20
+
21
+ attr_reader :network, :node, :vm
22
+
23
+ #-----------------------------------------------------------------------------
24
+ # Action execution
25
+
26
+ def call(env)
27
+ # Hackish solution to ensure our code has access to Vagrant machines.
28
+ # This serves as a Vagrant VM manager.
29
+ ::CORL::Vagrant.command = Command::Launcher.new([], @env)
30
+
31
+ if @network = ::CORL::Vagrant::Config.load_network(env[:root_path])
32
+ @vm = env[:machine]
33
+ @node = network.node(:vagrant, @vm.name) if @vm
34
+ yield if block_given? && @node
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module VagrantPlugins
3
+ module CORL
4
+ module Action
5
+ class CreateShares < BaseAction
6
+
7
+ def call(env)
8
+ super do
9
+ env[:ui].info I18n.t("corl.vagrant.actions.create_shares.start")
10
+
11
+ vm.communicate.tap do |comm|
12
+ # TODO: Figure out a better solution for remote network path.
13
+ # Needs to work before facter and corl are installed
14
+ # Local searches of remote configurations in the project perhaps?
15
+ network_path = ::CORL::Config.fact(:corl_network)
16
+
17
+ # Make sure the CORL network directory is properly set up
18
+ # Vagrant root (project) directory is shared by default
19
+ comm.sudo("rm -Rf #{network_path}")
20
+ comm.sudo("ln -s /vagrant #{network_path}")
21
+ end
22
+ @app.call env
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module VagrantPlugins
3
+ module CORL
4
+ module Action
5
+ class DeleteCache < BaseAction
6
+
7
+ def call(env)
8
+ super do
9
+ @app.call env
10
+
11
+ env[:ui].info I18n.t("corl.vagrant.actions.delete_cache.start")
12
+ node.clear_cache
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module VagrantPlugins
3
+ module CORL
4
+ module Action
5
+ class InitKeys < BaseAction
6
+
7
+ def call(env)
8
+ super do
9
+ env[:ui].info I18n.t("corl.vagrant.actions.init_keys.start")
10
+
11
+ if node.public_key
12
+ ssh_key = ::CORL::Util::Disk.read(node.public_key)
13
+
14
+ if ssh_key && ! ssh_key.empty?
15
+ vm.communicate.tap do |comm|
16
+ comm.execute("echo '#{ssh_key}' > \$HOME/.ssh/authorized_keys")
17
+ end
18
+ node.set_cache_setting(:use_private_key, true)
19
+ node.machine.load
20
+ end
21
+ end
22
+ @app.call env
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -4,7 +4,7 @@ module CORL
4
4
  module Command
5
5
  class Launcher < ::Vagrant.plugin("2", :command)
6
6
 
7
- include Celluloid
7
+ include ::CORL::Parallel # Mainly for auto locking of resources
8
8
 
9
9
  #-----------------------------------------------------------------------------
10
10
 
@@ -24,7 +24,7 @@ class Launcher < ::Vagrant.plugin("2", :command)
24
24
 
25
25
  def execute
26
26
  # Set the base command so we can access in any actions executed
27
- ::CORL::Vagrant.command = current_actor
27
+ ::CORL::Vagrant.command = ::CORL.handle(self)
28
28
  ::CORL.executable(@argv - [ "--" ], "vagrant corl")
29
29
  end
30
30
 
@@ -81,11 +81,9 @@ module Config
81
81
  end
82
82
 
83
83
  # Provisioner configuration
84
- unless configure_provisioner(network, node, machine)
84
+ unless configure_provisioner(network, node, machine, &code)
85
85
  raise "Configuration of Vagrant provisioner failed: #{node_name}"
86
86
  end
87
-
88
- code.call(network, node, machine) if code
89
87
  end
90
88
  end
91
89
  end
@@ -95,10 +93,7 @@ module Config
95
93
 
96
94
  def self.load_network(directory)
97
95
  # Load network if it exists
98
- CORL.network(
99
- :vagrant,
100
- CORL.config(:vagrant_network, { :directory => directory, :name => directory })
101
- )
96
+ @@network = CORL.network(directory, CORL.config(:vagrant_network, { :directory => directory }))
102
97
  end
103
98
 
104
99
  #---
@@ -272,14 +267,15 @@ module Config
272
267
 
273
268
  #---
274
269
 
275
- def self.configure_provisioner(network, node, machine)
270
+ def self.configure_provisioner(network, node, machine, &code)
276
271
  success = true
277
272
 
278
273
  # CORL provisioning
279
274
  machine.vm.provision :corl do |provisioner|
280
- provisioner.network_path = CORL::Config.fact(:corl_network)
281
- provisioner.network = network
282
- provisioner.node = node
275
+ provisioner.network = network
276
+ provisioner.node = node
277
+
278
+ code.call(node, machine, provisioner) if code
283
279
  end
284
280
  success
285
281
  end