morpheus-cli 5.5.2.2 → 5.5.3.1

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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/Dockerfile +1 -1
  4. data/README.md +57 -4
  5. data/Rakefile +9 -0
  6. data/bin/morpheus +4 -4
  7. data/lib/morpheus/api/api_client.rb +20 -2
  8. data/lib/morpheus/api/appliance_settings_interface.rb +15 -0
  9. data/lib/morpheus/api/archive_buckets_interface.rb +1 -1
  10. data/lib/morpheus/api/archive_files_interface.rb +3 -3
  11. data/lib/morpheus/api/clients_interface.rb +2 -2
  12. data/lib/morpheus/api/clusters_interface.rb +8 -1
  13. data/lib/morpheus/api/containers_interface.rb +29 -16
  14. data/lib/morpheus/api/custom_instance_types_interface.rb +0 -2
  15. data/lib/morpheus/api/cypher_interface.rb +1 -2
  16. data/lib/morpheus/api/doc_interface.rb +8 -6
  17. data/lib/morpheus/api/file_copy_request_interface.rb +1 -1
  18. data/lib/morpheus/api/guidance_settings_interface.rb +17 -0
  19. data/lib/morpheus/api/health_interface.rb +1 -1
  20. data/lib/morpheus/api/image_builder_interface.rb +3 -3
  21. data/lib/morpheus/api/instances_interface.rb +25 -0
  22. data/lib/morpheus/api/logs_interface.rb +2 -4
  23. data/lib/morpheus/api/monitoring_interface.rb +6 -6
  24. data/lib/morpheus/api/monitoring_settings_interface.rb +25 -0
  25. data/lib/morpheus/api/network_server_groups_interface.rb +7 -0
  26. data/lib/morpheus/api/packages_interface.rb +1 -1
  27. data/lib/morpheus/api/reports_interface.rb +1 -1
  28. data/lib/morpheus/api/servers_interface.rb +9 -1
  29. data/lib/morpheus/api/storage_providers_interface.rb +2 -2
  30. data/lib/morpheus/api/virtual_images_interface.rb +1 -1
  31. data/lib/morpheus/api.rb +2 -0
  32. data/lib/morpheus/benchmarking.rb +1 -1
  33. data/lib/morpheus/cli/cli_command.rb +79 -37
  34. data/lib/morpheus/cli/cli_registry.rb +19 -10
  35. data/lib/morpheus/cli/commands/access_token_command.rb +1 -1
  36. data/lib/morpheus/cli/commands/appliance_settings_command.rb +57 -2
  37. data/lib/morpheus/cli/commands/apps.rb +1 -1
  38. data/lib/morpheus/cli/commands/archives_command.rb +25 -33
  39. data/lib/morpheus/cli/commands/backup_settings_command.rb +1 -1
  40. data/lib/morpheus/cli/commands/blueprints_command.rb +10 -21
  41. data/lib/morpheus/cli/commands/boot_scripts_command.rb +2 -2
  42. data/lib/morpheus/cli/commands/cat_command.rb +1 -1
  43. data/lib/morpheus/cli/commands/catalog_item_types_command.rb +18 -13
  44. data/lib/morpheus/cli/commands/clouds.rb +3 -3
  45. data/lib/morpheus/cli/commands/clusters.rb +154 -3
  46. data/lib/morpheus/cli/commands/containers_command.rb +398 -253
  47. data/lib/morpheus/cli/commands/cypher_command.rb +3 -0
  48. data/lib/morpheus/cli/commands/deployments.rb +1 -1
  49. data/lib/morpheus/cli/commands/deploys.rb +9 -9
  50. data/lib/morpheus/cli/commands/doc.rb +15 -16
  51. data/lib/morpheus/cli/commands/execution_request_command.rb +2 -2
  52. data/lib/morpheus/cli/commands/file_copy_request_command.rb +5 -5
  53. data/lib/morpheus/cli/commands/groups.rb +2 -2
  54. data/lib/morpheus/cli/commands/guidance_command.rb +2 -2
  55. data/lib/morpheus/cli/commands/guidance_settings.rb +148 -0
  56. data/lib/morpheus/cli/commands/health_command.rb +4 -4
  57. data/lib/morpheus/cli/commands/hosts.rb +43 -5
  58. data/lib/morpheus/cli/commands/image_builder_command.rb +1 -1
  59. data/lib/morpheus/cli/commands/instances.rb +419 -148
  60. data/lib/morpheus/cli/commands/integrations_command.rb +22 -20
  61. data/lib/morpheus/cli/commands/key_pairs.rb +2 -2
  62. data/lib/morpheus/cli/commands/library_container_scripts_command.rb +2 -2
  63. data/lib/morpheus/cli/commands/library_container_templates_command.rb +2 -2
  64. data/lib/morpheus/cli/commands/library_instance_types_command.rb +3 -3
  65. data/lib/morpheus/cli/commands/library_spec_templates_command.rb +2 -2
  66. data/lib/morpheus/cli/commands/log_settings_command.rb +1 -1
  67. data/lib/morpheus/cli/commands/login.rb +1 -1
  68. data/lib/morpheus/cli/commands/man_command.rb +32 -18
  69. data/lib/morpheus/cli/commands/monitoring_settings.rb +228 -0
  70. data/lib/morpheus/cli/commands/network_server_groups_command.rb +222 -0
  71. data/lib/morpheus/cli/commands/packages_command.rb +11 -11
  72. data/lib/morpheus/cli/commands/plugins.rb +1 -1
  73. data/lib/morpheus/cli/commands/policies_command.rb +4 -4
  74. data/lib/morpheus/cli/commands/preseed_scripts_command.rb +2 -2
  75. data/lib/morpheus/cli/commands/provisioning_settings_command.rb +1 -1
  76. data/lib/morpheus/cli/commands/remote.rb +1 -1
  77. data/lib/morpheus/cli/commands/reports_command.rb +13 -3
  78. data/lib/morpheus/cli/commands/security_groups.rb +1 -1
  79. data/lib/morpheus/cli/commands/shell.rb +40 -62
  80. data/lib/morpheus/cli/commands/snapshots.rb +3 -5
  81. data/lib/morpheus/cli/commands/source_command.rb +8 -16
  82. data/lib/morpheus/cli/commands/storage_providers_command.rb +7 -7
  83. data/lib/morpheus/cli/commands/tasks.rb +2 -2
  84. data/lib/morpheus/cli/commands/vdi_pools_command.rb +6 -6
  85. data/lib/morpheus/cli/commands/view.rb +5 -1
  86. data/lib/morpheus/cli/commands/whitelabel_settings_command.rb +5 -5
  87. data/lib/morpheus/cli/commands/whoami.rb +2 -2
  88. data/lib/morpheus/cli/credentials.rb +30 -8
  89. data/lib/morpheus/cli/dot_file.rb +8 -15
  90. data/lib/morpheus/cli/error_handler.rb +16 -0
  91. data/lib/morpheus/cli/errors.rb +8 -1
  92. data/lib/morpheus/cli/mixins/print_helper.rb +17 -13
  93. data/lib/morpheus/cli/mixins/provisioning_helper.rb +14 -12
  94. data/lib/morpheus/cli/mixins/rest_command.rb +23 -19
  95. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +47 -24
  96. data/lib/morpheus/cli/option_parser.rb +5 -1
  97. data/lib/morpheus/cli/option_types.rb +59 -12
  98. data/lib/morpheus/cli/version.rb +1 -1
  99. data/lib/morpheus/cli.rb +26 -16
  100. data/lib/morpheus/ext/rest_client.rb +3 -2
  101. data/lib/morpheus/ext/string.rb +6 -4
  102. data/lib/morpheus/formatters.rb +1 -1
  103. data/lib/morpheus/logging.rb +4 -4
  104. data/lib/morpheus/morpkg.rb +4 -4
  105. data/lib/morpheus/rest_client.rb +2 -2
  106. data/lib/morpheus/routes.rb +41 -9
  107. data/lib/morpheus/terminal.rb +65 -16
  108. data/lib/morpheus.rb +1 -1
  109. data/morpheus-cli.gemspec +1 -0
  110. data/test/api/containers_interface_test.rb +68 -0
  111. data/test/api/doc_interface_test.rb +35 -0
  112. data/test/api/instances_interface_test.rb +22 -0
  113. data/test/api/whoami_interface_test.rb +14 -0
  114. data/test/cli/access_token_test.rb +36 -0
  115. data/test/cli/auth_test.rb +82 -0
  116. data/test/cli/cli_test.rb +48 -0
  117. data/test/cli/containers_test.rb +92 -0
  118. data/test/cli/doc_test.rb +35 -0
  119. data/test/cli/help_test.rb +25 -0
  120. data/test/cli/instances_test.rb +36 -0
  121. data/test/cli/man_test.rb +14 -0
  122. data/test/cli/remote_test.rb +89 -0
  123. data/test/cli/roles_test.rb +34 -0
  124. data/test/cli/shell_test.rb +81 -0
  125. data/test/cli/version_test.rb +23 -0
  126. data/test/cli/view_test.rb +55 -0
  127. data/test/cli/whoami_test.rb +17 -0
  128. data/test/morpheus_test.rb +16 -0
  129. data/test/test_case.rb +338 -0
  130. data/test/test_config.rb +137 -0
  131. data/test/test_data_helper.rb +97 -0
  132. metadata +67 -3
@@ -14,7 +14,7 @@ module Morpheus::Cli
14
14
 
15
15
  end
16
16
 
17
- # An error indicating the command was not recoginzed
17
+ # An error indicating the command was not recognized, assigned exit code 127
18
18
  class CommandNotFoundError < CommandError
19
19
 
20
20
  def initialize(msg, args=[], optparse=nil, exit_code=nil)
@@ -40,7 +40,14 @@ module Morpheus::Cli
40
40
  def initialize(msg, args=[], optparse=nil, exit_code=nil)
41
41
  super(msg, args, optparse, exit_code || 1)
42
42
  end
43
+ end
44
+
45
+ # An error indicating the user declined to accept a confirmation prompt, assigned exit code 9
46
+ class CommandAborted < CommandError
43
47
 
48
+ def initialize(msg, args=[], optparse=nil, exit_code=nil)
49
+ super(msg, args, optparse, exit_code || 9)
50
+ end
44
51
  end
45
52
 
46
53
  end
@@ -144,7 +144,7 @@ module Morpheus::Cli::PrintHelper
144
144
  data = {}
145
145
  begin
146
146
  data = JSON.parse(e.response.to_s)
147
- rescue => ex
147
+ rescue
148
148
  # Morpheus::Logging::DarkPrinter.puts "Failed to parse error response as JSON: #{ex}" if Morpheus::Logging.debug?
149
149
  end
150
150
  return data
@@ -1329,19 +1329,19 @@ module Morpheus::Cli::PrintHelper
1329
1329
  outfile = nil
1330
1330
  begin
1331
1331
  full_filename = File.expand_path(filename)
1332
- if File.exists?(full_filename)
1332
+ if File.exist?(full_filename)
1333
1333
  if !overwrite
1334
1334
  print "#{red}Output file '#{filename}' already exists.#{reset}\n"
1335
1335
  print "#{red}Use --overwrite to overwrite the existing file.#{reset}\n"
1336
1336
  return 1
1337
1337
  end
1338
1338
  end
1339
- if Dir.exists?(full_filename)
1339
+ if Dir.exist?(full_filename)
1340
1340
  print "#{red}Output file '#{filename}' is invalid. It is the name of an existing directory.#{reset}\n"
1341
1341
  return 1
1342
1342
  end
1343
1343
  target_dir = File.dirname(full_filename)
1344
- if !Dir.exists?(target_dir)
1344
+ if !Dir.exist?(target_dir)
1345
1345
  FileUtils.mkdir_p(target_dir)
1346
1346
  end
1347
1347
  outfile = File.open(full_filename, access_mode)
@@ -1362,19 +1362,19 @@ module Morpheus::Cli::PrintHelper
1362
1362
  outfile = nil
1363
1363
  begin
1364
1364
  full_filename = File.expand_path(filename)
1365
- if File.exists?(full_filename)
1365
+ if File.exist?(full_filename)
1366
1366
  if !overwrite
1367
1367
  print "#{red}Output file '#{filename}' already exists.#{reset}\n"
1368
1368
  print "#{red}Use --overwrite to overwrite the existing file.#{reset}\n"
1369
1369
  return 1
1370
1370
  end
1371
1371
  end
1372
- if Dir.exists?(full_filename)
1372
+ if Dir.exist?(full_filename)
1373
1373
  print "#{red}Output file '#{filename}' is invalid. It is the name of an existing directory.#{reset}\n"
1374
1374
  return 1
1375
1375
  end
1376
1376
  target_dir = File.dirname(full_filename)
1377
- if !Dir.exists?(target_dir)
1377
+ if !Dir.exist?(target_dir)
1378
1378
  FileUtils.mkdir_p(target_dir)
1379
1379
  end
1380
1380
  outfile = File.open(full_filename, access_mode)
@@ -1402,13 +1402,17 @@ module Morpheus::Cli::PrintHelper
1402
1402
  end
1403
1403
  end
1404
1404
 
1405
- def format_percent(val, sig_dig=2)
1405
+ def format_percent(val, sig_dig=2, hide_zero=false)
1406
1406
  if val.nil?
1407
1407
  return ""
1408
1408
  end
1409
1409
  percent_value = val.to_f
1410
1410
  if percent_value == 0
1411
- return "0%"
1411
+ if hide_zero
1412
+ ""
1413
+ else
1414
+ return "0%"
1415
+ end
1412
1416
  else
1413
1417
  return percent_value.round(sig_dig).to_s + "%"
1414
1418
  end
@@ -1431,8 +1435,8 @@ module Morpheus::Cli::PrintHelper
1431
1435
 
1432
1436
  # convert JSON or YAML string to a map
1433
1437
  def parse_json_or_yaml(config, parsers = [:json, :yaml])
1434
- rtn = {success: false, data: nil, err: nil}
1435
- err = nil
1438
+ rtn = {success: false, data: nil, error: nil}
1439
+ error = nil
1436
1440
  config = config.strip
1437
1441
  if config[0..2] == "---"
1438
1442
  parsers = [:yaml]
@@ -1455,7 +1459,7 @@ module Morpheus::Cli::PrintHelper
1455
1459
  rtn[:success] = true
1456
1460
  break
1457
1461
  rescue => ex
1458
- rtn[:err] = ex if rtn[:err].nil?
1462
+ rtn[:error] = ex if rtn[:error].nil?
1459
1463
  end
1460
1464
  elsif parser == :json
1461
1465
  begin
@@ -1464,7 +1468,7 @@ module Morpheus::Cli::PrintHelper
1464
1468
  rtn[:success] = true
1465
1469
  break
1466
1470
  rescue => ex
1467
- rtn[:err] = ex if rtn[:err].nil?
1471
+ rtn[:error] = ex if rtn[:error].nil?
1468
1472
  end
1469
1473
  end
1470
1474
  end
@@ -1435,7 +1435,7 @@ module Morpheus::Cli::ProvisioningHelper
1435
1435
  'id' => current_volume['id'].to_i,
1436
1436
  'rootVolume' => false,
1437
1437
  'name' => current_volume['name'],
1438
- 'size' => current_volume['size'] > (plan_size || 0) ? current_volume['size'] : plan_size,
1438
+ 'size' => current_volume['size'] ? current_volume['size'] : (plan_size || 0),
1439
1439
  'sizeId' => nil,
1440
1440
  'storageType' => (current_volume['type'] || current_volume['storageType']),
1441
1441
  'datastoreId' => current_volume['datastoreId']
@@ -2003,9 +2003,10 @@ module Morpheus::Cli::ProvisioningHelper
2003
2003
  group_access = nil
2004
2004
  all_plans = nil
2005
2005
  plan_access = nil
2006
+ permissions = {}
2006
2007
 
2007
2008
  # Group Access
2008
- if !excludes.include?('groups')
2009
+ unless excludes.include?('groups')
2009
2010
  if !options[:groupAccessAll].nil?
2010
2011
  all_groups = options[:groupAccessAll]
2011
2012
  end
@@ -2055,7 +2056,7 @@ module Morpheus::Cli::ProvisioningHelper
2055
2056
  end
2056
2057
 
2057
2058
  # Plan Access
2058
- if !excludes.include?('plans')
2059
+ unless excludes.include?('plans')
2059
2060
  if !options[:planAccessAll].nil?
2060
2061
  all_plans = options[:planAccessAll]
2061
2062
  end
@@ -2101,13 +2102,14 @@ module Morpheus::Cli::ProvisioningHelper
2101
2102
  end
2102
2103
  end
2103
2104
 
2104
- resource_perms = {}
2105
- resource_perms['all'] = all_groups if !all_groups.nil?
2106
- resource_perms['sites'] = group_access if !group_access.nil?
2107
- resource_perms['allPlans'] = all_plans if !all_plans.nil?
2108
- resource_perms['plans'] = plan_access if !plan_access.nil?
2109
-
2110
- permissions = {'resourcePermissions' => resource_perms}
2105
+ unless excludes.include?('resource')
2106
+ resource_perms = {}
2107
+ resource_perms['all'] = all_groups if !all_groups.nil?
2108
+ resource_perms['sites'] = group_access if !group_access.nil?
2109
+ resource_perms['allPlans'] = all_plans if !all_plans.nil?
2110
+ resource_perms['plans'] = plan_access if !plan_access.nil?
2111
+ permissions['resourcePermissions'] = resource_perms
2112
+ end
2111
2113
 
2112
2114
  available_accounts = get_available_accounts() #.collect {|it| {'name' => it['name'], 'value' => it['id']}}
2113
2115
  accounts = []
@@ -2115,7 +2117,7 @@ module Morpheus::Cli::ProvisioningHelper
2115
2117
  # Prompts for multi tenant
2116
2118
  if available_accounts.count > 1
2117
2119
  visibility = options[:visibility]
2118
- if !excludes.include?('visibility')
2120
+ unless excludes.include?('visibility')
2119
2121
  if !visibility && !options[:no_prompt]
2120
2122
  visibility = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'visibility', 'fieldLabel' => 'Tenant Permissions Visibility', 'type' => 'select', 'defaultValue' => 'private', 'required' => true, 'selectOptions' => [{'name' => 'Private', 'value' => 'private'},{'name' => 'Public', 'value' => 'public'}]}], options[:options], @api_client, {})['visibility']
2121
2123
  end
@@ -2123,7 +2125,7 @@ module Morpheus::Cli::ProvisioningHelper
2123
2125
  end
2124
2126
 
2125
2127
  # Tenants
2126
- if !excludes.include?('tenants')
2128
+ unless excludes.include?('tenants')
2127
2129
  if !options[:tenants].nil?
2128
2130
  accounts = options[:tenants].collect {|id| id.to_i}
2129
2131
  elsif !options[:no_prompt]
@@ -43,7 +43,7 @@ module Morpheus::Cli::RestCommand
43
43
  # It is used to derive all other default rest settings key, label, etc.
44
44
  # The default name the command name with underscores `_` instead of dashes `-`.
45
45
  def rest_name
46
- @rest_name || default_rest_name
46
+ defined?(@rest_name) ? @rest_name : default_rest_name
47
47
  end
48
48
 
49
49
  def default_rest_name
@@ -58,7 +58,7 @@ module Morpheus::Cli::RestCommand
58
58
 
59
59
  # rest_key is the singular name of the resource eg. "neat_thing"
60
60
  def rest_key
61
- @rest_key || default_rest_key
61
+ defined?(@rest_key) ? @rest_key : default_rest_key
62
62
  end
63
63
 
64
64
  def default_rest_key
@@ -73,7 +73,7 @@ module Morpheus::Cli::RestCommand
73
73
 
74
74
  # rest_arg is a label for the arg in the command usage eg. "thing" gets displayed as [thing]
75
75
  def rest_arg
76
- @rest_arg || default_rest_arg
76
+ defined?(@rest_arg) ? @rest_arg : default_rest_arg
77
77
  end
78
78
 
79
79
  def default_rest_arg
@@ -89,7 +89,7 @@ module Morpheus::Cli::RestCommand
89
89
  # rest_has_name indicates a resource has a name and can be retrieved by name or id
90
90
  # true by default, set to false for lookups by only id
91
91
  def rest_has_name
92
- @rest_has_name != nil ? @rest_has_name : default_rest_has_name
92
+ defined?(@rest_has_name) ? @rest_has_name : default_rest_has_name
93
93
  end
94
94
 
95
95
  def default_rest_has_name
@@ -104,7 +104,7 @@ module Morpheus::Cli::RestCommand
104
104
 
105
105
  # rest_label is the capitalized resource label eg. "Neat Thing"
106
106
  def rest_label
107
- @rest_label || default_rest_label
107
+ defined?(@rest_label) ? @rest_label : default_rest_label
108
108
  end
109
109
 
110
110
  def default_rest_label
@@ -119,7 +119,7 @@ module Morpheus::Cli::RestCommand
119
119
 
120
120
  # the plural version of the label eg. "Neat Things"
121
121
  def rest_label_plural
122
- @rest_label_plural || default_rest_label_plural
122
+ defined?(@rest_label_plural) ? @rest_label_plural : default_rest_label_plural
123
123
  end
124
124
 
125
125
  def default_rest_label_plural
@@ -135,7 +135,7 @@ module Morpheus::Cli::RestCommand
135
135
 
136
136
  # rest_interface_name is the interface name for the resource. eg. "neat_things"
137
137
  def rest_interface_name
138
- @rest_interface_name || default_rest_interface_name
138
+ defined?(@rest_interface_name) ? @rest_interface_name : default_rest_interface_name
139
139
  end
140
140
 
141
141
  def default_rest_interface_name
@@ -150,7 +150,7 @@ module Morpheus::Cli::RestCommand
150
150
 
151
151
  # rest_perms_config enables and configures permissions prompt
152
152
  def rest_perms_config
153
- @rest_perms_config || {}
153
+ defined?(@rest_perms_config) ? @rest_perms_config : {}
154
154
  end
155
155
 
156
156
  def rest_perms_config=(v)
@@ -161,7 +161,7 @@ module Morpheus::Cli::RestCommand
161
161
 
162
162
  # rest_option_context_map specifies context mapping during option prompt. default is domain => ''
163
163
  def rest_option_context_map
164
- @option_context_map || {'domain' => ''}
164
+ defined?(@option_context_map) ? @option_context_map : {'domain' => ''}
165
165
  end
166
166
 
167
167
  def rest_option_context_map=(v)
@@ -172,7 +172,7 @@ module Morpheus::Cli::RestCommand
172
172
 
173
173
  # rest_has_type indicates a resource has a type. default is false
174
174
  def rest_has_type
175
- @rest_has_type == true
175
+ defined?(@rest_has_type) && @rest_has_type
176
176
  end
177
177
 
178
178
  def default_rest_has_type
@@ -189,7 +189,7 @@ module Morpheus::Cli::RestCommand
189
189
 
190
190
  # rest_type_name is the rest_name for the type, only applicable if rest_has_type
191
191
  def rest_type_name
192
- @rest_type_name || default_rest_type_name
192
+ defined?(@rest_type_name) ? @rest_type_name : default_rest_type_name
193
193
  end
194
194
 
195
195
  def default_rest_type_name
@@ -206,7 +206,7 @@ module Morpheus::Cli::RestCommand
206
206
 
207
207
  # rest_type_key is the singular name of the resource eg. "neat_thing"
208
208
  def rest_type_key
209
- @rest_type_key || default_rest_type_key
209
+ defined?(@rest_type_key) ? @rest_type_key : default_rest_type_key
210
210
  end
211
211
 
212
212
  def default_rest_type_key
@@ -220,7 +220,7 @@ module Morpheus::Cli::RestCommand
220
220
  alias :set_rest_type_key :rest_type_key=
221
221
 
222
222
  def rest_type_arg
223
- @rest_type_arg || default_rest_type_arg
223
+ defined?(@rest_type_arg) ? @rest_type_arg : default_rest_type_arg
224
224
  end
225
225
 
226
226
  def default_rest_type_arg
@@ -236,7 +236,7 @@ module Morpheus::Cli::RestCommand
236
236
 
237
237
  # rest_type_label is the capitalized resource label eg. "Neat Thing"
238
238
  def rest_type_label
239
- @rest_type_label || default_rest_type_label
239
+ defined?(@rest_type_label) ? @rest_type_label : default_rest_type_label
240
240
  end
241
241
 
242
242
  def default_rest_type_label
@@ -251,7 +251,7 @@ module Morpheus::Cli::RestCommand
251
251
 
252
252
  # the plural version of the label eg. "Neat Things"
253
253
  def rest_type_label_plural
254
- @rest_type_label_plural || default_rest_type_label_plural
254
+ defined?(@rest_type_label_plural) ? @rest_type_label_plural : default_rest_type_label_plural
255
255
  end
256
256
 
257
257
  def default_rest_type_label_plural
@@ -267,7 +267,7 @@ module Morpheus::Cli::RestCommand
267
267
 
268
268
  # the name of the default interface, matches the rest name eg. "neat_things"
269
269
  def rest_type_interface_name
270
- @rest_type_interface_name || default_rest_type_interface_name
270
+ defined?(@rest_type_interface_name) ? @rest_type_interface_name : default_rest_type_interface_name
271
271
  end
272
272
 
273
273
  def default_rest_type_interface_name
@@ -720,9 +720,13 @@ EOT
720
720
  else
721
721
  perms = prompt_permissions(options.deep_merge(rest_perms_config[:options] || {}), rest_perms_config[:excludes] || [])
722
722
  end
723
- if !rest_perms_config[:name].nil?
723
+ unless rest_perms_config[:name].nil?
724
724
  perms.transform_keys! {|k| k == 'resourcePermissions' ? rest_perms_config[:name] : k}
725
725
  end
726
+ unless rest_perms_config[:context].nil?
727
+ perms_context = {}
728
+ perms_context[rest_perms_config[:context]] = perms
729
+ end
726
730
  record_payload.merge!(perms)
727
731
  end
728
732
  payload[rest_object_key] = record_payload
@@ -742,7 +746,6 @@ EOT
742
746
  end
743
747
 
744
748
  def update(args)
745
- id = args[0]
746
749
  record_type = nil
747
750
  record_type_id = nil
748
751
  options = {}
@@ -762,6 +765,7 @@ EOT
762
765
  optparse.parse!(args)
763
766
  verify_args!(args:args, optparse:optparse, count:1)
764
767
  connect(options)
768
+ id = args[0]
765
769
  record = rest_find_by_name_or_id(id)
766
770
  if record.nil?
767
771
  return 1, "#{rest_name} not found for '#{id}'"
@@ -857,7 +861,6 @@ EOT
857
861
  end
858
862
 
859
863
  def remove(args)
860
- id = args[0]
861
864
  params = {}
862
865
  options = {}
863
866
  optparse = Morpheus::Cli::OptionParser.new do |opts|
@@ -872,6 +875,7 @@ EOT
872
875
  verify_args!(args:args, optparse:optparse, count:1)
873
876
  connect(options)
874
877
  params.merge!(parse_query_options(options))
878
+ id = args[0]
875
879
  record = rest_find_by_name_or_id(id)
876
880
  if record.nil?
877
881
  return 1, "#{rest_name} not found for '#{id}'"
@@ -33,7 +33,7 @@ module Morpheus::Cli::SecondaryRestCommand
33
33
 
34
34
  # rest_parent_name is the rest_name for the parent
35
35
  def rest_parent_name
36
- @rest_parent_name || default_rest_parent_name
36
+ defined?(@rest_parent_name) ? @rest_parent_name : default_rest_parent_name
37
37
  end
38
38
 
39
39
  def default_rest_parent_name
@@ -58,7 +58,7 @@ module Morpheus::Cli::SecondaryRestCommand
58
58
 
59
59
  # rest_parent_key is the singular name of the resource eg. "neat_thing"
60
60
  def rest_parent_key
61
- @rest_parent_key || default_rest_parent_key
61
+ defined?(@rest_parent_key) ? @rest_parent_key : default_rest_parent_key
62
62
  end
63
63
 
64
64
  def default_rest_parent_key
@@ -72,7 +72,7 @@ module Morpheus::Cli::SecondaryRestCommand
72
72
  alias :set_rest_parent_key :rest_parent_key=
73
73
 
74
74
  def rest_parent_arg
75
- @rest_parent_arg || default_rest_parent_arg
75
+ defined?(@rest_parent_arg) ? @rest_parent_arg : default_rest_parent_arg
76
76
  end
77
77
 
78
78
  def default_rest_parent_arg
@@ -86,7 +86,7 @@ module Morpheus::Cli::SecondaryRestCommand
86
86
  alias :set_rest_parent_arg :rest_parent_arg=
87
87
 
88
88
  def rest_parent_param
89
- @rest_parent_param || default_rest_parent_param
89
+ defined?(@rest_parent_param) ? @rest_parent_param : default_rest_parent_param
90
90
  end
91
91
 
92
92
  def default_rest_parent_param
@@ -103,7 +103,7 @@ module Morpheus::Cli::SecondaryRestCommand
103
103
  # rest_parent_has_name indicates a resource has a name and can be retrieved by name or id
104
104
  # true by default, set to false for lookups by only id
105
105
  def rest_parent_has_name
106
- @rest_parent_has_name != nil ? @rest_parent_has_name : default_rest_parent_has_name
106
+ defined?(@rest_parent_has_name) ? @rest_parent_has_name : default_rest_parent_has_name
107
107
  end
108
108
 
109
109
  def default_rest_parent_has_name
@@ -118,7 +118,7 @@ module Morpheus::Cli::SecondaryRestCommand
118
118
 
119
119
  # rest_parent_label is the capitalized resource label eg. "Neat Thing"
120
120
  def rest_parent_label
121
- @rest_parent_label || default_rest_parent_label
121
+ defined?(@rest_parent_label) ? @rest_parent_label : default_rest_parent_label
122
122
  end
123
123
 
124
124
  def default_rest_parent_label
@@ -133,7 +133,7 @@ module Morpheus::Cli::SecondaryRestCommand
133
133
 
134
134
  # the plural version of the label eg. "Neat Things"
135
135
  def rest_parent_label_plural
136
- @rest_parent_label_plural || default_rest_parent_label_plural
136
+ defined?(@rest_parent_label_plural) ? @rest_parent_label_plural : default_rest_parent_label_plural
137
137
  end
138
138
 
139
139
  def default_rest_parent_label_plural
@@ -149,7 +149,7 @@ module Morpheus::Cli::SecondaryRestCommand
149
149
 
150
150
  # the name of the default interface, matches the rest name eg. "neat_things"
151
151
  def rest_parent_interface_name
152
- @rest_parent_interface_name || default_rest_parent_interface_name
152
+ defined?(@rest_parent_interface_name) ? @rest_parent_interface_name : default_rest_parent_interface_name
153
153
  end
154
154
 
155
155
  def default_rest_parent_interface_name
@@ -294,7 +294,7 @@ EOT
294
294
  if records.nil? || records.empty?
295
295
  print cyan,"No #{rest_label_plural.downcase} found.",reset,"\n"
296
296
  else
297
- print as_pretty_table(records, rest_list_column_definitions(options).upcase_keys!, options)
297
+ print as_pretty_table(records, rest_list_column_definitions(options.merge({:parent_record => parent_record})).upcase_keys!, options)
298
298
  print_results_pagination(json_response) if json_response['meta']
299
299
  end
300
300
  print reset,"\n"
@@ -318,17 +318,15 @@ EOT
318
318
  verify_args!(args:args, optparse:optparse, min:2)
319
319
  connect(options)
320
320
  parse_get_options!(args.count > 1 ? args[1..-1] : [], options, params)
321
- parent_id = args[0]
321
+ _get(args[0], args[1..-1].join(" "), params, options)
322
+ end
323
+
324
+ def _get(parent_id, id, params, options)
322
325
  parent_record = rest_parent_find_by_name_or_id(parent_id)
323
326
  if parent_record.nil?
324
327
  return 1, "#{rest_parent_label} not found for '#{parent_id}"
325
328
  end
326
329
  parent_id = parent_record['id']
327
- id = args[1..-1].join(" ")
328
- _get(parent_id, id, params, options)
329
- end
330
-
331
- def _get(parent_id, id, params, options)
332
330
  if id !~ /\A\d{1,}\Z/
333
331
  record = rest_find_by_name_or_id(parent_id, id)
334
332
  if record.nil?
@@ -342,7 +340,7 @@ EOT
342
340
  return
343
341
  end
344
342
  json_response = rest_interface.get(parent_id, id, params)
345
- render_response_for_get(json_response, options)
343
+ render_response_for_get(json_response, options.merge({:parent_record => parent_record}))
346
344
  return 0, nil
347
345
  end
348
346
 
@@ -357,14 +355,19 @@ EOT
357
355
  print_h2 "Option Types", options
358
356
  print format_option_types_table(record['optionTypes'], options, rest_object_key)
359
357
  end
358
+ render_response_details_for_get(record, options)
360
359
  print reset,"\n"
361
360
  end
362
361
  end
363
362
 
363
+ def render_response_details_for_get(record, options)
364
+ # override for custom details
365
+ end
366
+
364
367
  def add(args)
365
368
  parent_id, parent_record = nil, nil
366
369
  record_type_id = nil
367
- options = {}
370
+ options = {:options => {:context_map => rest_option_context_map}}
368
371
  option_types = respond_to?("add_#{rest_key}_option_types", true) ? send("add_#{rest_key}_option_types") : []
369
372
  advanced_option_types = respond_to?("add_#{rest_key}_advanced_option_types", true) ? send("add_#{rest_key}_advanced_option_types") : []
370
373
  type_option_type = option_types.find {|it| it['fieldName'] == 'type'}
@@ -473,7 +476,7 @@ EOT
473
476
  end
474
477
  if my_option_types && !my_option_types.empty?
475
478
  # remove redundant fieldContext
476
- my_option_types.each do |option_type|
479
+ my_option_types.each do |option_type|
477
480
  if option_type['fieldContext'] == rest_object_key
478
481
  option_type['fieldContext'] = nil
479
482
  end
@@ -491,6 +494,26 @@ EOT
491
494
  v_prompt.booleanize! # 'on' => true
492
495
  record_payload.deep_merge!(v_prompt)
493
496
  end
497
+ if respond_to?("#{rest_key}_add_prompt", true)
498
+ record_payload = send("#{rest_key}_add_prompt", record_payload, record_type, parent_record, options)
499
+ end
500
+ # permissions
501
+ if rest_perms_config[:enabled]
502
+ if rest_perms_config[:version] == 2
503
+ perms = prompt_permissions_v2(options.deep_merge(rest_perms_config[:options] || {}), rest_perms_config[:excludes] || [])
504
+ else
505
+ perms = prompt_permissions(options.deep_merge(rest_perms_config[:options] || {}), rest_perms_config[:excludes] || [])
506
+ end
507
+ unless rest_perms_config[:name].nil?
508
+ perms.transform_keys! {|k| k == 'resourcePermissions' ? rest_perms_config[:name] : k}
509
+ end
510
+ unless rest_perms_config[:context].nil?
511
+ perms_context = {}
512
+ perms_context[rest_perms_config[:context]] = perms
513
+ perms = perms_context
514
+ end
515
+ record_payload.merge!(perms)
516
+ end
494
517
  payload[rest_object_key] = record_payload
495
518
  end
496
519
  rest_interface.setopts(options)
@@ -502,8 +525,8 @@ EOT
502
525
  if json_response['success']
503
526
  render_response(json_response, options, rest_object_key) do
504
527
  record = json_response[rest_object_key]
505
- print_green_success "Added #{rest_label.downcase} #{record['name'] || record['id']}"
506
- return _get(parent_id, record["id"], {}, options)
528
+ print_green_success "Added #{rest_label.downcase} #{record.nil? ? json_response['id'] : record['name'] || record['id']}"
529
+ return _get(parent_id, record.nil? ? json_response['id'] : record['id'], {}, options)
507
530
  end
508
531
  else
509
532
  print red
@@ -514,8 +537,6 @@ EOT
514
537
  end
515
538
 
516
539
  def update(args)
517
- parent_id = args[0]
518
- id = args[1]
519
540
  record_type = nil
520
541
  record_type_id = nil
521
542
  options = {}
@@ -533,6 +554,8 @@ EOT
533
554
  optparse.parse!(args)
534
555
  verify_args!(args:args, optparse:optparse, count:2)
535
556
  connect(options)
557
+ parent_id = args[0]
558
+ id = args[1]
536
559
  parent_record = rest_parent_find_by_name_or_id(parent_id)
537
560
  if parent_record.nil?
538
561
  return 1, "#{rest_parent_label} not found for '#{parent_id}"
@@ -633,8 +656,6 @@ EOT
633
656
  end
634
657
 
635
658
  def remove(args)
636
- parent_id = args[0]
637
- id = args[1]
638
659
  params = {}
639
660
  options = {}
640
661
  optparse = Morpheus::Cli::OptionParser.new do |opts|
@@ -649,6 +670,8 @@ EOT
649
670
  optparse.parse!(args)
650
671
  verify_args!(args:args, optparse:optparse, count:2)
651
672
  connect(options)
673
+ parent_id = args[0]
674
+ id = args[1]
652
675
  parent_record = rest_parent_find_by_name_or_id(parent_id)
653
676
  if parent_record.nil?
654
677
  return 1, "#{rest_parent_label} not found for '#{parent_id}"
@@ -43,7 +43,7 @@ module Morpheus
43
43
  my_summaries.each do |full_line|
44
44
  opt_description = full_line.to_s.strip
45
45
  if opt_description.start_with?("-")
46
- is_hidden = (@hidden_options || []).find { |hidden_switch|
46
+ is_hidden = (hidden_options || []).find { |hidden_switch|
47
47
  if hidden_switch.start_with?("-")
48
48
  opt_description.start_with?("#{hidden_switch} ")
49
49
  else
@@ -74,6 +74,10 @@ module Morpheus
74
74
  out
75
75
  end
76
76
 
77
+ def hidden_options
78
+ @hidden_options ||= []
79
+ end
80
+
77
81
  def add_hidden_option(opt_name)
78
82
  opt_array = [opt_name].flatten.compact
79
83
  @hidden_options ||= []