corl 0.4.16 → 0.4.17

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