morpheus-cli 4.2.16 → 4.2.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/README.md +8 -6
- data/lib/morpheus/api/api_client.rb +32 -14
- data/lib/morpheus/api/auth_interface.rb +4 -2
- data/lib/morpheus/api/backup_jobs_interface.rb +9 -0
- data/lib/morpheus/api/backups_interface.rb +16 -0
- data/lib/morpheus/api/deploy_interface.rb +25 -56
- data/lib/morpheus/api/deployments_interface.rb +44 -55
- data/lib/morpheus/api/doc_interface.rb +57 -0
- data/lib/morpheus/api/instances_interface.rb +5 -0
- data/lib/morpheus/api/rest_interface.rb +40 -0
- data/lib/morpheus/api/user_sources_interface.rb +0 -15
- data/lib/morpheus/api/users_interface.rb +2 -3
- data/lib/morpheus/benchmarking.rb +2 -2
- data/lib/morpheus/cli.rb +4 -1
- data/lib/morpheus/cli/access_token_command.rb +27 -10
- data/lib/morpheus/cli/apps.rb +21 -15
- data/lib/morpheus/cli/backup_jobs_command.rb +276 -0
- data/lib/morpheus/cli/backups_command.rb +271 -0
- data/lib/morpheus/cli/blueprints_command.rb +27 -61
- data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
- data/lib/morpheus/cli/budgets_command.rb +4 -4
- data/lib/morpheus/cli/cli_command.rb +99 -41
- data/lib/morpheus/cli/cloud_resource_pools_command.rb +16 -0
- data/lib/morpheus/cli/clouds.rb +7 -10
- data/lib/morpheus/cli/clusters.rb +0 -18
- data/lib/morpheus/cli/commands/standard/benchmark_command.rb +7 -7
- data/lib/morpheus/cli/commands/standard/man_command.rb +1 -1
- data/lib/morpheus/cli/credentials.rb +13 -9
- data/lib/morpheus/cli/deploy.rb +374 -0
- data/lib/morpheus/cli/deployments.rb +521 -197
- data/lib/morpheus/cli/deploys.rb +271 -126
- data/lib/morpheus/cli/doc.rb +182 -0
- data/lib/morpheus/cli/error_handler.rb +23 -8
- data/lib/morpheus/cli/errors.rb +3 -2
- data/lib/morpheus/cli/image_builder_command.rb +2 -2
- data/lib/morpheus/cli/instances.rb +136 -17
- data/lib/morpheus/cli/invoices_command.rb +59 -47
- data/lib/morpheus/cli/jobs_command.rb +2 -2
- data/lib/morpheus/cli/library_instance_types_command.rb +17 -3
- data/lib/morpheus/cli/library_layouts_command.rb +1 -1
- data/lib/morpheus/cli/login.rb +9 -3
- data/lib/morpheus/cli/mixins/accounts_helper.rb +158 -100
- data/lib/morpheus/cli/mixins/backups_helper.rb +115 -0
- data/lib/morpheus/cli/mixins/deployments_helper.rb +135 -0
- data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/print_helper.rb +110 -74
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +2 -2
- data/lib/morpheus/cli/mixins/whoami_helper.rb +19 -6
- data/lib/morpheus/cli/network_routers_command.rb +1 -1
- data/lib/morpheus/cli/option_parser.rb +48 -5
- data/lib/morpheus/cli/option_types.rb +1 -1
- data/lib/morpheus/cli/projects_command.rb +7 -7
- data/lib/morpheus/cli/provisioning_licenses_command.rb +2 -2
- data/lib/morpheus/cli/remote.rb +3 -2
- data/lib/morpheus/cli/roles.rb +49 -92
- data/lib/morpheus/cli/security_groups.rb +7 -1
- data/lib/morpheus/cli/service_plans_command.rb +10 -10
- data/lib/morpheus/cli/setup.rb +1 -1
- data/lib/morpheus/cli/shell.rb +7 -6
- data/lib/morpheus/cli/subnets_command.rb +1 -1
- data/lib/morpheus/cli/tasks.rb +24 -10
- data/lib/morpheus/cli/tenants_command.rb +133 -163
- data/lib/morpheus/cli/user_groups_command.rb +20 -65
- data/lib/morpheus/cli/user_settings_command.rb +115 -13
- data/lib/morpheus/cli/user_sources_command.rb +57 -24
- data/lib/morpheus/cli/users.rb +210 -186
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/whitelabel_settings_command.rb +29 -5
- data/lib/morpheus/cli/whoami.rb +113 -6
- data/lib/morpheus/cli/workflows.rb +11 -8
- data/lib/morpheus/ext/hash.rb +21 -0
- data/lib/morpheus/terminal.rb +1 -0
- metadata +12 -3
- data/lib/morpheus/cli/auth_command.rb +0 -105
@@ -279,7 +279,7 @@ class Morpheus::Cli::BootScriptsCommand
|
|
279
279
|
options = {}
|
280
280
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
281
281
|
opts.banner = subcommand_usage("[boot-script]")
|
282
|
-
build_common_options(opts, options, [:
|
282
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
|
283
283
|
end
|
284
284
|
optparse.parse!(args)
|
285
285
|
|
@@ -570,16 +570,16 @@ class Morpheus::Cli::BudgetsCommand
|
|
570
570
|
{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 1},
|
571
571
|
# {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true},
|
572
572
|
{'fieldName' => 'scope', 'fieldLabel' => 'Scope', 'code' => 'budget.scope', 'type' => 'select', 'selectOptions' => [{'name'=>'Account','value'=>'account'},{'name'=>'Tenant','value'=>'tenant'},{'name'=>'Cloud','value'=>'cloud'},{'name'=>'Group','value'=>'group'},{'name'=>'User','value'=>'user'}], 'defaultValue' => 'account', 'required' => true, 'displayOrder' => 3},
|
573
|
-
{'fieldName' => 'tenant', 'fieldLabel' => 'Tenant', 'type' => 'select', 'optionSource' => lambda {
|
573
|
+
{'fieldName' => 'tenant', 'fieldLabel' => 'Tenant', 'type' => 'select', 'optionSource' => lambda {|api_client, api_params|
|
574
574
|
@options_interface.options_for_source("tenants", {})['data']
|
575
575
|
}, 'required' => true, 'dependsOnCode' => 'budget.scope:tenant', 'displayOrder' => 4},
|
576
|
-
{'fieldName' => 'user', 'fieldLabel' => 'User', 'type' => 'select', 'optionSource' => lambda {
|
576
|
+
{'fieldName' => 'user', 'fieldLabel' => 'User', 'type' => 'select', 'optionSource' => lambda {|api_client, api_params|
|
577
577
|
@options_interface.options_for_source("users", {})['data']
|
578
578
|
}, 'required' => true, 'dependsOnCode' => 'budget.scope:user', 'displayOrder' => 5},
|
579
|
-
{'fieldName' => 'group', 'fieldLabel' => 'Group', 'type' => 'select', 'optionSource' => lambda {
|
579
|
+
{'fieldName' => 'group', 'fieldLabel' => 'Group', 'type' => 'select', 'optionSource' => lambda {|api_client, api_params|
|
580
580
|
@options_interface.options_for_source("groups", {})['data']
|
581
581
|
}, 'required' => true, 'dependsOnCode' => 'budget.scope:group', 'displayOrder' => 6},
|
582
|
-
{'fieldName' => 'cloud', 'fieldLabel' => 'Cloud', 'type' => 'select', 'optionSource' => lambda {
|
582
|
+
{'fieldName' => 'cloud', 'fieldLabel' => 'Cloud', 'type' => 'select', 'optionSource' => lambda {|api_client, api_params|
|
583
583
|
@options_interface.options_for_source("clouds", {})['data']
|
584
584
|
}, 'required' => true, 'dependsOnCode' => 'budget.scope:cloud', 'displayOrder' => 7},
|
585
585
|
{'fieldName' => 'year', 'fieldLabel' => 'Period', 'type' => 'text', 'required' => true, 'defaultValue' => Time.now.year, 'description' => "The period (year) the budget applies to. Default is the current year.", 'displayOrder' => 8},
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'json'
|
3
|
+
require 'fileutils'
|
3
4
|
require 'morpheus/logging'
|
4
5
|
require 'morpheus/benchmarking'
|
5
6
|
require 'morpheus/cli/option_parser'
|
@@ -232,11 +233,11 @@ module Morpheus
|
|
232
233
|
## the standard options for a command that makes api requests (most of them)
|
233
234
|
|
234
235
|
def build_standard_get_options(opts, options, includes=[], excludes=[])
|
235
|
-
build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :quiet, :dry_run, :remote]
|
236
|
+
build_common_options(opts, options, includes + [:query, :json, :yaml, :csv, :fields, :quiet, :dry_run, :remote], excludes)
|
236
237
|
end
|
237
238
|
|
238
239
|
def build_standard_post_options(opts, options, includes=[], excludes=[])
|
239
|
-
build_common_options(opts, options, [:options, :payload, :json, :quiet, :dry_run, :remote]
|
240
|
+
build_common_options(opts, options, includes + [:options, :payload, :json, :quiet, :dry_run, :remote], excludes)
|
240
241
|
end
|
241
242
|
|
242
243
|
def build_standard_put_options(opts, options, includes=[], excludes=[])
|
@@ -244,7 +245,7 @@ module Morpheus
|
|
244
245
|
end
|
245
246
|
|
246
247
|
def build_standard_delete_options(opts, options, includes=[], excludes=[])
|
247
|
-
build_common_options(opts, options, [:auto_confirm, :query, :json, :quiet, :dry_run, :remote]
|
248
|
+
build_common_options(opts, options, includes + [:auto_confirm, :query, :json, :quiet, :dry_run, :remote], excludes)
|
248
249
|
end
|
249
250
|
|
250
251
|
# list is GET that supports phrase,max,offset,sort,direction
|
@@ -285,13 +286,24 @@ module Morpheus
|
|
285
286
|
while (option_key = option_keys.shift) do
|
286
287
|
case option_key.to_sym
|
287
288
|
|
288
|
-
when :account
|
289
|
-
|
289
|
+
when :tenant, :account
|
290
|
+
# todo: let's deprecate this in favor of :tenant --tenant to keep -a reserved for --all perhaps?
|
291
|
+
opts.on('--tenant TENANT', String, "Tenant (Account) Name or ID") do |val|
|
290
292
|
options[:account] = val
|
291
293
|
end
|
292
|
-
opts.on('
|
294
|
+
opts.on('--tenant-id ID', String, "Tenant (Account) ID") do |val|
|
293
295
|
options[:account_id] = val
|
294
296
|
end
|
297
|
+
# todo: let's deprecate this in favor of :tenant --tenant to keep -a reserved for --all perhaps?
|
298
|
+
opts.on('-a','--account ACCOUNT', "Alias for --tenant") do |val|
|
299
|
+
options[:account] = val
|
300
|
+
end
|
301
|
+
opts.on('-A','--account-id ID', "Tenant (Account) ID") do |val|
|
302
|
+
options[:account_id] = val
|
303
|
+
end
|
304
|
+
opts.add_hidden_option('--tenant-id') if opts.is_a?(Morpheus::Cli::OptionParser)
|
305
|
+
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
306
|
+
opts.add_hidden_option('-A, --account-id') if opts.is_a?(Morpheus::Cli::OptionParser)
|
295
307
|
|
296
308
|
when :options
|
297
309
|
options[:options] ||= {}
|
@@ -459,7 +471,7 @@ module Morpheus
|
|
459
471
|
end
|
460
472
|
|
461
473
|
# arbitrary query parameters in the format -Q "category=web&phrase=nginx"
|
462
|
-
# opts.on( '-Q', '--query PARAMS', "Query parameters. PARAMS format is '
|
474
|
+
# opts.on( '-Q', '--query PARAMS', "Query parameters. PARAMS format is 'foo=bar&category=web'" ) do |val|
|
463
475
|
# options[:query_filters_raw] = val
|
464
476
|
# options[:query_filters] = {}
|
465
477
|
# # todo: smarter parsing
|
@@ -477,7 +489,7 @@ module Morpheus
|
|
477
489
|
|
478
490
|
when :query, :query_filters
|
479
491
|
# arbitrary query parameters in the format -Q "category=web&phrase=nginx"
|
480
|
-
opts.on( '-Q', '--query PARAMS', "Query parameters. PARAMS format is '
|
492
|
+
opts.on( '-Q', '--query PARAMS', "Query parameters. PARAMS format is 'foo=bar&category=web'" ) do |val|
|
481
493
|
options[:query_filters_raw] = val
|
482
494
|
options[:query_filters] = {}
|
483
495
|
# todo: smarter parsing
|
@@ -512,6 +524,12 @@ module Morpheus
|
|
512
524
|
end
|
513
525
|
end
|
514
526
|
|
527
|
+
when :find_by_name
|
528
|
+
opts.on('--find-by-name', "Always treat the identifier argument as a name, never an ID. Useful for specifying names that look like numbers. eg. '1234'" ) do
|
529
|
+
options[:find_by_name] = true
|
530
|
+
end
|
531
|
+
# opts.add_hidden_option('--find-by-name') if opts.is_a?(Morpheus::Cli::OptionParser)
|
532
|
+
|
515
533
|
when :remote
|
516
534
|
opts.on( '-r', '--remote REMOTE', "Remote name. The current remote is used by default." ) do |val|
|
517
535
|
options[:remote] = val
|
@@ -603,9 +621,17 @@ module Morpheus
|
|
603
621
|
opts.add_hidden_option('json-raw') if opts.is_a?(Morpheus::Cli::OptionParser)
|
604
622
|
|
605
623
|
when :yaml
|
606
|
-
|
607
|
-
|
608
|
-
|
624
|
+
# -y for --yes and for --yaml
|
625
|
+
if includes.include?(:auto_confirm)
|
626
|
+
opts.on(nil, '--yaml', "YAML Output") do
|
627
|
+
options[:yaml] = true
|
628
|
+
options[:format] = :yaml
|
629
|
+
end
|
630
|
+
else
|
631
|
+
opts.on('-y', '--yaml', "YAML Output") do
|
632
|
+
options[:yaml] = true
|
633
|
+
options[:format] = :yaml
|
634
|
+
end
|
609
635
|
end
|
610
636
|
opts.on(nil, '--yml', "alias for --yaml") do
|
611
637
|
options[:yaml] = true
|
@@ -783,7 +809,11 @@ module Morpheus
|
|
783
809
|
end
|
784
810
|
opts.add_hidden_option('--no-debug') if opts.is_a?(Morpheus::Cli::OptionParser)
|
785
811
|
|
786
|
-
|
812
|
+
opts.on('--hidden-help', "Print help that includes all the hidden options, like this one." ) do
|
813
|
+
puts opts.full_help_message({show_hidden_options:true})
|
814
|
+
exit # return 0 maybe?
|
815
|
+
end
|
816
|
+
opts.add_hidden_option('--hidden-help') if opts.is_a?(Morpheus::Cli::OptionParser)
|
787
817
|
opts.on('-h', '--help', "Print this help" ) do
|
788
818
|
puts opts
|
789
819
|
exit # return 0 maybe?
|
@@ -1011,7 +1041,7 @@ module Morpheus
|
|
1011
1041
|
# raise_command_error "Please specify a remote appliance with -r or see the command `remote use`"
|
1012
1042
|
# end
|
1013
1043
|
|
1014
|
-
Morpheus::Logging::DarkPrinter.puts "establishing connection to remote #{display_appliance(@appliance_name, @appliance_url)}" if Morpheus::Logging.debug?
|
1044
|
+
Morpheus::Logging::DarkPrinter.puts "establishing connection to remote #{display_appliance(@appliance_name, @appliance_url)}" if Morpheus::Logging.debug? # && !options[:quiet]
|
1015
1045
|
|
1016
1046
|
if options[:no_authorization]
|
1017
1047
|
# maybe handle this here..
|
@@ -1082,7 +1112,7 @@ module Morpheus
|
|
1082
1112
|
else
|
1083
1113
|
if opts[:min]
|
1084
1114
|
if args.count < opts[:min]
|
1085
|
-
raise_args_error("not
|
1115
|
+
raise_args_error("not enough arguments, expected #{opts[:min] || '0'}-#{opts[:max] || 'N'} and got #{args.count == 0 ? '0' : args.count.to_s + ': '}#{args.join(', ')}", args, opts[:optparse])
|
1086
1116
|
end
|
1087
1117
|
end
|
1088
1118
|
if opts[:max]
|
@@ -1173,22 +1203,32 @@ module Morpheus
|
|
1173
1203
|
payload
|
1174
1204
|
end
|
1175
1205
|
|
1176
|
-
def
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1206
|
+
def validate_outfile(outfile, options)
|
1207
|
+
full_filename = File.expand_path(outfile)
|
1208
|
+
outdir = File.dirname(full_filename)
|
1209
|
+
if Dir.exists?(full_filename)
|
1210
|
+
print_red_alert "[local-file] is invalid. It is the name of an existing directory: #{outfile}"
|
1211
|
+
return false
|
1212
|
+
end
|
1213
|
+
if !Dir.exists?(outdir)
|
1214
|
+
if options[:mkdir]
|
1215
|
+
print cyan,"Creating local directory #{outdir}",reset,"\n"
|
1216
|
+
FileUtils.mkdir_p(outdir)
|
1183
1217
|
else
|
1184
|
-
|
1218
|
+
print_red_alert "[local-file] is invalid. Directory not found: #{outdir}"
|
1219
|
+
return false
|
1185
1220
|
end
|
1186
1221
|
end
|
1222
|
+
if File.exists?(full_filename) && !options[:overwrite]
|
1223
|
+
print_red_alert "[local-file] is invalid. File already exists: #{outfile}\nUse -f to overwrite the existing file."
|
1224
|
+
return false
|
1225
|
+
end
|
1226
|
+
return true
|
1187
1227
|
end
|
1188
1228
|
|
1189
1229
|
# basic rendering for options :json, :yml, :csv, :quiet, and :outfile
|
1190
1230
|
# returns the string rendered, or nil if nothing was rendered.
|
1191
|
-
def
|
1231
|
+
def render_response(json_response, options, object_key=nil, &block)
|
1192
1232
|
output = nil
|
1193
1233
|
if options[:json]
|
1194
1234
|
output = as_json(json_response, options, object_key)
|
@@ -1201,32 +1241,50 @@ module Morpheus
|
|
1201
1241
|
else
|
1202
1242
|
output = records_as_csv([row], options)
|
1203
1243
|
end
|
1204
|
-
elsif options[:quiet]
|
1205
|
-
# note: returning non nil means the calling function knows to return rght away.. kinda weird..
|
1206
|
-
# but means we need less if options[:quiet] blocks in every action.
|
1207
|
-
return ""
|
1208
1244
|
end
|
1209
|
-
if
|
1210
|
-
|
1245
|
+
if options[:outfile]
|
1246
|
+
full_outfile = File.expand_path(options[:outfile])
|
1247
|
+
if output
|
1211
1248
|
print_to_file(output, options[:outfile], options[:overwrite])
|
1249
|
+
print "#{cyan}Wrote output to file #{options[:outfile]} (#{File.size(full_outfile)} B)\n" unless options[:quiet]
|
1212
1250
|
else
|
1213
|
-
|
1251
|
+
# uhhh ok lets try this
|
1252
|
+
Morpheus::Logging::DarkPrinter.puts "using experimental feature: --out without a common format like json, yml or csv" if Morpheus::Logging.debug?
|
1253
|
+
result = with_stdout_to_file(options[:outfile], options[:overwrite], 'w+', &block)
|
1254
|
+
if result && result != 0
|
1255
|
+
return result
|
1256
|
+
end
|
1257
|
+
print "#{cyan}Wrote output to file #{options[:outfile]} (#{File.size(full_outfile)} B)\n" unless options[:quiet]
|
1258
|
+
return 0, nil
|
1214
1259
|
end
|
1215
1260
|
else
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1261
|
+
# --quiet means do not render, still want to print to outfile though
|
1262
|
+
if options[:quiet]
|
1263
|
+
return 0, nil
|
1264
|
+
end
|
1265
|
+
# render ouput generated above
|
1266
|
+
if output
|
1267
|
+
puts output
|
1268
|
+
return 0, nil
|
1269
|
+
else
|
1270
|
+
# no render happened, so calling the block if given
|
1271
|
+
if block_given?
|
1272
|
+
result = yield
|
1273
|
+
if result
|
1274
|
+
return result
|
1275
|
+
else
|
1276
|
+
return 0, nil
|
1277
|
+
end
|
1278
|
+
else
|
1279
|
+
# nil means nothing was rendered, some methods still using render_with_format() are relying on this
|
1280
|
+
return nil
|
1281
|
+
end
|
1282
|
+
end
|
1226
1283
|
end
|
1227
|
-
return output
|
1228
1284
|
end
|
1229
1285
|
|
1286
|
+
alias :render_with_format :render_response
|
1287
|
+
|
1230
1288
|
module ClassMethods
|
1231
1289
|
|
1232
1290
|
def set_command_name(cmd_name)
|
@@ -326,6 +326,9 @@ class Morpheus::Cli::CloudResourcePoolsCommand
|
|
326
326
|
opts.on('--active [on|off]', String, "Can be used to disable a resource pool") do |val|
|
327
327
|
options['active'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
|
328
328
|
end
|
329
|
+
opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
|
330
|
+
options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
|
331
|
+
end
|
329
332
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
330
333
|
opts.footer = "Update a resource pool." + "\n" +
|
331
334
|
"[cloud] is required. This is the name or id of the cloud."
|
@@ -437,6 +440,11 @@ class Morpheus::Cli::CloudResourcePoolsCommand
|
|
437
440
|
else
|
438
441
|
payload['resourcePool']['active'] = true
|
439
442
|
end
|
443
|
+
|
444
|
+
# Default
|
445
|
+
if options['defaultPool'] != nil
|
446
|
+
payload['resourcePool']['defaultPool'] = options['defaultPool']
|
447
|
+
end
|
440
448
|
|
441
449
|
# Visibility
|
442
450
|
if options['visibility'] != nil
|
@@ -552,6 +560,9 @@ class Morpheus::Cli::CloudResourcePoolsCommand
|
|
552
560
|
opts.on('--active [on|off]', String, "Can be used to disable a resource pool") do |val|
|
553
561
|
options['active'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
|
554
562
|
end
|
563
|
+
opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
|
564
|
+
options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
|
565
|
+
end
|
555
566
|
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
556
567
|
opts.footer = "Update a resource pool." + "\n" +
|
557
568
|
"[cloud] is required. This is the name or id of the cloud." + "\n"
|
@@ -641,6 +652,11 @@ class Morpheus::Cli::CloudResourcePoolsCommand
|
|
641
652
|
if options['active'] != nil
|
642
653
|
payload['resourcePool']['active'] = options['active']
|
643
654
|
end
|
655
|
+
|
656
|
+
# Default
|
657
|
+
if options['defaultPool'] != nil
|
658
|
+
payload['resourcePool']['defaultPool'] = options['defaultPool']
|
659
|
+
end
|
644
660
|
|
645
661
|
# Visibility
|
646
662
|
if options['visibility'] != nil
|
data/lib/morpheus/cli/clouds.rb
CHANGED
@@ -46,11 +46,15 @@ class Morpheus::Cli::Clouds
|
|
46
46
|
opts.on( '-t', '--type TYPE', "Cloud Type" ) do |val|
|
47
47
|
options[:zone_type] = val
|
48
48
|
end
|
49
|
-
|
49
|
+
build_standard_list_options(opts, options)
|
50
50
|
opts.footer = "List clouds."
|
51
51
|
end
|
52
52
|
optparse.parse!(args)
|
53
53
|
connect(options)
|
54
|
+
# verify_args!(args:args, optparse:optparse, count:0)
|
55
|
+
if args.count > 0
|
56
|
+
options[:phrase] = args.join(" ")
|
57
|
+
end
|
54
58
|
begin
|
55
59
|
if options[:zone_type]
|
56
60
|
cloud_type = cloud_type_for_name(options[:zone_type])
|
@@ -71,15 +75,7 @@ class Morpheus::Cli::Clouds
|
|
71
75
|
end
|
72
76
|
|
73
77
|
json_response = @clouds_interface.list(params)
|
74
|
-
|
75
|
-
puts as_json(json_response, options, "zones")
|
76
|
-
return 0
|
77
|
-
elsif options[:yaml]
|
78
|
-
puts as_yaml(json_response, options, "zones")
|
79
|
-
return 0
|
80
|
-
elsif options[:csv]
|
81
|
-
puts records_as_csv(json_response['zones'], options)
|
82
|
-
else
|
78
|
+
render_response(json_response, options, 'zones') do
|
83
79
|
clouds = json_response['zones']
|
84
80
|
title = "Morpheus Clouds"
|
85
81
|
subtitles = []
|
@@ -99,6 +95,7 @@ class Morpheus::Cli::Clouds
|
|
99
95
|
end
|
100
96
|
print reset,"\n"
|
101
97
|
end
|
98
|
+
return 0, nil
|
102
99
|
rescue RestClient::Exception => e
|
103
100
|
print_rest_exception(e, options)
|
104
101
|
exit 1
|
@@ -609,15 +609,6 @@ class Morpheus::Cli::Clusters
|
|
609
609
|
option_type_list = ((controller_type['optionTypes'].reject { |type| !type['enabled'] || type['fieldComponent'] } rescue []) + layout['optionTypes'] +
|
610
610
|
(cluster_type['optionTypes'].reject { |type| !type['enabled'] || !type['creatable'] || type['fieldComponent'] } rescue [])).sort { |type| type['displayOrder'] }
|
611
611
|
|
612
|
-
# remove volume options if volumes were configured
|
613
|
-
if !server_payload['volumes'].empty?
|
614
|
-
option_type_list = reject_volume_option_types(option_type_list)
|
615
|
-
end
|
616
|
-
# remove networkId option if networks were configured above
|
617
|
-
if !server_payload['networkInterfaces'].empty?
|
618
|
-
option_type_list = reject_networking_option_types(option_type_list)
|
619
|
-
end
|
620
|
-
|
621
612
|
server_payload.deep_merge!(Morpheus::Cli::OptionTypes.prompt(option_type_list, options[:options], @api_client, {zoneId: cloud['id'], siteId: group['id'], layoutId: layout['id']}))
|
622
613
|
|
623
614
|
# Worker count
|
@@ -1197,15 +1188,6 @@ class Morpheus::Cli::Clusters
|
|
1197
1188
|
(type['fieldContext'] == 'instance.networkDomain' && type['fieldName'] == 'id')
|
1198
1189
|
} rescue [])
|
1199
1190
|
|
1200
|
-
# remove volume options if volumes were configured
|
1201
|
-
if !server_payload['volumes'].empty?
|
1202
|
-
option_type_list = reject_volume_option_types(option_type_list)
|
1203
|
-
end
|
1204
|
-
# remove networkId option if networks were configured above
|
1205
|
-
if !server_payload['networkInterfaces'].empty?
|
1206
|
-
option_type_list = reject_networking_option_types(option_type_list)
|
1207
|
-
end
|
1208
|
-
|
1209
1191
|
server_payload.deep_merge!(Morpheus::Cli::OptionTypes.prompt(option_type_list, options[:options], @api_client, {zoneId: cloud['id'], siteId: group['id'], layoutId: layout['id']}))
|
1210
1192
|
|
1211
1193
|
# Create User
|
@@ -363,7 +363,7 @@ EOT
|
|
363
363
|
else
|
364
364
|
out << "\texit: 0 "
|
365
365
|
end
|
366
|
-
total_time_str = "#{benchmark_record.duration.round((benchmark_record.duration > 0.002) ? 3 : 6)}s"
|
366
|
+
total_time_str = "#{benchmark_record.duration.round((benchmark_record.duration > 0.002) ? 3 : 6)} s"
|
367
367
|
out << "\t #{total_time_str.ljust(9, ' ')}"
|
368
368
|
else
|
369
369
|
benchmark_records = []
|
@@ -384,8 +384,8 @@ EOT
|
|
384
384
|
# all_durations = benchmark_records.collect {|benchmark_record| benchmark_record.duration }
|
385
385
|
# total_duration = all_durations.inject(0.0) {|acc, i| acc + i }
|
386
386
|
# avg_duration = total_duration / all_durations.size
|
387
|
-
# total_time_str = "#{total_duration.round((total_duration > 0.002) ? 3 : 6)}s"
|
388
|
-
# avg_time_str = "#{avg_duration.round((total_duration > 0.002) ? 3 : 6)}s"
|
387
|
+
# total_time_str = "#{total_duration.round((total_duration > 0.002) ? 3 : 6)} s"
|
388
|
+
# avg_time_str = "#{avg_duration.round((total_duration > 0.002) ? 3 : 6)} s"
|
389
389
|
|
390
390
|
all_durations = []
|
391
391
|
stats = {total: 0, avg: nil, min: nil, max: nil}
|
@@ -406,10 +406,10 @@ EOT
|
|
406
406
|
stats[:avg] = stats[:total].to_f / all_durations.size
|
407
407
|
end
|
408
408
|
|
409
|
-
total_time_str = "#{stats[:total].round((stats[:total] > 0.002) ? 3 : 6)}s"
|
410
|
-
min_time_str = stats[:min] ? "#{stats[:min].round((stats[:min] > 0.002) ? 3 : 6)}s" : ""
|
411
|
-
max_time_str = stats[:max] ? "#{stats[:max].round((stats[:max] > 0.002) ? 3 : 6)}s" : ""
|
412
|
-
avg_time_str = stats[:avg] ? "#{stats[:avg].round((stats[:avg] > 0.002) ? 3 : 6)}s" : ""
|
409
|
+
total_time_str = "#{stats[:total].round((stats[:total] > 0.002) ? 3 : 6)} s"
|
410
|
+
min_time_str = stats[:min] ? "#{stats[:min].round((stats[:min] > 0.002) ? 3 : 6)} s" : ""
|
411
|
+
max_time_str = stats[:max] ? "#{stats[:max].round((stats[:max] > 0.002) ? 3 : 6)} s" : ""
|
412
|
+
avg_time_str = stats[:avg] ? "#{stats[:avg].round((stats[:avg] > 0.002) ? 3 : 6)} s" : ""
|
413
413
|
|
414
414
|
out = ""
|
415
415
|
# <benchmark name or command>
|
@@ -176,7 +176,7 @@ morpheus v#{Morpheus::Cli::VERSION}
|
|
176
176
|
|
177
177
|
To learn more about the Morpheus Appliance, visit https://www.morpheusdata.com/features
|
178
178
|
|
179
|
-
To learn more about the Morpheus API, visit
|
179
|
+
To learn more about the Morpheus API, visit https://apidocs.morpheusdata.com
|
180
180
|
|
181
181
|
## GLOBAL OPTIONS
|
182
182
|
|
@@ -87,7 +87,7 @@ module Morpheus
|
|
87
87
|
rescue ::RestClient::Exception => e
|
88
88
|
#raise e
|
89
89
|
print_red_alert "Token not valid."
|
90
|
-
if options[:debug]
|
90
|
+
if options[:debug]
|
91
91
|
print_rest_exception(e, options)
|
92
92
|
end
|
93
93
|
wallet = nil
|
@@ -255,8 +255,7 @@ module Morpheus
|
|
255
255
|
true
|
256
256
|
end
|
257
257
|
|
258
|
-
def use_refresh_token(options = {})
|
259
|
-
#puts "use_refresh_token(#{options})"
|
258
|
+
def use_refresh_token(refresh_token_value, options = {})
|
260
259
|
|
261
260
|
wallet = load_saved_credentials
|
262
261
|
|
@@ -265,22 +264,25 @@ module Morpheus
|
|
265
264
|
return nil
|
266
265
|
end
|
267
266
|
|
268
|
-
if
|
269
|
-
|
270
|
-
|
267
|
+
if refresh_token_value.nil?
|
268
|
+
if wallet['refresh_token']
|
269
|
+
refresh_token_value = wallet['refresh_token']
|
270
|
+
else
|
271
|
+
print_red_alert yellow,"No refresh token found for #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
|
272
|
+
return nil
|
273
|
+
end
|
271
274
|
end
|
272
275
|
|
273
|
-
|
274
276
|
username = wallet['username']
|
275
277
|
|
276
278
|
begin
|
277
279
|
auth_interface = Morpheus::AuthInterface.new({url:@appliance_url})
|
278
280
|
auth_interface.setopts(options)
|
279
281
|
if options[:dry_run]
|
280
|
-
print_dry_run auth_interface.dry.use_refresh_token(
|
282
|
+
print_dry_run auth_interface.dry.use_refresh_token(refresh_token_value)
|
281
283
|
return nil
|
282
284
|
end
|
283
|
-
json_response = auth_interface.use_refresh_token(
|
285
|
+
json_response = auth_interface.use_refresh_token(refresh_token_value)
|
284
286
|
#wallet = json_response
|
285
287
|
login_date = Time.now
|
286
288
|
expire_date = nil
|
@@ -311,6 +313,8 @@ module Morpheus
|
|
311
313
|
print_rest_exception(e, options)
|
312
314
|
end
|
313
315
|
wallet = nil
|
316
|
+
# return now or else it will log them out
|
317
|
+
return nil
|
314
318
|
end
|
315
319
|
|
316
320
|
# save wallet to credentials file
|