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.
Files changed (48) hide show
  1. data/.gitmodules +1 -1
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +15 -8
  4. data/VERSION +1 -1
  5. data/bootstrap/os/ubuntu/00_base.sh +10 -1
  6. data/bootstrap/os/ubuntu/05_ruby.sh +6 -0
  7. data/bootstrap/os/ubuntu/06_puppet.sh +6 -6
  8. data/bootstrap/os/ubuntu/09_nucleon.sh +14 -0
  9. data/bootstrap/os/ubuntu/10_corl.sh +7 -2
  10. data/corl.gemspec +16 -9
  11. data/lib/CORL/action/authorize.rb +57 -0
  12. data/lib/CORL/action/bootstrap.rb +5 -0
  13. data/lib/CORL/action/destroy.rb +64 -0
  14. data/lib/CORL/action/exec.rb +9 -0
  15. data/lib/CORL/action/image.rb +39 -7
  16. data/lib/CORL/action/images.rb +4 -3
  17. data/lib/CORL/action/lookup.rb +2 -2
  18. data/lib/CORL/action/regions.rb +51 -0
  19. data/lib/CORL/action/seed.rb +1 -1
  20. data/lib/CORL/action/spawn.rb +8 -9
  21. data/lib/CORL/action/ssh.rb +74 -0
  22. data/lib/CORL/action/start.rb +37 -5
  23. data/lib/CORL/action/stop.rb +37 -5
  24. data/lib/CORL/configuration/file.rb +34 -7
  25. data/lib/CORL/event/puppet.rb +1 -1
  26. data/lib/CORL/machine/aws.rb +153 -0
  27. data/lib/CORL/machine/physical.rb +14 -5
  28. data/lib/CORL/machine/rackspace.rb +58 -0
  29. data/lib/CORL/network/default.rb +1 -1
  30. data/lib/CORL/node/aws.rb +40 -16
  31. data/lib/CORL/node/local.rb +4 -3
  32. data/lib/CORL/node/rackspace.rb +25 -7
  33. data/lib/CORL/provisioner/puppetnode.rb +11 -9
  34. data/lib/core/errors.rb +6 -0
  35. data/lib/core/mod/fog_aws_server.rb +38 -0
  36. data/lib/core/plugin/action.rb +3 -11
  37. data/lib/core/plugin/configuration.rb +20 -2
  38. data/lib/{CORL/machine/fog.rb → core/plugin/fog_machine.rb} +92 -92
  39. data/lib/core/plugin/{fog.rb → fog_node.rb} +20 -7
  40. data/lib/core/plugin/machine.rb +58 -37
  41. data/lib/core/plugin/network.rb +76 -111
  42. data/lib/core/plugin/node.rb +271 -87
  43. data/lib/core/plugin/provisioner.rb +1 -1
  44. data/lib/corl.rb +6 -14
  45. data/locales/en.yml +18 -1
  46. metadata +39 -32
  47. data/lib/CORL/node/google.rb +0 -111
  48. data/lib/core/util/ssh.rb +0 -286
@@ -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
- @cli_interface = Util::Liquid.new do |method, args, &code|
18
- result = exec({ :commands => [ [ method, args ].flatten.join(' ') ] }) do |op, data|
19
- code.call(op, data) if code
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
- @action_interface = Util::Liquid.new do |method, args, &code|
28
- action(method, *args) do |op, data|
29
- code.call(op, data) if code
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(self[:groups])
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(reset = false)
151
- myself[:hostname] = machine.hostname if reset || myself[:hostname].nil?
152
- myself[:hostname]
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[:private_key]
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 = myself[: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 = machine_type_id(types.first)
233
- myself.machine_type = machine_type
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
- active_machine = local? ? local_machine : machine
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
- if type == :error
467
- alert(data)
468
- else
469
- render(data)
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 != CORL.code.success
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(options), :bash)
600
+ command = CORL.command(Config.new({ :command => command }).import(config), :bash)
502
601
  end
503
- results = exec({ :commands => [ command.to_s ] }) do |op, data|
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
- config = Config.ensure(options).defaults({ :net_provider => network.plugin_provider })
513
- encoded_config = Util::CLI.encode(config.export)
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
- action_config = extended_config(:action, {
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
- command(:corl, { :subcommand => action_config }) do |op, data|
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 != code.success
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
- machine_type(true)
618
- image(true)
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
- run = false
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
- yield(:config, config) if block_given?
775
- success = machine.destroy(config.export)
945
+ yield(:config, config) if block_given?
776
946
 
777
- if success && block_given?
778
- process_success = yield(:process, config)
779
- success = process_success if process_success == false
780
- end
947
+ # Shut down machine
948
+ success = machine.destroy(config.export)
781
949
 
782
- if success
783
- extension(:destroy_success, { :config => config })
784
- end
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.info("Node #{plugin_name} not destroyed due to user cancellation")
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
@@ -6,7 +6,7 @@ class Provisioner < CORL.plugin_class(:base)
6
6
  #-----------------------------------------------------------------------------
7
7
  # Provisioner plugin interface
8
8
 
9
- def normalize
9
+ def normalize(reload)
10
10
  super
11
11
  end
12
12
 
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
- [ :ssh
69
- ].each do |name|
70
- nucleon_require(util_dir, name)
71
- end
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 %{provider}
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: |-