morpheus-cli 4.2.21 → 5.2.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +30 -0
  4. data/lib/morpheus/api/billing_interface.rb +34 -0
  5. data/lib/morpheus/api/catalog_item_types_interface.rb +9 -0
  6. data/lib/morpheus/api/deploy_interface.rb +1 -1
  7. data/lib/morpheus/api/deployments_interface.rb +20 -1
  8. data/lib/morpheus/api/forgot_password_interface.rb +17 -0
  9. data/lib/morpheus/api/instances_interface.rb +16 -2
  10. data/lib/morpheus/api/rest_interface.rb +0 -6
  11. data/lib/morpheus/api/roles_interface.rb +14 -0
  12. data/lib/morpheus/api/search_interface.rb +13 -0
  13. data/lib/morpheus/api/servers_interface.rb +14 -0
  14. data/lib/morpheus/api/service_catalog_interface.rb +89 -0
  15. data/lib/morpheus/api/usage_interface.rb +18 -0
  16. data/lib/morpheus/cli.rb +7 -3
  17. data/lib/morpheus/cli/apps.rb +6 -27
  18. data/lib/morpheus/cli/backup_jobs_command.rb +3 -0
  19. data/lib/morpheus/cli/backups_command.rb +3 -0
  20. data/lib/morpheus/cli/catalog_item_types_command.rb +622 -0
  21. data/lib/morpheus/cli/cli_command.rb +70 -21
  22. data/lib/morpheus/cli/commands/standard/curl_command.rb +26 -12
  23. data/lib/morpheus/cli/commands/standard/history_command.rb +3 -1
  24. data/lib/morpheus/cli/commands/standard/man_command.rb +74 -40
  25. data/lib/morpheus/cli/commands/standard/source_command.rb +1 -1
  26. data/lib/morpheus/cli/commands/standard/update_command.rb +76 -0
  27. data/lib/morpheus/cli/containers_command.rb +14 -24
  28. data/lib/morpheus/cli/cypher_command.rb +6 -2
  29. data/lib/morpheus/cli/deploy.rb +199 -90
  30. data/lib/morpheus/cli/deployments.rb +341 -28
  31. data/lib/morpheus/cli/deploys.rb +206 -41
  32. data/lib/morpheus/cli/error_handler.rb +7 -0
  33. data/lib/morpheus/cli/forgot_password.rb +133 -0
  34. data/lib/morpheus/cli/groups.rb +1 -1
  35. data/lib/morpheus/cli/health_command.rb +59 -2
  36. data/lib/morpheus/cli/hosts.rb +265 -34
  37. data/lib/morpheus/cli/instances.rb +186 -100
  38. data/lib/morpheus/cli/invoices_command.rb +33 -16
  39. data/lib/morpheus/cli/jobs_command.rb +28 -6
  40. data/lib/morpheus/cli/library_option_lists_command.rb +15 -7
  41. data/lib/morpheus/cli/library_option_types_command.rb +5 -2
  42. data/lib/morpheus/cli/logs_command.rb +9 -6
  43. data/lib/morpheus/cli/mixins/accounts_helper.rb +12 -7
  44. data/lib/morpheus/cli/mixins/backups_helper.rb +2 -4
  45. data/lib/morpheus/cli/mixins/deployments_helper.rb +31 -3
  46. data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
  47. data/lib/morpheus/cli/mixins/print_helper.rb +46 -21
  48. data/lib/morpheus/cli/mixins/provisioning_helper.rb +100 -4
  49. data/lib/morpheus/cli/network_pools_command.rb +14 -6
  50. data/lib/morpheus/cli/option_types.rb +271 -22
  51. data/lib/morpheus/cli/ping.rb +0 -1
  52. data/lib/morpheus/cli/remote.rb +35 -12
  53. data/lib/morpheus/cli/reports_command.rb +99 -30
  54. data/lib/morpheus/cli/roles.rb +453 -113
  55. data/lib/morpheus/cli/search_command.rb +182 -0
  56. data/lib/morpheus/cli/service_catalog_command.rb +1474 -0
  57. data/lib/morpheus/cli/service_plans_command.rb +2 -2
  58. data/lib/morpheus/cli/setup.rb +1 -1
  59. data/lib/morpheus/cli/shell.rb +33 -11
  60. data/lib/morpheus/cli/storage_providers_command.rb +40 -56
  61. data/lib/morpheus/cli/tasks.rb +29 -32
  62. data/lib/morpheus/cli/usage_command.rb +203 -0
  63. data/lib/morpheus/cli/user_settings_command.rb +1 -0
  64. data/lib/morpheus/cli/users.rb +12 -1
  65. data/lib/morpheus/cli/version.rb +1 -1
  66. data/lib/morpheus/cli/virtual_images.rb +429 -254
  67. data/lib/morpheus/cli/whoami.rb +6 -6
  68. data/lib/morpheus/cli/workflows.rb +34 -41
  69. data/lib/morpheus/formatters.rb +75 -7
  70. data/lib/morpheus/terminal.rb +6 -2
  71. metadata +14 -2
@@ -160,15 +160,15 @@ EOT
160
160
  print cyan
161
161
  print_description_list({
162
162
  "ID" => 'id',
163
- "Tenant" => lambda {|it| (it['account'] ? it['account']['name'] : '') + (@is_master_account ? " (Master Tenant)" : '') },
164
- "First Name" => 'firstName',
165
- "Last Name" => 'lastName',
166
- # "Name" => 'displayName',
167
- #"Name" => lambda {|it| it['firstName'] ? it['displayName'] : '' },
168
163
  "Username" => 'username',
164
+ # "First Name" => 'firstName',
165
+ # "Last Name" => 'lastName',
166
+ # "Name" => 'displayName',
167
+ "Name" => lambda {|it| "#{it['firstName']} #{it['lastName']}".strip },
169
168
  "Email" => 'email',
169
+ "Tenant" => lambda {|it| (it['account'] ? it['account']['name'] : '') + (@is_master_account ? " (Master Tenant)" : '') },
170
170
  "Role" => lambda {|it| format_user_role_names(it) },
171
- #"Remote" => lambda {|it| display_appliance(@appliance_name, @appliance_url) },
171
+ "Remote" => lambda {|it| display_appliance(@appliance_name, @appliance_url) },
172
172
  }, @current_user)
173
173
  print cyan
174
174
 
@@ -32,7 +32,7 @@ class Morpheus::Cli::Workflows
32
32
  params = {}
33
33
  options = {}
34
34
  optparse = Morpheus::Cli::OptionParser.new do |opts|
35
- opts.banner = subcommand_usage()
35
+ opts.banner = subcommand_usage("[search]")
36
36
  opts.on("-t", "--type TYPE", "Type of workflow. i.e. provision or operation. Default is provision.") do |val|
37
37
  workflow_type = val.to_s.downcase
38
38
  if workflow_type.include?('provision')
@@ -42,50 +42,43 @@ class Morpheus::Cli::Workflows
42
42
  end
43
43
  params['type'] = workflow_type
44
44
  end
45
- build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
45
+ build_standard_list_options(opts, options)
46
+ opts.footer = "List workflows."
46
47
  end
47
48
  optparse.parse!(args)
48
49
  connect(options)
49
- begin
50
- params.merge!(parse_list_options(options))
51
- @task_sets_interface.setopts(options)
52
- if options[:dry_run]
53
- print_dry_run @task_sets_interface.dry.get(params)
54
- return
55
- end
56
- json_response = @task_sets_interface.get(params)
57
- task_sets = json_response['taskSets']
58
- # print result and return output
59
- if options[:json]
60
- puts as_json(json_response, options, "taskSets")
61
- return 0
62
- elsif options[:csv]
63
- puts records_as_csv(json_response['taskSets'], options)
64
- return 0
65
- elsif options[:yaml]
66
- puts as_yaml(json_response, options, "taskSets")
67
- return 0
50
+ if args.count > 0
51
+ options[:phrase] = args.join(" ")
52
+ end
53
+ params.merge!(parse_list_options(options))
54
+ @task_sets_interface.setopts(options)
55
+ if options[:dry_run]
56
+ print_dry_run @task_sets_interface.dry.get(params)
57
+ return
58
+ end
59
+ json_response = @task_sets_interface.get(params)
60
+ task_sets = json_response['taskSets']
61
+ render_response(json_response, options, 'taskSets') do
62
+ title = "Morpheus Workflows"
63
+ subtitles = []
64
+ subtitles += parse_list_subtitles(options)
65
+ if params['type']
66
+ subtitles << "Type: #{params['type']}"
67
+ end
68
+ print_h1 title, subtitles
69
+ if task_sets.empty?
70
+ print cyan,"No workflows found.",reset,"\n"
68
71
  else
69
- task_sets = json_response['taskSets']
70
- title = "Morpheus Workflows"
71
- subtitles = []
72
- subtitles += parse_list_subtitles(options)
73
- if params['type']
74
- subtitles << "Type: #{params['type']}"
75
- end
76
- print_h1 title, subtitles
77
- if task_sets.empty?
78
- print cyan,"No workflows found.",reset,"\n"
79
- else
80
- print cyan
81
- print_workflows_table(task_sets)
82
- print_results_pagination(json_response)
83
- end
84
- print reset,"\n"
72
+ print cyan
73
+ print_workflows_table(task_sets)
74
+ print_results_pagination(json_response)
85
75
  end
86
- rescue RestClient::Exception => e
87
- print_rest_exception(e, options)
88
- exit 1
76
+ print reset,"\n"
77
+ end
78
+ if task_sets.empty?
79
+ return 1, "no workflows found"
80
+ else
81
+ return 0, nil
89
82
  end
90
83
  end
91
84
 
@@ -623,7 +616,7 @@ class Morpheus::Cli::Workflows
623
616
  #raise_command_error "missing required option: --instance, --host or --appliance\n#{optparse}"
624
617
  end
625
618
 
626
- # todo: prompt to workflow optionTypes for customOptions
619
+ # prompt to workflow optionTypes for customOptions
627
620
  custom_options = nil
628
621
  if workflow['optionTypes'] && workflow['optionTypes'].size() > 0
629
622
  custom_option_types = workflow['optionTypes'].collect {|it|
@@ -352,7 +352,7 @@ def format_number(n, opts={})
352
352
  delim = opts[:delimiter] || ','
353
353
  out = ""
354
354
  parts = n.to_s.split(".")
355
- whole_number = parts[0]
355
+ whole_number = parts[0].to_s
356
356
  decimal = parts[1] ? parts[1..-1].join('.') : nil
357
357
  i = 0
358
358
  whole_number.reverse.each_char do |c|
@@ -365,17 +365,42 @@ def format_number(n, opts={})
365
365
  return out
366
366
  end
367
367
 
368
- def format_sig_dig(n, sigdig=3)
369
- sprintf("%.#{sigdig}f", n)
368
+ def format_sig_dig(n, sigdig=3, min_sigdig=nil, pad_zeros=false)
369
+ v = ""
370
+ if sigdig && sigdig > 0
371
+ # v = n.to_i.round(sigdig).to_s
372
+ v = sprintf("%.#{sigdig}f", n)
373
+ else
374
+ v = n.to_i.round().to_s
375
+ end
376
+ # if pad_zeros != true
377
+ # v = v.to_f.to_s
378
+ # end
379
+ if min_sigdig
380
+ v_parts = v.split(".")
381
+ decimal_str = v_parts[1]
382
+ if decimal_str == nil
383
+ v = v + "." + ('0' * min_sigdig)
384
+ elsif decimal_str.size < min_sigdig
385
+ v = v + ('0' * (min_sigdig - decimal_str.size))
386
+ end
387
+ end
388
+ v
370
389
  end
371
390
 
372
391
  def currency_sym(currency)
373
- Money::Currency.new((currency || 'usd').to_sym).symbol
392
+ Money::Currency.new((currency || 'USD').to_sym).symbol
374
393
  end
375
394
 
376
395
  # returns currency amount formatted like "$4,5123.00". 0.00 is formatted as "$0"
377
396
  # this is not ideal
378
- def format_money(amount, currency='usd', opts={})
397
+ def format_currency(amount, currency='USD', opts={})
398
+ # currency '' should probably error, like money gem does
399
+ if currency.to_s.empty?
400
+ currency = 'USD'
401
+ end
402
+ currency = currency.to_s.upcase
403
+
379
404
  amount = amount.to_f
380
405
  if amount == 0
381
406
  return currency_sym(currency).to_s + "0"
@@ -383,8 +408,11 @@ def format_money(amount, currency='usd', opts={})
383
408
  # # return exponent notation like 3.4e-09
384
409
  # return currency_sym(currency).to_s + "#{amount}"
385
410
  else
386
- sigdig = opts[:sigdig] ? opts[:sigdig].to_i : 2
387
- rtn = currency_sym(currency).to_s + format_number(sprintf("%.#{sigdig}f", amount))
411
+ sigdig = opts[:sigdig] ? opts[:sigdig].to_i : 2 # max decimal digits
412
+ min_sigdig = opts[:min_sigdig] ? opts[:min_sigdig].to_i : (sigdig || 2) # min decimal digits
413
+ display_value = format_sig_dig(amount, sigdig, min_sigdig, opts[:pad_zeros])
414
+ display_value = format_number(display_value) # commas
415
+ rtn = currency_sym(currency).to_s + display_value
388
416
  if amount.to_i < 0
389
417
  rtn = "(#{rtn})"
390
418
  if opts[:minus_color]
@@ -394,3 +422,43 @@ def format_money(amount, currency='usd', opts={})
394
422
  rtn
395
423
  end
396
424
  end
425
+
426
+ alias :format_money :format_currency
427
+
428
+ # def format_money(amount, currency='usd', opts={})
429
+ # format_currency(amount, currency, opts)
430
+ # end
431
+
432
+ def format_list(items, conjunction="", limit=nil)
433
+ items = items ? items.clone : []
434
+ num_items = items.size
435
+ if limit
436
+ items = items.first(limit)
437
+ end
438
+ last_item = items.pop
439
+ if items.empty?
440
+ return "#{last_item}"
441
+ else
442
+ if limit && limit < num_items
443
+ items << last_item
444
+ last_item = "(#{num_items - items.size} more)"
445
+ end
446
+ return items.join(", ") + (conjunction.to_s.empty? ? ", " : " #{conjunction} ") + "#{last_item}"
447
+ end
448
+ end
449
+
450
+ def anded_list(items, limit=nil)
451
+ format_list(items, "and", limit)
452
+ end
453
+
454
+ def ored_list(items, limit=nil)
455
+ format_list(items, "or", limit)
456
+ end
457
+
458
+ def format_name_values(obj)
459
+ if obj.is_a?(Hash)
460
+ obj.collect {|k,v| "#{k}: #{v}"}.join(", ")
461
+ else
462
+ ""
463
+ end
464
+ end
@@ -277,8 +277,12 @@ module Morpheus
277
277
  end
278
278
  end
279
279
  out << "Commands:\n"
280
- Morpheus::Cli::CliRegistry.all.keys.sort.each {|cmd|
281
- out << "\t#{cmd.to_s}\n"
280
+ sorted_commands = Morpheus::Cli::CliRegistry.all.values.sort { |x,y| x.command_name.to_s <=> y.command_name.to_s }
281
+ sorted_commands.each {|cmd|
282
+ # JD: not ready to show description yet, gotta finish filling in every command first
283
+ # maybe change 'View and manage' to something more concise like 'Manage'
284
+ # out << "\t#{cmd.command_name.to_s.ljust(28, ' ')} #{cmd.command_description}\n"
285
+ out << "\t#{cmd.command_name.to_s}\n"
282
286
  }
283
287
  # out << "Options:\n"
284
288
  out << optparse.to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpheus-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.21
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Estes
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-09-09 00:00:00.000000000 Z
14
+ date: 2020-11-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -185,8 +185,10 @@ files:
185
185
  - lib/morpheus/api/backup_jobs_interface.rb
186
186
  - lib/morpheus/api/backup_settings_interface.rb
187
187
  - lib/morpheus/api/backups_interface.rb
188
+ - lib/morpheus/api/billing_interface.rb
188
189
  - lib/morpheus/api/blueprints_interface.rb
189
190
  - lib/morpheus/api/budgets_interface.rb
191
+ - lib/morpheus/api/catalog_item_types_interface.rb
190
192
  - lib/morpheus/api/cloud_datastores_interface.rb
191
193
  - lib/morpheus/api/cloud_folders_interface.rb
192
194
  - lib/morpheus/api/cloud_policies_interface.rb
@@ -205,6 +207,7 @@ files:
205
207
  - lib/morpheus/api/execute_schedules_interface.rb
206
208
  - lib/morpheus/api/execution_request_interface.rb
207
209
  - lib/morpheus/api/file_copy_request_interface.rb
210
+ - lib/morpheus/api/forgot_password_interface.rb
208
211
  - lib/morpheus/api/group_policies_interface.rb
209
212
  - lib/morpheus/api/groups_interface.rb
210
213
  - lib/morpheus/api/guidance_interface.rb
@@ -271,10 +274,12 @@ files:
271
274
  - lib/morpheus/api/reports_interface.rb
272
275
  - lib/morpheus/api/rest_interface.rb
273
276
  - lib/morpheus/api/roles_interface.rb
277
+ - lib/morpheus/api/search_interface.rb
274
278
  - lib/morpheus/api/security_group_rules_interface.rb
275
279
  - lib/morpheus/api/security_groups_interface.rb
276
280
  - lib/morpheus/api/server_types_interface.rb
277
281
  - lib/morpheus/api/servers_interface.rb
282
+ - lib/morpheus/api/service_catalog_interface.rb
278
283
  - lib/morpheus/api/service_plans_interface.rb
279
284
  - lib/morpheus/api/setup_interface.rb
280
285
  - lib/morpheus/api/storage_providers_interface.rb
@@ -282,6 +287,7 @@ files:
282
287
  - lib/morpheus/api/subnets_interface.rb
283
288
  - lib/morpheus/api/task_sets_interface.rb
284
289
  - lib/morpheus/api/tasks_interface.rb
290
+ - lib/morpheus/api/usage_interface.rb
285
291
  - lib/morpheus/api/user_groups_interface.rb
286
292
  - lib/morpheus/api/user_settings_interface.rb
287
293
  - lib/morpheus/api/user_sources_interface.rb
@@ -305,6 +311,7 @@ files:
305
311
  - lib/morpheus/cli/blueprints_command.rb
306
312
  - lib/morpheus/cli/boot_scripts_command.rb
307
313
  - lib/morpheus/cli/budgets_command.rb
314
+ - lib/morpheus/cli/catalog_item_types_command.rb
308
315
  - lib/morpheus/cli/change_password_command.rb
309
316
  - lib/morpheus/cli/cli_command.rb
310
317
  - lib/morpheus/cli/cli_registry.rb
@@ -333,6 +340,7 @@ files:
333
340
  - lib/morpheus/cli/commands/standard/source_command.rb
334
341
  - lib/morpheus/cli/commands/standard/ssl_verification_command.rb
335
342
  - lib/morpheus/cli/commands/standard/tee_command.rb
343
+ - lib/morpheus/cli/commands/standard/update_command.rb
336
344
  - lib/morpheus/cli/commands/standard/version_command.rb
337
345
  - lib/morpheus/cli/containers_command.rb
338
346
  - lib/morpheus/cli/credentials.rb
@@ -350,6 +358,7 @@ files:
350
358
  - lib/morpheus/cli/execution_request_command.rb
351
359
  - lib/morpheus/cli/expression_parser.rb
352
360
  - lib/morpheus/cli/file_copy_request_command.rb
361
+ - lib/morpheus/cli/forgot_password.rb
353
362
  - lib/morpheus/cli/groups.rb
354
363
  - lib/morpheus/cli/guidance_command.rb
355
364
  - lib/morpheus/cli/health_command.rb
@@ -423,8 +432,10 @@ files:
423
432
  - lib/morpheus/cli/remote.rb
424
433
  - lib/morpheus/cli/reports_command.rb
425
434
  - lib/morpheus/cli/roles.rb
435
+ - lib/morpheus/cli/search_command.rb
426
436
  - lib/morpheus/cli/security_group_rules.rb
427
437
  - lib/morpheus/cli/security_groups.rb
438
+ - lib/morpheus/cli/service_catalog_command.rb
428
439
  - lib/morpheus/cli/service_plans_command.rb
429
440
  - lib/morpheus/cli/setup.rb
430
441
  - lib/morpheus/cli/shell.rb
@@ -432,6 +443,7 @@ files:
432
443
  - lib/morpheus/cli/subnets_command.rb
433
444
  - lib/morpheus/cli/tasks.rb
434
445
  - lib/morpheus/cli/tenants_command.rb
446
+ - lib/morpheus/cli/usage_command.rb
435
447
  - lib/morpheus/cli/user_groups_command.rb
436
448
  - lib/morpheus/cli/user_settings_command.rb
437
449
  - lib/morpheus/cli/user_sources_command.rb