morpheus-cli 3.5.1.3 → 3.5.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.
- checksums.yaml +4 -4
- data/lib/morpheus/api/instances_interface.rb +7 -0
- data/lib/morpheus/api/storage_providers_interface.rb +11 -11
- data/lib/morpheus/cli/accounts.rb +4 -4
- data/lib/morpheus/cli/apps.rb +67 -16
- data/lib/morpheus/cli/boot_scripts_command.rb +5 -5
- data/lib/morpheus/cli/clouds.rb +8 -8
- data/lib/morpheus/cli/containers_command.rb +29 -6
- data/lib/morpheus/cli/dashboard_command.rb +1 -1
- data/lib/morpheus/cli/deployments.rb +5 -5
- data/lib/morpheus/cli/hosts.rb +46 -23
- data/lib/morpheus/cli/image_builder_command.rb +6 -6
- data/lib/morpheus/cli/instances.rb +243 -82
- data/lib/morpheus/cli/key_pairs.rb +6 -6
- data/lib/morpheus/cli/load_balancers.rb +6 -6
- data/lib/morpheus/cli/login.rb +8 -5
- data/lib/morpheus/cli/logout.rb +1 -1
- data/lib/morpheus/cli/monitoring_contacts_command.rb +6 -6
- data/lib/morpheus/cli/monitoring_incidents_command.rb +8 -8
- data/lib/morpheus/cli/preseed_scripts_command.rb +5 -5
- data/lib/morpheus/cli/recent_activity_command.rb +1 -1
- data/lib/morpheus/cli/remote.rb +1 -1
- data/lib/morpheus/cli/security_group_rules.rb +4 -4
- data/lib/morpheus/cli/security_groups.rb +5 -5
- data/lib/morpheus/cli/shell.rb +1 -1
- data/lib/morpheus/cli/storage_providers_command.rb +78 -78
- data/lib/morpheus/cli/tasks.rb +5 -5
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/version_command.rb +1 -1
- data/lib/morpheus/cli/whoami.rb +1 -1
- data/lib/morpheus/cli/workflows.rb +4 -4
- metadata +2 -2
@@ -26,7 +26,7 @@ class Morpheus::Cli::DashboardCommand
|
|
26
26
|
|
27
27
|
def show(args)
|
28
28
|
options = {}
|
29
|
-
optparse = OptionParser.new do|opts|
|
29
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
30
30
|
opts.banner = usage
|
31
31
|
build_common_options(opts, options, [:json, :dry_run]) # todo: support :account
|
32
32
|
end
|
@@ -24,7 +24,7 @@ class Morpheus::Cli::Deployments
|
|
24
24
|
|
25
25
|
def list(args)
|
26
26
|
options = {}
|
27
|
-
optparse = OptionParser.new do|opts|
|
27
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
28
28
|
opts.banner = subcommand_usage()
|
29
29
|
build_common_options(opts, options, [:list, :json, :dry_run, :remote])
|
30
30
|
end
|
@@ -64,7 +64,7 @@ class Morpheus::Cli::Deployments
|
|
64
64
|
|
65
65
|
def list_versions(args)
|
66
66
|
options = {}
|
67
|
-
optparse = OptionParser.new do|opts|
|
67
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
68
68
|
opts.banner = subcommand_usage("[name] versions")
|
69
69
|
build_common_options(opts, options, [:list, :json, :dry_run, :remote])
|
70
70
|
end
|
@@ -114,7 +114,7 @@ class Morpheus::Cli::Deployments
|
|
114
114
|
deployment_name = args[0]
|
115
115
|
options = {}
|
116
116
|
account_name = nil
|
117
|
-
optparse = OptionParser.new do|opts|
|
117
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
118
118
|
opts.banner = subcommand_usage("[name] [options]")
|
119
119
|
build_common_options(opts, options, [:options, :json, :dry_run, :remote])
|
120
120
|
end
|
@@ -169,7 +169,7 @@ class Morpheus::Cli::Deployments
|
|
169
169
|
|
170
170
|
def add(args)
|
171
171
|
options = {}
|
172
|
-
optparse = OptionParser.new do|opts|
|
172
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
173
173
|
opts.banner = subcommand_usage("[name]")
|
174
174
|
opts.on( '-d', '--description DESCRIPTION', "Description" ) do |val|
|
175
175
|
options[:description] = val
|
@@ -203,7 +203,7 @@ class Morpheus::Cli::Deployments
|
|
203
203
|
|
204
204
|
def remove(args)
|
205
205
|
options = {}
|
206
|
-
optparse = OptionParser.new do|opts|
|
206
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
207
207
|
opts.banner = subcommand_usage("[name]")
|
208
208
|
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
209
209
|
end
|
data/lib/morpheus/cli/hosts.rb
CHANGED
@@ -230,8 +230,18 @@ class Morpheus::Cli::Hosts
|
|
230
230
|
|
231
231
|
def get(args)
|
232
232
|
options = {}
|
233
|
-
optparse = OptionParser.new do|opts|
|
233
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
234
234
|
opts.banner = subcommand_usage("[name]")
|
235
|
+
opts.on('--refresh-until [status]', String, "Refresh until status is reached. Default status is provisioned.") do |val|
|
236
|
+
if val.to_s.empty?
|
237
|
+
options[:refresh_until_status] = "provisioned"
|
238
|
+
else
|
239
|
+
options[:refresh_until_status] = val.to_s.downcase
|
240
|
+
end
|
241
|
+
end
|
242
|
+
opts.on('--refresh-interval seconds', String, "Refresh interval. Default is 5 seconds.") do |val|
|
243
|
+
options[:refresh_interval] = val.to_f
|
244
|
+
end
|
235
245
|
build_common_options(opts, options, [:json, :csv, :yaml, :fields, :dry_run, :remote])
|
236
246
|
end
|
237
247
|
optparse.parse!(args)
|
@@ -297,6 +307,19 @@ class Morpheus::Cli::Hosts
|
|
297
307
|
print_stats_usage(stats)
|
298
308
|
print reset, "\n"
|
299
309
|
|
310
|
+
# refresh until a status is reached
|
311
|
+
if options[:refresh_until_status]
|
312
|
+
if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
|
313
|
+
options[:refresh_interval] = 5
|
314
|
+
end
|
315
|
+
while server['status'].to_s.downcase != options[:refresh_until_status].to_s.downcase
|
316
|
+
print cyan
|
317
|
+
print "Refreshing until status #{options[:refresh_until_status]} ..."
|
318
|
+
sleep(options[:refresh_interval])
|
319
|
+
_get(arg, options)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
300
323
|
rescue RestClient::Exception => e
|
301
324
|
print_rest_exception(e, options)
|
302
325
|
exit 1
|
@@ -305,7 +328,7 @@ class Morpheus::Cli::Hosts
|
|
305
328
|
|
306
329
|
def stats(args)
|
307
330
|
options = {}
|
308
|
-
optparse = OptionParser.new do|opts|
|
331
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
309
332
|
opts.banner = subcommand_usage("[name]")
|
310
333
|
build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
|
311
334
|
end
|
@@ -365,7 +388,7 @@ class Morpheus::Cli::Hosts
|
|
365
388
|
|
366
389
|
def logs(args)
|
367
390
|
options = {}
|
368
|
-
optparse = OptionParser.new do|opts|
|
391
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
369
392
|
opts.banner = subcommand_usage("[name]")
|
370
393
|
build_common_options(opts, options, [:list, :json, :dry_run, :remote])
|
371
394
|
end
|
@@ -428,7 +451,7 @@ class Morpheus::Cli::Hosts
|
|
428
451
|
|
429
452
|
def server_types(args)
|
430
453
|
options = {}
|
431
|
-
optparse = OptionParser.new do|opts|
|
454
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
432
455
|
opts.banner = subcommand_usage("[cloud]")
|
433
456
|
build_common_options(opts, options, [:json, :remote])
|
434
457
|
end
|
@@ -463,7 +486,7 @@ class Morpheus::Cli::Hosts
|
|
463
486
|
|
464
487
|
def add(args)
|
465
488
|
options = {}
|
466
|
-
optparse = OptionParser.new do|opts|
|
489
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
467
490
|
opts.banner = subcommand_usage("[cloud]", "[name]")
|
468
491
|
opts.on( '-g', '--group GROUP', "Group Name or ID" ) do |val|
|
469
492
|
options[:group] = val
|
@@ -634,27 +657,27 @@ class Morpheus::Cli::Hosts
|
|
634
657
|
|
635
658
|
def remove(args)
|
636
659
|
options = {}
|
637
|
-
query_params = {
|
638
|
-
optparse = OptionParser.new do|opts|
|
639
|
-
opts.banner = subcommand_usage("[name]
|
640
|
-
opts.on( '-
|
641
|
-
|
642
|
-
end
|
643
|
-
opts.on( '-S', '--skip-remove-infrastructure', "Skip removal of underlying cloud infrastructure. Same as --remove-resources off" ) do
|
644
|
-
query_params[:removeResources] = 'off'
|
645
|
-
end
|
660
|
+
query_params = {}
|
661
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
662
|
+
opts.banner = subcommand_usage("[name]")
|
663
|
+
# opts.on( '-S', '--skip-remove-infrastructure', "Skip removal of underlying cloud infrastructure. Same as --remove-resources off" ) do
|
664
|
+
# query_params[:removeResources] = 'off'
|
665
|
+
# end
|
646
666
|
opts.on('--remove-resources [on|off]', ['on','off'], "Remove Infrastructure. Default is on if server is managed.") do |val|
|
647
667
|
query_params[:removeResources] = val
|
648
668
|
end
|
649
|
-
opts.on('--
|
650
|
-
query_params[:
|
669
|
+
opts.on('--preserve-volumes [on|off]', ['on','off'], "Preserve Volumes. Default is off.") do |val|
|
670
|
+
query_params[:preserveVolumes] = val
|
651
671
|
end
|
652
|
-
opts.on('--remove-instances [on|off]', ['on','off'], "Remove Associated Instances.") do |val|
|
672
|
+
opts.on('--remove-instances [on|off]', ['on','off'], "Remove Associated Instances. Default is off.") do |val|
|
653
673
|
query_params[:removeInstances] = val
|
654
674
|
end
|
655
|
-
opts.on('--release-eips [on|off]', ['on','off'], "Release EIPs, default is
|
675
|
+
opts.on('--release-eips [on|off]', ['on','off'], "Release EIPs, default is on. Amazon only.") do |val|
|
656
676
|
params[:releaseEIPs] = val
|
657
677
|
end
|
678
|
+
opts.on( '-f', '--force', "Force Delete" ) do
|
679
|
+
query_params[:force] = 'on'
|
680
|
+
end
|
658
681
|
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
|
659
682
|
end
|
660
683
|
optparse.parse!(args)
|
@@ -689,7 +712,7 @@ class Morpheus::Cli::Hosts
|
|
689
712
|
|
690
713
|
def start(args)
|
691
714
|
options = {}
|
692
|
-
optparse = OptionParser.new do|opts|
|
715
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
693
716
|
opts.banner = subcommand_usage("[name]")
|
694
717
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
695
718
|
end
|
@@ -721,7 +744,7 @@ class Morpheus::Cli::Hosts
|
|
721
744
|
|
722
745
|
def stop(args)
|
723
746
|
options = {}
|
724
|
-
optparse = OptionParser.new do|opts|
|
747
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
725
748
|
opts.banner = subcommand_usage("[name]")
|
726
749
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
727
750
|
end
|
@@ -753,7 +776,7 @@ class Morpheus::Cli::Hosts
|
|
753
776
|
|
754
777
|
def resize(args)
|
755
778
|
options = {}
|
756
|
-
optparse = OptionParser.new do|opts|
|
779
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
757
780
|
opts.banner = subcommand_usage("[name]")
|
758
781
|
build_common_options(opts, options, [:options, :json, :dry_run, :quiet, :remote])
|
759
782
|
end
|
@@ -847,7 +870,7 @@ class Morpheus::Cli::Hosts
|
|
847
870
|
|
848
871
|
def install_agent(args)
|
849
872
|
options = {}
|
850
|
-
optparse = OptionParser.new do|opts|
|
873
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
851
874
|
opts.banner = subcommand_usage("[name]")
|
852
875
|
build_option_type_options(opts, options, install_agent_option_types(false))
|
853
876
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
@@ -899,7 +922,7 @@ class Morpheus::Cli::Hosts
|
|
899
922
|
|
900
923
|
def upgrade_agent(args)
|
901
924
|
options = {}
|
902
|
-
optparse = OptionParser.new do|opts|
|
925
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
903
926
|
opts.banner = subcommand_usage("[name]")
|
904
927
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
905
928
|
end
|
@@ -57,7 +57,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
57
57
|
|
58
58
|
def list(args)
|
59
59
|
options = {}
|
60
|
-
optparse = OptionParser.new do|opts|
|
60
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
61
61
|
opts.banner = subcommand_usage()
|
62
62
|
build_common_options(opts, options, [:list, :json, :dry_run])
|
63
63
|
end
|
@@ -138,7 +138,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
138
138
|
|
139
139
|
def get(args)
|
140
140
|
options = {}
|
141
|
-
optparse = OptionParser.new do|opts|
|
141
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
142
142
|
opts.banner = subcommand_usage("[image-build]")
|
143
143
|
build_common_options(opts, options, [:json, :dry_run])
|
144
144
|
end
|
@@ -275,7 +275,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
275
275
|
|
276
276
|
def add(args)
|
277
277
|
options = {}
|
278
|
-
optparse = OptionParser.new do|opts|
|
278
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
279
279
|
opts.banner = subcommand_usage("[options]")
|
280
280
|
# build_option_type_options(opts, options, add_image_build_option_types(false))
|
281
281
|
opts.on( '-t', '--type TYPE', "Image Build Type" ) do |val|
|
@@ -397,7 +397,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
397
397
|
|
398
398
|
def update(args)
|
399
399
|
options = {}
|
400
|
-
optparse = OptionParser.new do|opts|
|
400
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
401
401
|
opts.banner = subcommand_usage("[image-build] [options]")
|
402
402
|
# build_option_type_options(opts, options, update_image_build_option_types(false))
|
403
403
|
# cannot update type
|
@@ -517,7 +517,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
517
517
|
def remove(args)
|
518
518
|
options = {}
|
519
519
|
query_params = {}
|
520
|
-
optparse = OptionParser.new do|opts|
|
520
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
521
521
|
opts.banner = subcommand_usage("[image-build]")
|
522
522
|
opts.on( '-K', '--keep-virtual-images', "Preserve associated virtual images" ) do
|
523
523
|
query_params['keepVirtualImages'] = 'on'
|
@@ -566,7 +566,7 @@ class Morpheus::Cli::ImageBuilderCommand
|
|
566
566
|
def run(args)
|
567
567
|
options = {}
|
568
568
|
query_params = {}
|
569
|
-
optparse = OptionParser.new do|opts|
|
569
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
570
570
|
opts.banner = subcommand_usage("[image-build]")
|
571
571
|
build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run])
|
572
572
|
end
|
@@ -11,7 +11,7 @@ class Morpheus::Cli::Instances
|
|
11
11
|
include Morpheus::Cli::CliCommand
|
12
12
|
include Morpheus::Cli::ProvisioningHelper
|
13
13
|
|
14
|
-
register_subcommands :list, :count, :get, :add, :update, :remove, :logs, :stats, :stop, :start, :restart, :actions, :action, :suspend, :eject, :backup, :backups, :stop_service, :start_service, :restart_service, :resize, :clone, :envs, :setenv, :delenv, :security_groups, :apply_security_groups, :firewall_enable, :firewall_disable, :run_workflow, :import_snapshot, :console, :status_check, {:containers => :list_containers}, :scaling, {:'scaling-update' => :scaling_update}
|
14
|
+
register_subcommands :list, :count, :get, :add, :update, :update_notes, :remove, :logs, :stats, :stop, :start, :restart, :actions, :action, :suspend, :eject, :backup, :backups, :stop_service, :start_service, :restart_service, :resize, :clone, :envs, :setenv, :delenv, :security_groups, :apply_security_groups, :firewall_enable, :firewall_disable, :run_workflow, :import_snapshot, :console, :status_check, {:containers => :list_containers}, :scaling, {:'scaling-update' => :scaling_update}
|
15
15
|
# register_subcommands {:'lb-update' => :load_balancer_update}
|
16
16
|
alias_subcommand :details, :get
|
17
17
|
set_default_subcommand :list
|
@@ -83,19 +83,19 @@ class Morpheus::Cli::Instances
|
|
83
83
|
end
|
84
84
|
json_response = @instances_interface.list(params)
|
85
85
|
if options[:json]
|
86
|
-
json_response.delete('stats') if options[:include_fields]
|
87
86
|
puts as_json(json_response, options, "instances")
|
88
87
|
return 0
|
89
88
|
elsif options[:yaml]
|
90
|
-
json_response.delete('stats') if options[:include_fields]
|
91
89
|
puts as_yaml(json_response, options, "instances")
|
92
90
|
return 0
|
93
91
|
elsif options[:csv]
|
94
92
|
# merge stats to be nice here..
|
95
93
|
if json_response['instances']
|
96
94
|
all_stats = json_response['stats'] || {}
|
97
|
-
|
98
|
-
|
95
|
+
if all_stats
|
96
|
+
json_response['instances'].each do |it|
|
97
|
+
it['stats'] ||= all_stats[it['id'].to_s] || all_stats[it['id']]
|
98
|
+
end
|
99
99
|
end
|
100
100
|
end
|
101
101
|
puts records_as_csv(json_response['instances'], options)
|
@@ -122,10 +122,12 @@ class Morpheus::Cli::Instances
|
|
122
122
|
# server returns stats in a separate key stats => {"id" => {} }
|
123
123
|
# the id is a string right now..for some reason..
|
124
124
|
all_stats = json_response['stats'] || {}
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
if all_stats
|
126
|
+
instances.each do |it|
|
127
|
+
if !it['stats']
|
128
|
+
found_stats = all_stats[it['id'].to_s] || all_stats[it['id']]
|
129
|
+
it['stats'] = found_stats # || {}
|
130
|
+
end
|
129
131
|
end
|
130
132
|
end
|
131
133
|
|
@@ -344,9 +346,35 @@ class Morpheus::Cli::Instances
|
|
344
346
|
def update(args)
|
345
347
|
usage = "Usage: morpheus instances update [name] [options]"
|
346
348
|
options = {}
|
349
|
+
params = {}
|
347
350
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
348
351
|
opts.banner = subcommand_usage("[name]")
|
349
|
-
|
352
|
+
opts.on('--name VALUE', String, "Name") do |val|
|
353
|
+
params['displayName'] = val
|
354
|
+
end
|
355
|
+
opts.on('--description VALUE', String, "Description") do |val|
|
356
|
+
params['description'] = val
|
357
|
+
end
|
358
|
+
opts.on('--environment VALUE', String, "Environment") do |val|
|
359
|
+
params['instanceContext'] = val
|
360
|
+
end
|
361
|
+
opts.on('--group GROUP', String, "Group Name or ID") do |val|
|
362
|
+
options[:group] = val
|
363
|
+
end
|
364
|
+
opts.on('--metadata LIST', String, "Metadata in the format 'name:value, name:value'") do |val|
|
365
|
+
options[:metadata] = val
|
366
|
+
end
|
367
|
+
opts.on('--tags LIST', String, "Tags") do |val|
|
368
|
+
params['tags'] = val
|
369
|
+
# params['tags'] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq
|
370
|
+
end
|
371
|
+
opts.on('--power-schedule-type ID', String, "Power Schedule Type ID") do |val|
|
372
|
+
params['powerScheduleType'] = val == "null" ? nil : val
|
373
|
+
end
|
374
|
+
opts.on('--created-by ID', String, "Created By User ID") do |val|
|
375
|
+
params['createdById'] = val
|
376
|
+
end
|
377
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
350
378
|
end
|
351
379
|
optparse.parse!(args)
|
352
380
|
if args.count < 1
|
@@ -356,33 +384,55 @@ class Morpheus::Cli::Instances
|
|
356
384
|
connect(options)
|
357
385
|
|
358
386
|
begin
|
359
|
-
|
360
387
|
instance = find_instance_by_name_or_id(args[0])
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
388
|
+
return 1 if instance.nil?
|
389
|
+
new_group = nil
|
390
|
+
if options[:group]
|
391
|
+
new_group = find_group_by_name_or_id_for_provisioning(options[:group])
|
392
|
+
return 1 if new_group.nil?
|
393
|
+
params['site'] = {'id' => new_group['id']}
|
394
|
+
end
|
395
|
+
if options[:metadata]
|
396
|
+
if options[:metadata] == "[]" || options[:metadata] == "null"
|
397
|
+
params['metadata'] = []
|
398
|
+
else
|
399
|
+
# parse string into format name:value, name:value
|
400
|
+
# merge IDs from current metadata
|
401
|
+
# todo: should allow quoted semicolons..
|
402
|
+
metadata_list = options[:metadata].split(",").select {|it| !it.to_s.empty? }
|
403
|
+
metadata_list = metadata_list.collect do |it|
|
404
|
+
metadata_pair = it.split(":")
|
405
|
+
row = {}
|
406
|
+
row['name'] = metadata_pair[0].to_s.strip
|
407
|
+
row['value'] = metadata_pair[1].to_s.strip
|
408
|
+
existing_metadata = (instance['metadata'] || []).find { |m| m['name'] == it['name'] }
|
409
|
+
if existing_metadata
|
410
|
+
row['id'] = existing_metadata['id']
|
411
|
+
end
|
412
|
+
row
|
413
|
+
end
|
414
|
+
params['metadata'] = metadata_list
|
415
|
+
end
|
416
|
+
end
|
417
|
+
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
418
|
+
payload = nil
|
419
|
+
if options[:payload]
|
420
|
+
payload = options[:payload]
|
421
|
+
# support args and option parameters on top of payload
|
422
|
+
if !params.empty?
|
423
|
+
payload['instance'] ||= {}
|
424
|
+
payload['instance'].deep_merge!(params)
|
425
|
+
end
|
426
|
+
else
|
427
|
+
if params.empty?
|
428
|
+
print_red_alert "Specify atleast one option to update"
|
429
|
+
puts optparse
|
430
|
+
exit 1
|
431
|
+
end
|
432
|
+
payload = {}
|
433
|
+
payload['instance'] = params
|
380
434
|
end
|
381
435
|
|
382
|
-
# instance_keys = ['name', 'description', 'instanceContext', 'tags','configId','configRole','configGroup']
|
383
|
-
# params = params.select {|k,v| instance_keys.include?(k) }
|
384
|
-
params['tags'] = params['tags'].split(',').collect {|it| it.to_s.strip }.compact.uniq if params['tags']
|
385
|
-
payload['instance'].merge!(params)
|
386
436
|
if options[:dry_run]
|
387
437
|
print_dry_run @instances_interface.dry.update(instance["id"], payload)
|
388
438
|
return
|
@@ -394,8 +444,85 @@ class Morpheus::Cli::Instances
|
|
394
444
|
else
|
395
445
|
print_green_success "Updated instance #{instance['name']}"
|
396
446
|
#list([])
|
447
|
+
get([instance['id']])
|
448
|
+
end
|
449
|
+
return 0
|
450
|
+
rescue RestClient::Exception => e
|
451
|
+
print_rest_exception(e, options)
|
452
|
+
exit 1
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
def update_notes(args)
|
457
|
+
usage = "Usage: morpheus instances update-notes [name] [options]"
|
458
|
+
options = {}
|
459
|
+
params = {}
|
460
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
461
|
+
opts.banner = subcommand_usage("[name]")
|
462
|
+
opts.on('--notes VALUE', String, "Notes content (Markdown)") do |val|
|
463
|
+
params['notes'] = val
|
464
|
+
end
|
465
|
+
opts.on('--file FILE', "File containing the notes content. This can be used instead of --notes") do |filename|
|
466
|
+
full_filename = File.expand_path(filename)
|
467
|
+
if File.exists?(full_filename)
|
468
|
+
params['notes'] = File.read(full_filename)
|
469
|
+
else
|
470
|
+
print_red_alert "File not found: #{full_filename}"
|
471
|
+
return 1
|
472
|
+
end
|
473
|
+
# use the filename as the name by default.
|
474
|
+
if !params['name']
|
475
|
+
params['name'] = File.basename(full_filename)
|
476
|
+
end
|
477
|
+
end
|
478
|
+
opts.on(nil, '--clear', "Clear current notes") do |val|
|
479
|
+
params['notes'] = ""
|
480
|
+
end
|
481
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
482
|
+
end
|
483
|
+
optparse.parse!(args)
|
484
|
+
if args.count != 1
|
485
|
+
puts_error "#{Morpheus::Terminal.angry_prompt}wrong number of arguments. Expected 1 and received #{args.count} #{args.inspect}\n#{optparse}"
|
486
|
+
return 1
|
487
|
+
end
|
488
|
+
connect(options)
|
489
|
+
|
490
|
+
begin
|
491
|
+
instance = find_instance_by_name_or_id(args[0])
|
492
|
+
return 1 if instance.nil?
|
493
|
+
new_group = nil
|
494
|
+
params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
|
495
|
+
payload = nil
|
496
|
+
if options[:payload]
|
497
|
+
payload = options[:payload]
|
498
|
+
# support args and option parameters on top of payload
|
499
|
+
if !params.empty?
|
500
|
+
payload['instance'] ||= {}
|
501
|
+
payload['instance'].deep_merge!(params)
|
502
|
+
end
|
503
|
+
else
|
504
|
+
if params['notes'].nil?
|
505
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'notes', 'type' => 'code-editor', 'fieldLabel' => 'Notes', 'required' => true, 'description' => 'Notes (Markdown)'}], options[:options])
|
506
|
+
params['notes'] = v_prompt['notes']
|
507
|
+
end
|
508
|
+
payload = {}
|
509
|
+
payload['instance'] = params
|
397
510
|
end
|
398
511
|
|
512
|
+
if options[:dry_run]
|
513
|
+
print_dry_run @instances_interface.dry.update_notes(instance["id"], payload)
|
514
|
+
return
|
515
|
+
end
|
516
|
+
json_response = @instances_interface.update_notes(instance["id"], payload)
|
517
|
+
|
518
|
+
if options[:json]
|
519
|
+
puts as_json(json_response, options)
|
520
|
+
else
|
521
|
+
print_green_success "Updated notes for instance #{instance['name']}"
|
522
|
+
#list([])
|
523
|
+
get([instance['id']])
|
524
|
+
end
|
525
|
+
return 0
|
399
526
|
rescue RestClient::Exception => e
|
400
527
|
print_rest_exception(e, options)
|
401
528
|
exit 1
|
@@ -470,7 +597,7 @@ class Morpheus::Cli::Instances
|
|
470
597
|
return 0
|
471
598
|
end
|
472
599
|
instance = json_response['instance']
|
473
|
-
stats = json_response['stats'] || {}
|
600
|
+
stats = instance['stats'] || json_response['stats'] || {}
|
474
601
|
title = "Instance Stats: #{instance['name']} (#{instance['instanceType']['name']})"
|
475
602
|
print_h1 title
|
476
603
|
puts cyan + "Status: ".rjust(12) + format_instance_status(instance).to_s
|
@@ -608,12 +735,22 @@ class Morpheus::Cli::Instances
|
|
608
735
|
opts.on( nil, '--scaling', "Display Instance Scaling Settings" ) do
|
609
736
|
options[:include_scaling] = true
|
610
737
|
end
|
738
|
+
opts.on('--refresh-until [status]', String, "Refresh until status is reached. Default status is running.") do |val|
|
739
|
+
if val.to_s.empty?
|
740
|
+
options[:refresh_until_status] = "running"
|
741
|
+
else
|
742
|
+
options[:refresh_until_status] = val.to_s.downcase
|
743
|
+
end
|
744
|
+
end
|
745
|
+
opts.on('--refresh-interval seconds', String, "Refresh interval. Default is 5 seconds.") do |val|
|
746
|
+
options[:refresh_interval] = val.to_f
|
747
|
+
end
|
611
748
|
# opts.on( nil, '--threshold', "Alias for --scaling" ) do
|
612
749
|
# options[:include_scaling] = true
|
613
750
|
# end
|
614
|
-
opts.on( nil, '--lb', "Display Load Balancer Details" ) do
|
615
|
-
|
616
|
-
end
|
751
|
+
# opts.on( nil, '--lb', "Display Load Balancer Details" ) do
|
752
|
+
# options[:include_lb] = true
|
753
|
+
# end
|
617
754
|
build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
|
618
755
|
end
|
619
756
|
optparse.parse!(args)
|
@@ -641,11 +778,9 @@ class Morpheus::Cli::Instances
|
|
641
778
|
instance = find_instance_by_name_or_id(arg)
|
642
779
|
json_response = @instances_interface.get(instance['id'])
|
643
780
|
if options[:json]
|
644
|
-
json_response.delete('stats') if options[:include_fields]
|
645
781
|
puts as_json(json_response, options, "instance")
|
646
782
|
return 0
|
647
783
|
elsif options[:yaml]
|
648
|
-
json_response.delete('stats') if options[:include_fields]
|
649
784
|
puts as_yaml(json_response, options, "instance")
|
650
785
|
return 0
|
651
786
|
end
|
@@ -655,7 +790,7 @@ class Morpheus::Cli::Instances
|
|
655
790
|
return 0
|
656
791
|
end
|
657
792
|
instance = json_response['instance']
|
658
|
-
stats = json_response['stats'] || {}
|
793
|
+
stats = instance['stats'] || json_response['stats'] || {}
|
659
794
|
# load_balancers = json_response['loadBalancers'] || {}
|
660
795
|
|
661
796
|
# containers are fetched via separate api call
|
@@ -673,14 +808,14 @@ class Morpheus::Cli::Instances
|
|
673
808
|
# loadBalancers is returned via show
|
674
809
|
# parse the current api format of loadBalancers.first.lbs.first
|
675
810
|
current_instance_lb = nil
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
811
|
+
if instance["currentLoadBalancerInstances"]
|
812
|
+
current_instance_lb = instance['currentLoadBalancerInstances'][0]
|
813
|
+
end
|
814
|
+
|
815
|
+
# support old format
|
816
|
+
if !current_instance_lb && json_response['loadBalancers'] && json_response['loadBalancers'][0] && json_response['loadBalancers'][0]['lbs'] && json_response['loadBalancers'][0]['lbs'][0]
|
681
817
|
current_instance_lb = json_response['loadBalancers'][0]['lbs'][0]
|
682
818
|
#current_load_balancer = current_instance_lb['loadBalancer']
|
683
|
-
#current_load_balancer_port = current_instance_lb['port']
|
684
819
|
end
|
685
820
|
|
686
821
|
print_h1 "Instance Details"
|
@@ -692,8 +827,15 @@ class Morpheus::Cli::Instances
|
|
692
827
|
"Group" => lambda {|it| it['group'] ? it['group']['name'] : '' },
|
693
828
|
"Cloud" => lambda {|it| it['cloud'] ? it['cloud']['name'] : '' },
|
694
829
|
"Type" => lambda {|it| it['instanceType']['name'] },
|
830
|
+
"Layout" => lambda {|it| it['layout'] ? it['layout']['name'] : '' },
|
831
|
+
"Version" => lambda {|it| it['instanceVersion'] },
|
695
832
|
"Plan" => lambda {|it| it['plan'] ? it['plan']['name'] : '' },
|
696
833
|
"Environment" => 'instanceContext',
|
834
|
+
"Tags" => lambda {|it| it['tags'] ? it['tags'].join(',') : '' },
|
835
|
+
"Metadata" => lambda {|it| it['metadata'] ? it['metadata'].collect {|m| "#{m['name']}: #{m['value']}" }.join(', ') : '' },
|
836
|
+
"Power Schedule" => lambda {|it| (it['powerSchedule'] && it['powerSchedule']['type']) ? it['powerSchedule']['type']['name'] : '' },
|
837
|
+
"Created By" => lambda {|it| it['createdBy'] ? (it['createdBy']['username'] || it['createdBy']['id']) : '' },
|
838
|
+
"Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
697
839
|
"Nodes" => lambda {|it| it['containers'] ? it['containers'].count : 0 },
|
698
840
|
"Connection" => lambda {|it| format_instance_connection_string(it) },
|
699
841
|
#"Account" => lambda {|it| it['account'] ? it['account']['name'] : '' },
|
@@ -712,8 +854,11 @@ class Morpheus::Cli::Instances
|
|
712
854
|
end
|
713
855
|
if instance['errorMessage']
|
714
856
|
print_h2 "Error Message"
|
715
|
-
print red, instance['errorMessage'], reset
|
716
|
-
|
857
|
+
print red, instance['errorMessage'], reset, "\n"
|
858
|
+
end
|
859
|
+
if !instance['notes'].to_s.empty?
|
860
|
+
print_h2 "Instance Notes"
|
861
|
+
print cyan, instance['notes'], reset, "\n"
|
717
862
|
end
|
718
863
|
if stats
|
719
864
|
print_h2 "Instance Usage"
|
@@ -721,6 +866,27 @@ class Morpheus::Cli::Instances
|
|
721
866
|
end
|
722
867
|
print reset, "\n"
|
723
868
|
|
869
|
+
# if options[:include_lb]
|
870
|
+
if current_instance_lb
|
871
|
+
print_h2 "Load Balancer"
|
872
|
+
print cyan
|
873
|
+
description_cols = {
|
874
|
+
"LB ID" => lambda {|it| it['loadBalancer']['id'] },
|
875
|
+
"Name" => lambda {|it| it['loadBalancer']['name'] },
|
876
|
+
"Type" => lambda {|it| it['loadBalancer']['type'] ? it['loadBalancer']['type']['name'] : '' },
|
877
|
+
"Host Name" => lambda {|it| it['vipHostname'] || instance['hostName'] },
|
878
|
+
"Port" => lambda {|it| it['vipPort'] },
|
879
|
+
"Protocol" => lambda {|it| it['vipProtocol'] || 'tcp' },
|
880
|
+
"SSL Enabled" => lambda {|it| format_boolean(it['sslEnabled']) },
|
881
|
+
"SSL Cert" => lambda {|it| (it['sslCert']) ? it['sslCert']['name'] : '' },
|
882
|
+
"In" => lambda {|it| instance['currentLoadBalancerContainersIn'] },
|
883
|
+
"Out" => lambda {|it| instance['currentLoadBalancerContainersOutrelo'] }
|
884
|
+
}
|
885
|
+
print_description_list(description_cols, current_instance_lb)
|
886
|
+
print "\n", reset
|
887
|
+
end
|
888
|
+
# end
|
889
|
+
|
724
890
|
if options[:include_containers]
|
725
891
|
print_h2 "Instance Containers"
|
726
892
|
|
@@ -763,26 +929,6 @@ class Morpheus::Cli::Instances
|
|
763
929
|
print reset,"\n"
|
764
930
|
end
|
765
931
|
|
766
|
-
# if options[:include_lb]
|
767
|
-
if current_instance_lb
|
768
|
-
print_h2 "Load Balancer"
|
769
|
-
print cyan
|
770
|
-
# this api response is going to change again.. port is no longer returned atm.
|
771
|
-
description_cols = {
|
772
|
-
"LB ID" => lambda {|it| it['loadBalancer']['id'] },
|
773
|
-
"Name" => lambda {|it| it['loadBalancer']['name'] },
|
774
|
-
"Type" => lambda {|it| it['loadBalancer']['type'] ? it['loadBalancer']['type']['name'] : '' },
|
775
|
-
"Host Name" => lambda {|it| it['loadBalancer']['host'] }, # instance.hostName ?
|
776
|
-
"Port" => lambda {|it| it['port'] ? it['port']['port'] : '' },
|
777
|
-
"Protocol" => lambda {|it| it['port'] ? it['port']['proxyProtocol'] : '' },
|
778
|
-
"SSL Enabled" => lambda {|it| it['port'] ? format_boolean(it['port']['sslEnabled']) : '' },
|
779
|
-
"Cert" => lambda {|it| (it['port'] && it['port']['sslCert']) ? it['port']['sslCert']['name'] : '' }
|
780
|
-
}
|
781
|
-
print_description_list(description_cols, current_instance_lb)
|
782
|
-
print "\n", reset
|
783
|
-
end
|
784
|
-
# end
|
785
|
-
|
786
932
|
if options[:include_scaling]
|
787
933
|
print_h2 "Instance Scaling"
|
788
934
|
if instance_threshold.nil? || instance_threshold.empty?
|
@@ -793,6 +939,20 @@ class Morpheus::Cli::Instances
|
|
793
939
|
print reset,"\n"
|
794
940
|
end
|
795
941
|
end
|
942
|
+
|
943
|
+
# refresh until a status is reached
|
944
|
+
if options[:refresh_until_status]
|
945
|
+
if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
|
946
|
+
options[:refresh_interval] = 5
|
947
|
+
end
|
948
|
+
while instance['status'].to_s.downcase != options[:refresh_until_status].to_s.downcase
|
949
|
+
print cyan
|
950
|
+
print "Refreshing until status #{options[:refresh_until_status]} ..."
|
951
|
+
sleep(options[:refresh_interval])
|
952
|
+
_get(arg, options)
|
953
|
+
end
|
954
|
+
end
|
955
|
+
|
796
956
|
return 0
|
797
957
|
rescue RestClient::Exception => e
|
798
958
|
print_rest_exception(e, options)
|
@@ -1646,21 +1806,21 @@ class Morpheus::Cli::Instances
|
|
1646
1806
|
|
1647
1807
|
def remove(args)
|
1648
1808
|
options = {}
|
1649
|
-
query_params = {
|
1809
|
+
query_params = {}
|
1650
1810
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
1651
|
-
opts.banner = subcommand_usage("[name]
|
1652
|
-
opts.on( '-f', '--force', "Force Delete" ) do
|
1653
|
-
query_params[:force] = 'on'
|
1654
|
-
end
|
1811
|
+
opts.banner = subcommand_usage("[name]")
|
1655
1812
|
opts.on( '-B', '--keep-backups', "Preserve copy of backups" ) do
|
1656
1813
|
query_params[:keepBackups] = 'on'
|
1657
1814
|
end
|
1658
|
-
opts.on('--
|
1659
|
-
query_params[:
|
1815
|
+
opts.on('--preserve-volumes [on|off]', ['on','off'], "Preserve Volumes. Default is off. Applies to certain types only.") do |val|
|
1816
|
+
query_params[:preserveVolumes] = val
|
1660
1817
|
end
|
1661
|
-
opts.on('--releaseEIPs [on|off]', ['on','off'], "Release EIPs. Default is
|
1818
|
+
opts.on('--releaseEIPs [on|off]', ['on','off'], "Release EIPs. Default is on. Applies to Amazon only.") do |val|
|
1662
1819
|
query_params[:releaseEIPs] = val
|
1663
1820
|
end
|
1821
|
+
opts.on( '-f', '--force', "Force Delete" ) do
|
1822
|
+
query_params[:force] = 'on'
|
1823
|
+
end
|
1664
1824
|
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
|
1665
1825
|
|
1666
1826
|
end
|
@@ -1675,6 +1835,10 @@ class Morpheus::Cli::Instances
|
|
1675
1835
|
unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the instance '#{instance['name']}'?", options)
|
1676
1836
|
exit 1
|
1677
1837
|
end
|
1838
|
+
# JD: removeVolumes to maintain the old behavior with pre-3.5.2 appliances, remove me later
|
1839
|
+
if query_params[:preserveVolumes].nil?
|
1840
|
+
query_params[:removeVolumes] = 'on'
|
1841
|
+
end
|
1678
1842
|
if options[:dry_run]
|
1679
1843
|
print_dry_run @instances_interface.dry.destroy(instance['id'],query_params)
|
1680
1844
|
return
|
@@ -2170,7 +2334,6 @@ class Morpheus::Cli::Instances
|
|
2170
2334
|
if json_response['loadBalancers'] && json_response['loadBalancers'][0] && json_response['loadBalancers'][0]['lbs'] && json_response['loadBalancers'][0]['lbs'][0]
|
2171
2335
|
current_instance_lb = json_response['loadBalancers'][0]['lbs'][0]
|
2172
2336
|
#current_load_balancer = current_instance_lb['loadBalancer']
|
2173
|
-
#current_load_balancer_port = current_instance_lb['port']
|
2174
2337
|
end
|
2175
2338
|
|
2176
2339
|
#my_option_types = instance_load_balancer_option_types(instance)
|
@@ -2365,8 +2528,6 @@ private
|
|
2365
2528
|
out << "#{cyan}#{status_string.upcase}#{return_color}"
|
2366
2529
|
elsif status_string == 'stopped' or status_string == 'failed'
|
2367
2530
|
out << "#{red}#{status_string.upcase}#{return_color}"
|
2368
|
-
elsif status_string == 'unknown'
|
2369
|
-
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
2370
2531
|
else
|
2371
2532
|
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
2372
2533
|
end
|
@@ -2384,10 +2545,10 @@ private
|
|
2384
2545
|
status_string = container['status'].to_s
|
2385
2546
|
if status_string == 'running'
|
2386
2547
|
out << "#{green}#{status_string.upcase}#{return_color}"
|
2548
|
+
elsif status_string == 'provisioning'
|
2549
|
+
out << "#{cyan}#{status_string.upcase}#{return_color}"
|
2387
2550
|
elsif status_string == 'stopped' or status_string == 'failed'
|
2388
2551
|
out << "#{red}#{status_string.upcase}#{return_color}"
|
2389
|
-
elsif status_string == 'unknown'
|
2390
|
-
out << "#{white}#{status_string.upcase}#{return_color}"
|
2391
2552
|
else
|
2392
2553
|
out << "#{yellow}#{status_string.upcase}#{return_color}"
|
2393
2554
|
end
|