morpheus-cli 5.5.2.2 → 5.5.3.1

Sign up to get free protection for your applications and to get access to all the features.
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 ||= []