corl 0.4.1 → 0.4.2
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/.gitmodules +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +15 -8
- data/VERSION +1 -1
- data/bootstrap/os/ubuntu/00_base.sh +10 -1
- data/bootstrap/os/ubuntu/05_ruby.sh +6 -0
- data/bootstrap/os/ubuntu/06_puppet.sh +6 -6
- data/bootstrap/os/ubuntu/09_nucleon.sh +14 -0
- data/bootstrap/os/ubuntu/10_corl.sh +7 -2
- data/corl.gemspec +16 -9
- data/lib/CORL/action/authorize.rb +57 -0
- data/lib/CORL/action/bootstrap.rb +5 -0
- data/lib/CORL/action/destroy.rb +64 -0
- data/lib/CORL/action/exec.rb +9 -0
- data/lib/CORL/action/image.rb +39 -7
- data/lib/CORL/action/images.rb +4 -3
- data/lib/CORL/action/lookup.rb +2 -2
- data/lib/CORL/action/regions.rb +51 -0
- data/lib/CORL/action/seed.rb +1 -1
- data/lib/CORL/action/spawn.rb +8 -9
- data/lib/CORL/action/ssh.rb +74 -0
- data/lib/CORL/action/start.rb +37 -5
- data/lib/CORL/action/stop.rb +37 -5
- data/lib/CORL/configuration/file.rb +34 -7
- data/lib/CORL/event/puppet.rb +1 -1
- data/lib/CORL/machine/aws.rb +153 -0
- data/lib/CORL/machine/physical.rb +14 -5
- data/lib/CORL/machine/rackspace.rb +58 -0
- data/lib/CORL/network/default.rb +1 -1
- data/lib/CORL/node/aws.rb +40 -16
- data/lib/CORL/node/local.rb +4 -3
- data/lib/CORL/node/rackspace.rb +25 -7
- data/lib/CORL/provisioner/puppetnode.rb +11 -9
- data/lib/core/errors.rb +6 -0
- data/lib/core/mod/fog_aws_server.rb +38 -0
- data/lib/core/plugin/action.rb +3 -11
- data/lib/core/plugin/configuration.rb +20 -2
- data/lib/{CORL/machine/fog.rb → core/plugin/fog_machine.rb} +92 -92
- data/lib/core/plugin/{fog.rb → fog_node.rb} +20 -7
- data/lib/core/plugin/machine.rb +58 -37
- data/lib/core/plugin/network.rb +76 -111
- data/lib/core/plugin/node.rb +271 -87
- data/lib/core/plugin/provisioner.rb +1 -1
- data/lib/corl.rb +6 -14
- data/locales/en.yml +18 -1
- metadata +39 -32
- data/lib/CORL/node/google.rb +0 -111
- data/lib/core/util/ssh.rb +0 -286
data/lib/core/plugin/node.rb
CHANGED
@@ -8,27 +8,38 @@ class Node < CORL.plugin_class(:base)
|
|
8
8
|
#-----------------------------------------------------------------------------
|
9
9
|
# Node plugin interface
|
10
10
|
|
11
|
-
def normalize
|
11
|
+
def normalize(reload)
|
12
12
|
super
|
13
13
|
|
14
|
+
export.each do |name, value|
|
15
|
+
myself[name] = value
|
16
|
+
end
|
17
|
+
|
18
|
+
yield if block_given? # Chance to create a machine to feed hostname
|
19
|
+
|
14
20
|
ui.resource = hostname
|
15
21
|
logger = hostname
|
16
22
|
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
myself[:groups] = [ "all", plugin_provider.to_s, plugin_name.to_s ] | groups
|
24
|
+
|
25
|
+
unless reload
|
26
|
+
@cli_interface = Util::Liquid.new do |method, args, &code|
|
27
|
+
result = exec({ :commands => [ [ method, args ].flatten.join(' ') ] }) do |op, data|
|
28
|
+
code.call(op, data) if code
|
29
|
+
end
|
30
|
+
if result
|
31
|
+
result = result.first
|
32
|
+
alert(result.errors) unless result.errors.empty?
|
33
|
+
end
|
34
|
+
result
|
20
35
|
end
|
21
|
-
result = result.first
|
22
|
-
|
23
|
-
alert(result.errors) unless result.errors.empty?
|
24
|
-
result
|
25
|
-
end
|
26
36
|
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
@action_interface = Util::Liquid.new do |method, args, &code|
|
38
|
+
action(method, *args) do |op, data|
|
39
|
+
code.call(op, data) if code
|
40
|
+
end
|
30
41
|
end
|
31
|
-
end
|
42
|
+
end
|
32
43
|
end
|
33
44
|
|
34
45
|
#---
|
@@ -103,7 +114,7 @@ class Node < CORL.plugin_class(:base)
|
|
103
114
|
#-----------------------------------------------------------------------------
|
104
115
|
|
105
116
|
def groups
|
106
|
-
array(
|
117
|
+
array(myself[:groups])
|
107
118
|
end
|
108
119
|
|
109
120
|
#-----------------------------------------------------------------------------
|
@@ -129,33 +140,38 @@ class Node < CORL.plugin_class(:base)
|
|
129
140
|
#---
|
130
141
|
|
131
142
|
def id(reset = false)
|
132
|
-
myself[:id] = machine.plugin_name if reset || myself[:id].nil?
|
143
|
+
myself[:id] = machine.plugin_name if machine && ( reset || myself[:id].nil? )
|
133
144
|
myself[:id]
|
134
145
|
end
|
135
|
-
|
146
|
+
|
136
147
|
#---
|
137
148
|
|
138
149
|
def public_ip(reset = false)
|
139
|
-
myself[:public_ip] = machine.public_ip if reset || myself[:public_ip].nil?
|
150
|
+
myself[:public_ip] = machine.public_ip if machine && ( reset || myself[:public_ip].nil? )
|
140
151
|
myself[:public_ip]
|
141
152
|
end
|
142
153
|
|
143
154
|
def private_ip(reset = false)
|
144
|
-
myself[:private_ip] = machine.private_ip if reset || myself[:private_ip].nil?
|
155
|
+
myself[:private_ip] = machine.private_ip if machine && ( reset || myself[:private_ip].nil? )
|
145
156
|
myself[:private_ip]
|
146
157
|
end
|
147
158
|
|
148
159
|
#---
|
149
160
|
|
150
|
-
def hostname
|
151
|
-
|
152
|
-
|
161
|
+
def hostname
|
162
|
+
hostname = myself[:hostname]
|
163
|
+
|
164
|
+
if hostname.to_s != ui.resource.to_s
|
165
|
+
ui.resource = hostname
|
166
|
+
logger = hostname
|
167
|
+
end
|
168
|
+
hostname
|
153
169
|
end
|
154
170
|
|
155
171
|
#---
|
156
172
|
|
157
173
|
def state(reset = false)
|
158
|
-
myself[:state] = machine.state if reset || myself[:state].nil?
|
174
|
+
myself[:state] = machine.state if machine && ( reset || myself[:state].nil? )
|
159
175
|
myself[:state]
|
160
176
|
end
|
161
177
|
|
@@ -173,6 +189,7 @@ class Node < CORL.plugin_class(:base)
|
|
173
189
|
|
174
190
|
def ssh_port=ssh_port
|
175
191
|
myself[:ssh_port] = ssh_port
|
192
|
+
machine.init_ssh(ssh_port) if machine
|
176
193
|
end
|
177
194
|
|
178
195
|
def ssh_port
|
@@ -191,6 +208,13 @@ class Node < CORL.plugin_class(:base)
|
|
191
208
|
|
192
209
|
#---
|
193
210
|
|
211
|
+
def ssh_path(home_env_var = 'HOME', reset = false)
|
212
|
+
home = home(home_env_var, reset)
|
213
|
+
home ? File.join(home, '.ssh') : nil
|
214
|
+
end
|
215
|
+
|
216
|
+
#---
|
217
|
+
|
194
218
|
def private_key=private_key
|
195
219
|
myself[:private_key] = private_key
|
196
220
|
end
|
@@ -208,7 +232,7 @@ class Node < CORL.plugin_class(:base)
|
|
208
232
|
end
|
209
233
|
|
210
234
|
def public_key
|
211
|
-
config_key = myself[:
|
235
|
+
config_key = myself[:public_key]
|
212
236
|
return File.expand_path(config_key) if config_key
|
213
237
|
end
|
214
238
|
|
@@ -217,20 +241,16 @@ class Node < CORL.plugin_class(:base)
|
|
217
241
|
def machine_types # Must be set at machine level (queried)
|
218
242
|
machine.machine_types if machine
|
219
243
|
end
|
220
|
-
|
221
|
-
def machine_type=machine_type
|
222
|
-
myself[:machine_type] = machine_type
|
223
|
-
end
|
224
244
|
|
225
245
|
def machine_type(reset = false)
|
226
|
-
myself[:machine_type] = machine.machine_type if reset || myself[:machine_type].nil?
|
227
|
-
machine_type
|
246
|
+
myself[:machine_type] = machine.machine_type if machine && ( reset || myself[:machine_type].nil? )
|
247
|
+
machine_type = myself[:machine_type]
|
228
248
|
|
229
249
|
if machine_type.nil? && machine
|
230
250
|
if types = machine_types
|
231
251
|
unless types.empty?
|
232
|
-
machine_type
|
233
|
-
myself
|
252
|
+
machine_type = machine_type_id(types.first)
|
253
|
+
myself[:machine_type] = machine_type
|
234
254
|
end
|
235
255
|
end
|
236
256
|
end
|
@@ -284,7 +304,7 @@ class Node < CORL.plugin_class(:base)
|
|
284
304
|
end
|
285
305
|
|
286
306
|
def image(reset = false)
|
287
|
-
myself[:image] = machine.image if reset || myself[:image].nil?
|
307
|
+
myself[:image] = machine.image if machine && ( reset || myself[:image].nil? )
|
288
308
|
myself[:image]
|
289
309
|
end
|
290
310
|
|
@@ -303,6 +323,71 @@ class Node < CORL.plugin_class(:base)
|
|
303
323
|
#-----------------------------------------------------------------------------
|
304
324
|
# Machine operations
|
305
325
|
|
326
|
+
def attach_keys(keypair)
|
327
|
+
base_name = "#{plugin_provider}-#{plugin_name}"
|
328
|
+
save_config = {
|
329
|
+
:pull => false,
|
330
|
+
:push => false,
|
331
|
+
:message => "Updating SSH keys for node #{plugin_provider} (#{plugin_name})"
|
332
|
+
}
|
333
|
+
|
334
|
+
active = machine && machine.running?
|
335
|
+
result = run.authorize({ :public_key => keypair.ssh_key }) if active
|
336
|
+
success = false
|
337
|
+
|
338
|
+
if ! active || result.status == code.success
|
339
|
+
private_key = network.attach_data(:keys, "#{base_name}-id_#{keypair.type}", keypair.encrypted_key)
|
340
|
+
public_key = network.attach_data(:keys, "#{base_name}-id_#{keypair.type}.pub", keypair.ssh_key)
|
341
|
+
|
342
|
+
if private_key && public_key
|
343
|
+
FileUtils.chmod(0600, private_key)
|
344
|
+
FileUtils.chmod(0644, public_key)
|
345
|
+
|
346
|
+
save_config[:files] = [ private_key, public_key ]
|
347
|
+
|
348
|
+
myself.private_key = private_key
|
349
|
+
myself.public_key = public_key
|
350
|
+
|
351
|
+
success = save(extended_config(:key_save, save_config))
|
352
|
+
end
|
353
|
+
end
|
354
|
+
success
|
355
|
+
end
|
356
|
+
|
357
|
+
#---
|
358
|
+
|
359
|
+
def delete_keys
|
360
|
+
private_key = myself[:private_key]
|
361
|
+
public_key = myself[:public_key]
|
362
|
+
|
363
|
+
keys = []
|
364
|
+
keys << private_key if private_key
|
365
|
+
keys << public_key if public_key
|
366
|
+
|
367
|
+
success = true
|
368
|
+
|
369
|
+
unless keys.empty?
|
370
|
+
files = network.delete_attachments(keys)
|
371
|
+
|
372
|
+
if files && ! files.empty?
|
373
|
+
delete_setting(:private_key)
|
374
|
+
delete_setting(:public_key)
|
375
|
+
|
376
|
+
success = save(extended_config(:key_delete, {
|
377
|
+
:files => [ private_key, public_key ],
|
378
|
+
:pull => false,
|
379
|
+
:push => false,
|
380
|
+
:message => "Removing SSH keys for node #{plugin_provider} (#{plugin_name})"
|
381
|
+
}))
|
382
|
+
else
|
383
|
+
success = false
|
384
|
+
end
|
385
|
+
end
|
386
|
+
success
|
387
|
+
end
|
388
|
+
|
389
|
+
#---
|
390
|
+
|
306
391
|
def create_machine(name, provider, options = {})
|
307
392
|
CORL.create_plugin(:machine, provider, extended_config(name, options).import({ :meta => { :parent => myself }}))
|
308
393
|
end
|
@@ -447,6 +532,8 @@ class Node < CORL.plugin_class(:base)
|
|
447
532
|
|
448
533
|
#---
|
449
534
|
|
535
|
+
execute_block_on_receiver :exec
|
536
|
+
|
450
537
|
def exec(options = {})
|
451
538
|
results = nil
|
452
539
|
|
@@ -458,26 +545,33 @@ class Node < CORL.plugin_class(:base)
|
|
458
545
|
|
459
546
|
yield(:config, config) if block_given?
|
460
547
|
|
461
|
-
|
548
|
+
if local? && local_machine
|
549
|
+
active_machine = local_machine
|
550
|
+
|
551
|
+
config[:info_prefix] = "[#{hostname}] "
|
552
|
+
config[:error_prefix] = "[#{hostname}] "
|
553
|
+
else
|
554
|
+
active_machine = machine
|
555
|
+
end
|
462
556
|
|
463
557
|
if commands = config.get(:commands, nil)
|
464
|
-
render("Starting command execution: #{commands.join('; ')}")
|
465
558
|
results = active_machine.exec(commands, config.export) do |type, command, data|
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
559
|
+
unless local?
|
560
|
+
if type == :error
|
561
|
+
alert(data.gsub(/^\[[^\]]+\]\s*/, ''))
|
562
|
+
else
|
563
|
+
render(data.gsub(/^\[[^\]]+\]\s*/, ''))
|
564
|
+
end
|
470
565
|
end
|
471
|
-
yield(:progress, { :type => type, :command => command, :data => data })
|
566
|
+
yield(:progress, { :type => type, :command => command, :data => data }) if block_given?
|
472
567
|
end
|
473
568
|
end
|
474
569
|
|
475
570
|
success = true
|
476
571
|
results.each do |result|
|
477
|
-
success = false if result.status !=
|
572
|
+
success = false if result.status != code.success
|
478
573
|
end
|
479
574
|
if success
|
480
|
-
render("Successfully finished execution")
|
481
575
|
yield(:process, config) if block_given?
|
482
576
|
extension(:exec_success, { :config => config, :results => results })
|
483
577
|
end
|
@@ -496,11 +590,23 @@ class Node < CORL.plugin_class(:base)
|
|
496
590
|
|
497
591
|
#---
|
498
592
|
|
593
|
+
execute_block_on_receiver :command
|
594
|
+
|
499
595
|
def command(command, options = {})
|
596
|
+
config = Config.ensure(options)
|
597
|
+
as_admin = config.delete(:as_admin, false)
|
598
|
+
|
500
599
|
unless command.is_a?(CORL::Plugin::Command)
|
501
|
-
command = CORL.command(Config.new({ :command => command }).import(
|
600
|
+
command = CORL.command(Config.new({ :command => command }).import(config), :bash)
|
502
601
|
end
|
503
|
-
|
602
|
+
|
603
|
+
admin_command = ''
|
604
|
+
if as_admin
|
605
|
+
admin_command = 'sudo' if user.to_s == 'ubuntu'
|
606
|
+
admin_command = extension_set(:admin_command, admin_command, config)
|
607
|
+
end
|
608
|
+
|
609
|
+
results = exec({ :commands => [ "#{admin_command} #{command.to_s}".strip ] }) do |op, data|
|
504
610
|
yield(op, data) if block_given?
|
505
611
|
end
|
506
612
|
results.first
|
@@ -508,19 +614,34 @@ class Node < CORL.plugin_class(:base)
|
|
508
614
|
|
509
615
|
#---
|
510
616
|
|
617
|
+
execute_block_on_receiver :action
|
618
|
+
|
511
619
|
def action(provider, options = {})
|
512
|
-
|
513
|
-
|
620
|
+
codes :network_load_error
|
621
|
+
|
622
|
+
config = Config.ensure(options).defaults({
|
623
|
+
:log_level => Nucleon.log_level,
|
624
|
+
:net_remote => :edit,
|
625
|
+
:net_provider => network.plugin_provider
|
626
|
+
})
|
514
627
|
|
515
628
|
logger.info("Executing remote action #{provider} with encoded arguments: #{config.export.inspect}")
|
516
629
|
|
517
|
-
|
630
|
+
encoded_config = Util::CLI.encode(Util::Data.clean(config.export))
|
631
|
+
action_config = extended_config(:action, {
|
518
632
|
:command => provider,
|
519
633
|
:data => { :encoded => encoded_config }
|
520
634
|
})
|
521
|
-
|
635
|
+
|
636
|
+
result = command(:corl, { :subcommand => action_config, :as_admin => true }) do |op, data|
|
522
637
|
yield(op, data) if block_given?
|
523
|
-
end
|
638
|
+
end
|
639
|
+
|
640
|
+
# Update local network configuration so we capture any updates
|
641
|
+
if result.status == code.success && ! network.load({ :remote => config[:net_remote], :pull => true })
|
642
|
+
result.status = code.network_load_error
|
643
|
+
end
|
644
|
+
result
|
524
645
|
end
|
525
646
|
|
526
647
|
#---
|
@@ -529,6 +650,40 @@ class Node < CORL.plugin_class(:base)
|
|
529
650
|
@action_interface
|
530
651
|
end
|
531
652
|
|
653
|
+
#---
|
654
|
+
|
655
|
+
def terminal(options = {})
|
656
|
+
myself.status = code.unknown_status
|
657
|
+
|
658
|
+
if machine && machine.running?
|
659
|
+
config = Config.ensure(options)
|
660
|
+
|
661
|
+
if extension_check(:terminal, { :config => config })
|
662
|
+
logger.info("Launching terminal for node: #{plugin_name}")
|
663
|
+
|
664
|
+
if local? && local_machine
|
665
|
+
active_machine = local_machine
|
666
|
+
|
667
|
+
config[:info_prefix] = "[#{hostname}] "
|
668
|
+
config[:error_prefix] = "[#{hostname}] "
|
669
|
+
else
|
670
|
+
active_machine = machine
|
671
|
+
end
|
672
|
+
|
673
|
+
config[:private_keys] = private_key
|
674
|
+
|
675
|
+
myself.status = active_machine.terminal(user, config.export)
|
676
|
+
|
677
|
+
if status == code.success
|
678
|
+
extension(:exec_success, { :config => config })
|
679
|
+
end
|
680
|
+
end
|
681
|
+
else
|
682
|
+
logger.warn("Node #{plugin_name} does not have an attached machine or is not running so cannot launch terminal")
|
683
|
+
end
|
684
|
+
status == code.success
|
685
|
+
end
|
686
|
+
|
532
687
|
#---
|
533
688
|
|
534
689
|
def bootstrap(local_path, options = {})
|
@@ -547,14 +702,15 @@ class Node < CORL.plugin_class(:base)
|
|
547
702
|
:home_path_lookup_failure,
|
548
703
|
:auth_upload_failure,
|
549
704
|
:bootstrap_upload_failure,
|
550
|
-
:bootstrap_exec_failure
|
705
|
+
:bootstrap_exec_failure,
|
706
|
+
:reload_failure
|
551
707
|
|
552
708
|
if File.directory?(local_path)
|
553
709
|
if user_home || user_home = home(config.get(:home_env_var, 'HOME'), config.get(:force, false))
|
554
710
|
myself.status = code.success
|
555
711
|
|
556
712
|
# Transmit authorisation / credential files
|
557
|
-
package_files = [ '.fog', '.netrc', '.google-privatekey.p12' ]
|
713
|
+
package_files = [ '.fog', '.netrc', '.google-privatekey.p12', '.vimrc' ]
|
558
714
|
auth_files.each do |file|
|
559
715
|
package_files = file.gsub(local_path + '/', '')
|
560
716
|
end
|
@@ -581,16 +737,24 @@ class Node < CORL.plugin_class(:base)
|
|
581
737
|
|
582
738
|
# Execute bootstrap process
|
583
739
|
if status == code.success
|
584
|
-
remote_script = File.join(remote_bootstrap_path, bootstrap_init)
|
740
|
+
remote_script = File.join(remote_bootstrap_path, bootstrap_init)
|
741
|
+
|
742
|
+
myself[:bootstrap] = remote_script
|
585
743
|
|
586
|
-
result = command(remote_script) do |op, data|
|
744
|
+
result = command("HOSTNAME='#{hostname}' #{remote_script}", { :as_admin => true }) do |op, data|
|
587
745
|
yield("exec_#{op}".to_sym, data) if block_given?
|
588
746
|
data
|
589
747
|
end
|
590
748
|
|
591
|
-
if result.status
|
749
|
+
if result.status == code.success
|
750
|
+
# Reboot the machine
|
751
|
+
unless reload
|
752
|
+
warn('corl.core.node.bootstrap.reload')
|
753
|
+
myself.status = code.reload_failure
|
754
|
+
end
|
755
|
+
else
|
592
756
|
warn('corl.core.node.bootstrap.status', { :script => remote_script, :status => result.status })
|
593
|
-
myself.status = code.bootstrap_exec_failure
|
757
|
+
myself.status = code.bootstrap_exec_failure
|
594
758
|
end
|
595
759
|
end
|
596
760
|
end
|
@@ -612,10 +776,10 @@ class Node < CORL.plugin_class(:base)
|
|
612
776
|
id(true)
|
613
777
|
public_ip(true)
|
614
778
|
private_ip(true)
|
615
|
-
hostname(true)
|
616
779
|
state(true)
|
617
|
-
|
618
|
-
|
780
|
+
|
781
|
+
machine_type(false)
|
782
|
+
image(false)
|
619
783
|
|
620
784
|
# Provider or external configuration preparation
|
621
785
|
yield(config) if block_given?
|
@@ -641,6 +805,17 @@ class Node < CORL.plugin_class(:base)
|
|
641
805
|
|
642
806
|
yield(:config, config) if block_given?
|
643
807
|
success = machine.start(config.export)
|
808
|
+
success = save(config) if success
|
809
|
+
|
810
|
+
if success
|
811
|
+
if bootstrap_script = myself[:bootstrap]
|
812
|
+
result = command("HOSTNAME='#{hostname}' #{bootstrap_script}", { :as_admin => true }) do |op, data|
|
813
|
+
yield("bootstrap_#{op}".to_sym, data) if block_given?
|
814
|
+
data
|
815
|
+
end
|
816
|
+
success = false unless result.status == code.success && reload
|
817
|
+
end
|
818
|
+
end
|
644
819
|
|
645
820
|
if success && block_given?
|
646
821
|
process_success = yield(:process, config)
|
@@ -699,6 +874,7 @@ class Node < CORL.plugin_class(:base)
|
|
699
874
|
|
700
875
|
yield(:config, config) if block_given?
|
701
876
|
success = machine.create_image(config.export)
|
877
|
+
success = save(config) if success
|
702
878
|
|
703
879
|
if success && block_given?
|
704
880
|
process_success = yield(:process, config)
|
@@ -729,6 +905,17 @@ class Node < CORL.plugin_class(:base)
|
|
729
905
|
yield(:config, config) if block_given?
|
730
906
|
success = machine.stop(config.export)
|
731
907
|
|
908
|
+
myself.machine = nil
|
909
|
+
|
910
|
+
delete_setting(:id)
|
911
|
+
delete_setting(:public_ip)
|
912
|
+
delete_setting(:private_ip)
|
913
|
+
delete_setting(:ssh_port)
|
914
|
+
|
915
|
+
myself[:state] = :stopped
|
916
|
+
|
917
|
+
success = save(config) if success
|
918
|
+
|
732
919
|
if success && block_given?
|
733
920
|
process_success = yield(:process, config)
|
734
921
|
success = process_success if process_success == false
|
@@ -752,42 +939,39 @@ class Node < CORL.plugin_class(:base)
|
|
752
939
|
if machine && machine.created?
|
753
940
|
config = Config.ensure(options)
|
754
941
|
|
755
|
-
|
756
|
-
|
757
|
-
if config[:force]
|
758
|
-
run = true
|
759
|
-
else
|
760
|
-
choice = nil
|
761
|
-
begin
|
762
|
-
choice = ui.ask("Are you sure you want to permanently destroy (Y|N): #{plugin_name}?")
|
763
|
-
run = choice.upcase == "Y"
|
764
|
-
|
765
|
-
rescue Errors::UIExpectsTTY
|
766
|
-
run = false
|
767
|
-
end
|
768
|
-
end
|
769
|
-
|
770
|
-
if run
|
771
|
-
if extension_check(:destroy, { :config => config })
|
772
|
-
logger.info("Destroying node: #{plugin_name}")
|
942
|
+
if extension_check(:destroy, { :config => config })
|
943
|
+
logger.info("Destroying node: #{plugin_name}")
|
773
944
|
|
774
|
-
|
775
|
-
success = machine.destroy(config.export)
|
945
|
+
yield(:config, config) if block_given?
|
776
946
|
|
777
|
-
|
778
|
-
|
779
|
-
success = process_success if process_success == false
|
780
|
-
end
|
947
|
+
# Shut down machine
|
948
|
+
success = machine.destroy(config.export)
|
781
949
|
|
782
|
-
|
783
|
-
|
784
|
-
|
950
|
+
myself.machine = nil
|
951
|
+
|
952
|
+
# Remove SSH keys
|
953
|
+
if success && delete_keys
|
954
|
+
# Remove node information
|
955
|
+
network.delete_node(plugin_provider, plugin_name, false)
|
956
|
+
|
957
|
+
network.save({
|
958
|
+
:commit => true,
|
959
|
+
:remote => config.get(:remote, :edit),
|
960
|
+
:push => true
|
961
|
+
})
|
962
|
+
end
|
963
|
+
|
964
|
+
if success && block_given?
|
965
|
+
process_success = yield(:process, config)
|
966
|
+
success = process_success if process_success == false
|
967
|
+
end
|
968
|
+
|
969
|
+
if success
|
970
|
+
extension(:destroy_success, { :config => config })
|
785
971
|
end
|
786
|
-
else
|
787
|
-
logger.warn("Node #{plugin_name} does not have an attached machine or is not created so cannot be destroyed")
|
788
972
|
end
|
789
973
|
else
|
790
|
-
logger.
|
974
|
+
logger.warn("Node #{plugin_name} does not have an attached machine or is not created so cannot be destroyed")
|
791
975
|
end
|
792
976
|
success
|
793
977
|
end
|
data/lib/corl.rb
CHANGED
@@ -32,9 +32,6 @@ require 'rubygems'
|
|
32
32
|
require 'nucleon_base'
|
33
33
|
CORL = Nucleon
|
34
34
|
|
35
|
-
require 'tmpdir'
|
36
|
-
require 'sshkey'
|
37
|
-
|
38
35
|
require 'hiera'
|
39
36
|
require 'facter'
|
40
37
|
|
@@ -47,13 +44,6 @@ I18n.load_path << File.expand_path(File.join('..', 'locales', 'en.yml'), lib_dir
|
|
47
44
|
|
48
45
|
#---
|
49
46
|
|
50
|
-
# Object modifications (100% pure monkey patches)
|
51
|
-
Dir.glob(File.join(mod_dir, '*.rb')).each do |file|
|
52
|
-
require file
|
53
|
-
end
|
54
|
-
|
55
|
-
#---
|
56
|
-
|
57
47
|
# Mixins for classes
|
58
48
|
Dir.glob(File.join(mixin_dir, '*.rb')).each do |file|
|
59
49
|
require file
|
@@ -65,10 +55,12 @@ end
|
|
65
55
|
#---
|
66
56
|
|
67
57
|
# Include CORL utilities
|
68
|
-
[
|
69
|
-
|
70
|
-
|
71
|
-
|
58
|
+
#[].each do |name|
|
59
|
+
# nucleon_require(util_dir, name)
|
60
|
+
#end
|
61
|
+
|
62
|
+
# Special errors
|
63
|
+
nucleon_require(core_dir, :errors)
|
72
64
|
|
73
65
|
# Include facade
|
74
66
|
nucleon_require(core_dir, :facade)
|
data/locales/en.yml
CHANGED
@@ -90,7 +90,20 @@ en:
|
|
90
90
|
hostnames: |-
|
91
91
|
Hostnames of machines to create on provider infrastructure
|
92
92
|
start: |-
|
93
|
-
Spawning new machines on %{
|
93
|
+
Spawning new machines on %{node_provider}
|
94
|
+
ssh:
|
95
|
+
options:
|
96
|
+
errors:
|
97
|
+
ssh_nodes_empty: |-
|
98
|
+
Nodes must be specified in order to launch a SSH terminal
|
99
|
+
ssh_nodes: |-
|
100
|
+
Provider %{node_provider} node %{name} is not a valid node to launch terminal (%{value} given)
|
101
|
+
start: |-
|
102
|
+
Launching terminal for machine %{hostname} (%{id})
|
103
|
+
success: |-
|
104
|
+
Machine %{hostname} (%{id}) successfully ended terminal session
|
105
|
+
failure: |-
|
106
|
+
Machine %{hostname} (%{id}) terminal session failed with status %{status}
|
94
107
|
bootstrap:
|
95
108
|
options:
|
96
109
|
bootstrap_path: |-
|
@@ -112,6 +125,8 @@ en:
|
|
112
125
|
Bootstrap path must be an existing directory
|
113
126
|
auth_files: |-
|
114
127
|
Authorization file %{value} does not exist on the local system
|
128
|
+
bootstrap_nodes_empty: |-
|
129
|
+
Nodes must be specified in order to run the bootstrap action
|
115
130
|
bootstrap_nodes: |-
|
116
131
|
Provider %{node_provider} node %{name} is not a valid node to bootstrap (%{value} given)
|
117
132
|
start: |-
|
@@ -133,6 +148,8 @@ en:
|
|
133
148
|
errors:
|
134
149
|
project_reference: |-
|
135
150
|
Project reference %{value} failed to parse or provider %{provider} isn't loaded >> Possible providers: %{choices}
|
151
|
+
start: |-
|
152
|
+
Now seeding CORL node
|
136
153
|
provision:
|
137
154
|
options:
|
138
155
|
provider: |-
|