morpheus-cli 5.4.3.1 → 5.4.4

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +8 -0
  4. data/lib/morpheus/api/catalog_item_types_interface.rb +9 -12
  5. data/lib/morpheus/api/clusters_interface.rb +12 -0
  6. data/lib/morpheus/api/credential_types_interface.rb +9 -0
  7. data/lib/morpheus/api/credentials_interface.rb +9 -0
  8. data/lib/morpheus/api/monitoring_apps_interface.rb +12 -4
  9. data/lib/morpheus/api/monitoring_checks_interface.rb +12 -4
  10. data/lib/morpheus/api/monitoring_groups_interface.rb +13 -5
  11. data/lib/morpheus/api/monitoring_incidents_interface.rb +12 -4
  12. data/lib/morpheus/api/options_interface.rb +8 -1
  13. data/lib/morpheus/api/power_schedules_interface.rb +2 -2
  14. data/lib/morpheus/api/service_plans_interface.rb +6 -0
  15. data/lib/morpheus/cli/cli_command.rb +10 -17
  16. data/lib/morpheus/cli/commands/catalog_item_types_command.rb +75 -8
  17. data/lib/morpheus/cli/commands/clusters.rb +119 -5
  18. data/lib/morpheus/cli/commands/credential_types_command.rb +36 -0
  19. data/lib/morpheus/cli/commands/credentials_command.rb +124 -0
  20. data/lib/morpheus/cli/commands/hosts.rb +20 -2
  21. data/lib/morpheus/cli/commands/instances.rb +5 -1
  22. data/lib/morpheus/cli/commands/monitoring_apps_command.rb +8 -8
  23. data/lib/morpheus/cli/commands/monitoring_checks_command.rb +8 -8
  24. data/lib/morpheus/cli/commands/monitoring_groups_command.rb +8 -8
  25. data/lib/morpheus/cli/commands/monitoring_incidents_command.rb +8 -8
  26. data/lib/morpheus/cli/commands/power_schedules_command.rb +189 -258
  27. data/lib/morpheus/cli/commands/service_plans_command.rb +51 -4
  28. data/lib/morpheus/cli/commands/storage_server_types.rb +0 -5
  29. data/lib/morpheus/cli/commands/storage_servers.rb +0 -6
  30. data/lib/morpheus/cli/commands/storage_volume_types.rb +0 -5
  31. data/lib/morpheus/cli/commands/storage_volumes.rb +0 -6
  32. data/lib/morpheus/cli/mixins/provisioning_helper.rb +37 -27
  33. data/lib/morpheus/cli/mixins/rest_command.rb +20 -4
  34. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +0 -63
  35. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +0 -43
  36. data/lib/morpheus/cli/option_types.rb +1 -0
  37. data/lib/morpheus/cli/version.rb +1 -1
  38. data/lib/morpheus/routes.rb +13 -3
  39. metadata +11 -7
@@ -7,7 +7,7 @@ class Morpheus::Cli::ServicePlanCommand
7
7
 
8
8
  set_command_name :'service-plans'
9
9
 
10
- register_subcommands :list, :get, :add, :update, :activate, :deactivate
10
+ register_subcommands :list, :get, :add, :update, :activate, :deactivate, :remove
11
11
  set_default_subcommand :list
12
12
 
13
13
  def connect(opts)
@@ -119,8 +119,6 @@ class Morpheus::Cli::ServicePlanCommand
119
119
  def _get(plan_id, options = {})
120
120
  params = {}
121
121
  begin
122
- @service_plans_interface.setopts(options)
123
-
124
122
  if !(plan_id.to_s =~ /\A\d{1,}\Z/)
125
123
  plan = find_service_plan(plan_id)
126
124
 
@@ -130,7 +128,7 @@ class Morpheus::Cli::ServicePlanCommand
130
128
  end
131
129
  plan_id = plan['id']
132
130
  end
133
-
131
+ @service_plans_interface.setopts(options)
134
132
  if options[:dry_run]
135
133
  print_dry_run @service_plans_interface.dry.get(plan_id)
136
134
  return
@@ -740,6 +738,55 @@ class Morpheus::Cli::ServicePlanCommand
740
738
  end
741
739
  end
742
740
 
741
+ def remove(args)
742
+ options = {}
743
+ params = {}
744
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
745
+ opts.banner = subcommand_usage( "[plan]")
746
+ build_common_options(opts, options, [:json, :dry_run, :remote, :auto_confirm])
747
+ opts.footer = "Delete a service plan.\n" +
748
+ "[plan] is required. Service plan ID, name or code"
749
+ end
750
+ optparse.parse!(args)
751
+ connect(options)
752
+ if args.count != 1
753
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
754
+ return 1
755
+ end
756
+
757
+ begin
758
+ plan = find_service_plan(args[0])
759
+
760
+ if !plan
761
+ print_red_alert "Service plan #{args[0]} not found"
762
+ return 1
763
+ end
764
+
765
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to delete the service plan '#{plan['name']}'?", options)
766
+ return 9, "aborted command"
767
+ end
768
+
769
+ @service_plans_interface.setopts(options)
770
+ if options[:dry_run]
771
+ print_dry_run @service_plans_interface.dry.destroy(plan['id'], params)
772
+ return
773
+ end
774
+
775
+ json_response = @service_plans_interface.destroy(plan['id'], params)
776
+
777
+ if options[:json]
778
+ print JSON.pretty_generate(json_response)
779
+ print "\n"
780
+ elsif !options[:quiet]
781
+ print_green_success "Service plan #{plan['name']} deleted"
782
+ end
783
+ return 0
784
+ rescue RestClient::Exception => e
785
+ print_rest_exception(e, options)
786
+ exit 1
787
+ end
788
+ end
789
+
743
790
  private
744
791
 
745
792
  def find_service_plan(val)
@@ -41,10 +41,5 @@ class Morpheus::Cli::StorageServerTypes
41
41
  }
42
42
  end
43
43
 
44
- # overridden to support name or code
45
- def find_storage_server_type_by_name_or_id(name)
46
- storage_server_type_for_name_or_id(name)
47
- end
48
-
49
44
  end
50
45
 
@@ -66,12 +66,6 @@ class Morpheus::Cli::StorageServers
66
66
  }
67
67
  end
68
68
 
69
- # overridden to work with name or code
70
- # nope, api works with name=code now too
71
- # def find_storage_server_type_by_name_or_id(name)
72
- # storage_server_type_for_name_or_id(name)
73
- # end
74
-
75
69
  def add_storage_server_option_types()
76
70
  [
77
71
  {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true},
@@ -41,10 +41,5 @@ class Morpheus::Cli::StorageVolumeTypes
41
41
  }
42
42
  end
43
43
 
44
- # overridden to support name or code
45
- def find_storage_volume_type_by_name_or_id(name)
46
- storage_volume_type_for_name_or_id(name)
47
- end
48
-
49
44
  end
50
45
 
@@ -65,12 +65,6 @@ class Morpheus::Cli::StorageVolumes
65
65
  }
66
66
  end
67
67
 
68
- # overridden to work with name or code
69
- # nope, api works with name=code now too
70
- # def find_storage_volume_type_by_name_or_id(name)
71
- # storage_volume_type_for_name_or_id(name)
72
- # end
73
-
74
68
  def add_storage_volume_option_types()
75
69
  [
76
70
  {'fieldContext' => 'storageServer', 'fieldName' => 'id', 'fieldLabel' => 'Storage Server', 'type' => 'select', 'optionSource' => 'storageServers', 'optionParams' => {'createType' => 'block'}, 'required' => true},
@@ -864,7 +864,7 @@ module Morpheus::Cli::ProvisioningHelper
864
864
  if locked_fields.include?('volumes')
865
865
  payload['volumes'] = options[:options]['volumes'] if options[:options]['volumes']
866
866
  else
867
- volumes = prompt_volumes(service_plan, options, api_client, {zoneId: cloud_id, layoutId: layout['id'], siteId: group_id})
867
+ volumes = prompt_volumes(service_plan, provision_type, options, api_client, {zoneId: cloud_id, layoutId: layout['id'], siteId: group_id})
868
868
  if !volumes.empty?
869
869
  payload['volumes'] = volumes
870
870
  end
@@ -912,7 +912,7 @@ module Morpheus::Cli::ProvisioningHelper
912
912
  has_security_groups = !!sg_option_type
913
913
  available_security_groups = []
914
914
  if sg_option_type && sg_option_type['type'] == 'select' && sg_option_type['optionSource']
915
- sg_option_results = options_interface.options_for_source(sg_option_type['optionSource'], sg_api_params)
915
+ sg_option_results = options_interface.options_for_source(sg_option_type['optionSource'], sg_api_params, sg_option_type['optionSourceType'])
916
916
  available_security_groups = sg_option_results['data'].collect do |it|
917
917
  {"id" => it["value"] || it["id"], "name" => it["name"], "value" => it["value"] || it["id"]}
918
918
  end
@@ -1039,7 +1039,7 @@ module Morpheus::Cli::ProvisioningHelper
1039
1039
 
1040
1040
  # This recreates the behavior of multi_disk.js
1041
1041
  # returns array of volumes based on service plan options (plan_info)
1042
- def prompt_volumes(plan_info, options={}, api_client=nil, api_params={})
1042
+ def prompt_volumes(plan_info, provision_type, options={}, api_client=nil, api_params={})
1043
1043
  #puts "Configure Volumes:"
1044
1044
  # return [] if plan_info['noDisks']
1045
1045
 
@@ -1141,14 +1141,19 @@ module Morpheus::Cli::ProvisioningHelper
1141
1141
  volume['name'] = v_prompt[field_context]['name']
1142
1142
  end
1143
1143
  if plan_info['rootDiskCustomizable'] && storage_type && storage_type['customSize']
1144
- if root_custom_size_options.empty?
1145
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'size', 'type' => 'number', 'fieldLabel' => 'Root Volume Size (GB)', 'required' => true, 'description' => 'Enter a volume size (GB).', 'defaultValue' => volume['size']}], options[:options])
1146
- volume['size'] = v_prompt[field_context]['size']
1147
- volume['sizeId'] = nil #volume.delete('sizeId')
1144
+ # provision_type['rootDiskSizeKnown'] == false means size cannot be changed
1145
+ if provision_type['rootDiskSizeKnown'] == false
1146
+ # volume['size'] = plan_size if plan_size.to_i != 0
1148
1147
  else
1149
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'sizeId', 'type' => 'select', 'fieldLabel' => 'Root Volume Size', 'selectOptions' => root_custom_size_options, 'required' => true, 'description' => 'Choose a volume size.', 'defaultValue' => volume['sizeId']}], options[:options])
1150
- volume['sizeId'] = v_prompt[field_context]['sizeId']
1151
- volume['size'] = nil #volume.delete('size')
1148
+ if root_custom_size_options.empty?
1149
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'size', 'type' => 'number', 'fieldLabel' => 'Root Volume Size (GB)', 'required' => true, 'description' => 'Enter a volume size (GB).', 'defaultValue' => volume['size']}], options[:options])
1150
+ volume['size'] = v_prompt[field_context]['size']
1151
+ volume['sizeId'] = nil #volume.delete('sizeId')
1152
+ else
1153
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'sizeId', 'type' => 'select', 'fieldLabel' => 'Root Volume Size', 'selectOptions' => root_custom_size_options, 'required' => true, 'description' => 'Choose a volume size.', 'defaultValue' => volume['sizeId']}], options[:options])
1154
+ volume['sizeId'] = v_prompt[field_context]['sizeId']
1155
+ volume['size'] = nil #volume.delete('size')
1156
+ end
1152
1157
  end
1153
1158
  else
1154
1159
  # might need different logic here ? =o
@@ -1248,7 +1253,7 @@ module Morpheus::Cli::ProvisioningHelper
1248
1253
 
1249
1254
  # This recreates the behavior of multi_disk.js
1250
1255
  # returns array of volumes based on service plan options (plan_info)
1251
- def prompt_resize_volumes(current_volumes, plan_info, options={})
1256
+ def prompt_resize_volumes(current_volumes, plan_info, provision_type, options={})
1252
1257
  #puts "Configure Volumes:"
1253
1258
  no_prompt = (options[:no_prompt] || (options[:options] && options[:options][:no_prompt]))
1254
1259
 
@@ -1328,7 +1333,7 @@ module Morpheus::Cli::ProvisioningHelper
1328
1333
  'id' => current_root_volume['id'],
1329
1334
  'rootVolume' => true,
1330
1335
  'name' => current_root_volume['name'],
1331
- 'size' => current_root_volume['size'] > plan_size ? current_root_volume['size'] : plan_size,
1336
+ 'size' => current_root_volume['size'] > (plan_size || 0) ? current_root_volume['size'] : plan_size,
1332
1337
  'sizeId' => nil,
1333
1338
  'storageType' => storage_type_id,
1334
1339
  'datastoreId' => current_root_volume['datastoreId']
@@ -1339,19 +1344,24 @@ module Morpheus::Cli::ProvisioningHelper
1339
1344
  volume['name'] = v_prompt[field_context]['name']
1340
1345
  end
1341
1346
  if plan_info['rootDiskCustomizable'] && storage_type && storage_type['customSize']
1342
- if root_custom_size_options.empty?
1343
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'size', 'type' => 'number', 'fieldLabel' => 'Root Volume Size (GB)', 'required' => true, 'description' => 'Enter a volume size (GB).', 'defaultValue' => volume['size']}], options[:options])
1344
- volume['size'] = v_prompt[field_context]['size']
1345
- volume['sizeId'] = nil #volume.delete('sizeId')
1347
+ # provision_type['rootDiskSizeKnown'] == false means size cannot be changed
1348
+ if provision_type['rootDiskSizeKnown'] == false
1349
+ # volume['size'] = plan_size if plan_size.to_i != 0
1346
1350
  else
1347
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'sizeId', 'type' => 'select', 'fieldLabel' => 'Root Volume Size', 'selectOptions' => root_custom_size_options, 'required' => true, 'description' => 'Choose a volume size.'}], options[:options])
1348
- volume['sizeId'] = v_prompt[field_context]['sizeId']
1349
- volume['size'] = nil #volume.delete('size')
1351
+ if root_custom_size_options.empty?
1352
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'size', 'type' => 'number', 'fieldLabel' => 'Root Volume Size (GB)', 'required' => true, 'description' => 'Enter a volume size (GB).', 'defaultValue' => volume['size']}], options[:options])
1353
+ volume['size'] = v_prompt[field_context]['size']
1354
+ volume['sizeId'] = nil #volume.delete('sizeId')
1355
+ else
1356
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'sizeId', 'type' => 'select', 'fieldLabel' => 'Root Volume Size', 'selectOptions' => root_custom_size_options, 'required' => true, 'description' => 'Choose a volume size.'}], options[:options])
1357
+ volume['sizeId'] = v_prompt[field_context]['sizeId']
1358
+ volume['size'] = nil #volume.delete('size')
1359
+ end
1350
1360
  end
1351
1361
  else
1352
1362
  # might need different logic here ? =o
1353
- volume['size'] = plan_size
1354
- volume['sizeId'] = nil #volume.delete('sizeId')
1363
+ # volume['size'] = plan_size
1364
+ # volume['sizeId'] = nil #volume.delete('sizeId')
1355
1365
  end
1356
1366
  # if !datastore_options.empty?
1357
1367
  # v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'datastoreId', 'type' => 'select', 'fieldLabel' => 'Root Datastore', 'selectOptions' => datastore_options, 'required' => true, 'description' => 'Choose a datastore.'}], options[:options])
@@ -1379,7 +1389,7 @@ module Morpheus::Cli::ProvisioningHelper
1379
1389
  'id' => current_volume['id'].to_i,
1380
1390
  'rootVolume' => false,
1381
1391
  'name' => current_volume['name'],
1382
- 'size' => current_volume['size'] > plan_size ? current_volume['size'] : plan_size,
1392
+ 'size' => current_volume['size'] > (plan_size || 0) ? current_volume['size'] : plan_size,
1383
1393
  'sizeId' => nil,
1384
1394
  'storageType' => (current_volume['type'] || current_volume['storageType']),
1385
1395
  'datastoreId' => current_volume['datastoreId']
@@ -1404,7 +1414,7 @@ module Morpheus::Cli::ProvisioningHelper
1404
1414
  'id' => current_volume['id'].to_i,
1405
1415
  'rootVolume' => false,
1406
1416
  'name' => current_volume['name'],
1407
- 'size' => current_volume['size'] > plan_size ? current_volume['size'] : plan_size,
1417
+ 'size' => current_volume['size'] > (plan_size || 0) ? current_volume['size'] : plan_size,
1408
1418
  'sizeId' => nil,
1409
1419
  'storageType' => (current_volume['type'] || current_volume['storageType']),
1410
1420
  'datastoreId' => current_volume['datastoreId']
@@ -1426,8 +1436,8 @@ module Morpheus::Cli::ProvisioningHelper
1426
1436
  end
1427
1437
  else
1428
1438
  # might need different logic here ? =o
1429
- volume['size'] = plan_size
1430
- volume['sizeId'] = nil #volume.delete('sizeId')
1439
+ # volume['size'] = plan_size
1440
+ # volume['sizeId'] = nil #volume.delete('sizeId')
1431
1441
  end
1432
1442
  # if !datastore_options.empty?
1433
1443
  # v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'datastoreId', 'type' => 'select', 'fieldLabel' => "Disk #{volume_index} Datastore", 'selectOptions' => datastore_options, 'required' => true, 'description' => 'Choose a datastore.'}], options[:options])
@@ -1492,8 +1502,8 @@ module Morpheus::Cli::ProvisioningHelper
1492
1502
  end
1493
1503
  else
1494
1504
  # might need different logic here ? =o
1495
- volume['size'] = plan_size
1496
- volume['sizeId'] = nil #volume.delete('sizeId')
1505
+ # volume['size'] = plan_size
1506
+ # volume['sizeId'] = nil #volume.delete('sizeId')
1497
1507
  end
1498
1508
  if !datastore_options.empty?
1499
1509
  v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'datastoreId', 'type' => 'select', 'fieldLabel' => "Disk #{volume_index} Datastore", 'selectOptions' => datastore_options, 'required' => true, 'description' => 'Choose a datastore.'}], options[:options])
@@ -336,11 +336,19 @@ module Morpheus::Cli::RestCommand
336
336
  end
337
337
 
338
338
  def rest_object_key
339
- send("#{rest_key}_object_key")
339
+ if respond_to?("#{rest_key}_object_key", true)
340
+ send("#{rest_key}_object_key")
341
+ else
342
+ rest_name.camelcase.singularize
343
+ end
340
344
  end
341
345
 
342
346
  def rest_list_key
343
- send("#{rest_key}_list_key")
347
+ if respond_to?("#{rest_key}_list_key", true)
348
+ send("#{rest_key}_list_key")
349
+ else
350
+ rest_name.camelcase
351
+ end
344
352
  end
345
353
 
346
354
  def rest_column_definitions(options)
@@ -408,11 +416,19 @@ module Morpheus::Cli::RestCommand
408
416
  end
409
417
 
410
418
  def rest_type_object_key
411
- send("#{rest_type_key}_object_key")
419
+ if respond_to?("#{rest_type_key}_object_key", true)
420
+ send("#{rest_type_key}_object_key")
421
+ else
422
+ rest_type_name.camelcase.singularize
423
+ end
412
424
  end
413
425
 
414
426
  def rest_type_list_key
415
- send("#{rest_type_key}_list_key")
427
+ if respond_to?("#{rest_type_key}_list_key", true)
428
+ send("#{rest_type_key}_list_key")
429
+ else
430
+ rest_type_name.camelcase
431
+ end
416
432
  end
417
433
 
418
434
  def rest_type_column_definitions(options)
@@ -90,67 +90,4 @@ module Morpheus::Cli::StorageServersHelper
90
90
  end
91
91
  end
92
92
 
93
- def get_available_storage_server_types(refresh=false)
94
- if !@available_storage_server_types || refresh
95
- @available_storage_server_types = storage_server_types_interface.list({max:1000})[storage_server_type_list_key]
96
- end
97
- return @available_storage_server_types
98
- end
99
-
100
- def storage_server_type_for_name_or_id(val)
101
- if val.to_s =~ /\A\d{1,}\Z/
102
- return storage_server_type_for_id(val)
103
- else
104
- return storage_server_type_for_name(val)
105
- end
106
- end
107
-
108
- def storage_server_type_for_id(id)
109
- return get_available_storage_server_types().find { |z| z['id'].to_i == id.to_i}
110
- end
111
-
112
- def storage_server_type_for_name(name)
113
- return get_available_storage_server_types().find { |z| z['name'].downcase == name.downcase || z['code'].downcase == name.downcase}
114
- end
115
-
116
- def find_storage_server_type_by_name_or_id(val)
117
- if val.to_s =~ /\A\d{1,}\Z/
118
- return find_storage_server_type_by_id(val)
119
- else
120
- return find_storage_server_type_by_name(val)
121
- end
122
- end
123
-
124
- def find_storage_server_type_by_id(id)
125
- begin
126
- json_response = storage_server_types_interface.get(id.to_i)
127
- return json_response[storage_server_type_object_key]
128
- rescue RestClient::Exception => e
129
- if e.response && e.response.code == 404
130
- print_red_alert "Storage Server Type not found by id #{id}"
131
- return nil
132
- else
133
- raise e
134
- end
135
- end
136
- end
137
-
138
- def find_storage_server_type_by_name(name)
139
- json_response = storage_server_types_interface.list({name: name.to_s})
140
- storage_server_types = json_response[storage_server_type_list_key]
141
- if storage_server_types.empty?
142
- print_red_alert "Storage Server Type not found by name #{name}"
143
- return storage_server_types
144
- elsif storage_server_types.size > 1
145
- print_red_alert "#{storage_server_types.size} storage server types found by name #{name}"
146
- rows = storage_server_types.collect do |it|
147
- {id: it['id'], name: it['name']}
148
- end
149
- puts as_pretty_table(rows, [:id, :name], {color:red})
150
- return nil
151
- else
152
- return storage_server_types[0]
153
- end
154
- end
155
-
156
93
  end
@@ -54,49 +54,6 @@ module Morpheus::Cli::StorageVolumesHelper
54
54
  'Storage Volume Types'
55
55
  end
56
56
 
57
- def get_available_storage_volume_types(refresh=false)
58
- if !@available_storage_volume_types || refresh
59
- @available_storage_volume_types = storage_volume_types_interface.list({max:1000})[storage_volume_type_list_key]
60
- end
61
- return @available_storage_volume_types
62
- end
63
-
64
- def storage_volume_type_for_name_or_id(val)
65
- if val.to_s =~ /\A\d{1,}\Z/
66
- return storage_volume_type_for_id(val)
67
- else
68
- return storage_volume_type_for_name(val)
69
- end
70
- end
71
-
72
- def storage_volume_type_for_id(val)
73
- record = get_available_storage_volume_types().find { |z| z['id'].to_i == val.to_i}
74
- label = "Storage Volume Type"
75
- if record.nil?
76
- print_red_alert "#{label} not found by id #{val}"
77
- return nil
78
- end
79
- return record
80
- end
81
-
82
- def storage_volume_type_for_name(val)
83
- records = get_available_storage_volume_types().select { |z| z['name'].downcase == val.downcase || z['code'].downcase == val.downcase}
84
- label = "Storage Volume Type"
85
- if records.empty?
86
- print_red_alert "#{label} not found by name '#{val}'"
87
- return nil
88
- elsif records.size > 1
89
- print_red_alert "More than one #{label.downcase} found by name '#{val}'"
90
- print_error "\n"
91
- puts_error as_pretty_table(records, [:id, :name], {color:red})
92
- print_red_alert "Try using ID instead"
93
- print_error reset,"\n"
94
- return nil
95
- else
96
- return records[0]
97
- end
98
- end
99
-
100
57
  def format_storage_volume_status(record, return_color=cyan)
101
58
  out = ""
102
59
  status_string = record['status']
@@ -231,6 +231,7 @@ module Morpheus
231
231
  print "\n"
232
232
  exit 1
233
233
  else
234
+ parent_context_map.reject! {|k,v| k == parent_ns && (v.nil? || (v.is_a?(Hash) && v.empty?))}
234
235
  next
235
236
  end
236
237
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "5.4.3.1"
4
+ VERSION = "5.4.4"
5
5
  end
6
6
  end
@@ -87,9 +87,19 @@ module Morpheus::Routes
87
87
  :'data-stores' => {}, # ugh, should be datastores
88
88
  servers: {}, # Storage Servers
89
89
  },
90
- # :'keys-and-certs' => {},
91
- :'key-pairs' => {},
92
- certificates: {},
90
+ trust: [
91
+ "#!credentials",
92
+ "#!certificates",
93
+ "#!keypairs",
94
+ "#!services",
95
+ ],
96
+ boot: [
97
+ "#!mappings",
98
+ "#!boot-menus",
99
+ "#!answerfiles",
100
+ "#!boot-images",
101
+ "#!macs",
102
+ ],
93
103
  },
94
104
  backups: {
95
105
 
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morpheus-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.3.1
4
+ version: 5.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Estes
8
8
  - Bob Whiton
9
9
  - Jeremy Michael Crosbie
10
10
  - James Dickson
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2022-02-14 00:00:00.000000000 Z
14
+ date: 2022-03-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -200,6 +200,8 @@ files:
200
200
  - lib/morpheus/api/clouds_interface.rb
201
201
  - lib/morpheus/api/clusters_interface.rb
202
202
  - lib/morpheus/api/containers_interface.rb
203
+ - lib/morpheus/api/credential_types_interface.rb
204
+ - lib/morpheus/api/credentials_interface.rb
203
205
  - lib/morpheus/api/custom_instance_types_interface.rb
204
206
  - lib/morpheus/api/cypher_interface.rb
205
207
  - lib/morpheus/api/dashboard_interface.rb
@@ -356,6 +358,8 @@ files:
356
358
  - lib/morpheus/cli/commands/clusters.rb
357
359
  - lib/morpheus/cli/commands/coloring_command.rb
358
360
  - lib/morpheus/cli/commands/containers_command.rb
361
+ - lib/morpheus/cli/commands/credential_types_command.rb
362
+ - lib/morpheus/cli/commands/credentials_command.rb
359
363
  - lib/morpheus/cli/commands/curl_command.rb
360
364
  - lib/morpheus/cli/commands/cypher_command.rb
361
365
  - lib/morpheus/cli/commands/dashboard_command.rb
@@ -526,11 +530,11 @@ files:
526
530
  - lib/morpheus/terminal.rb
527
531
  - lib/morpheus/util.rb
528
532
  - morpheus-cli.gemspec
529
- homepage:
533
+ homepage:
530
534
  licenses:
531
535
  - MIT
532
536
  metadata: {}
533
- post_install_message:
537
+ post_install_message:
534
538
  rdoc_options: []
535
539
  require_paths:
536
540
  - lib
@@ -545,9 +549,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
545
549
  - !ruby/object:Gem::Version
546
550
  version: '0'
547
551
  requirements: []
548
- rubyforge_project:
552
+ rubyforge_project:
549
553
  rubygems_version: 2.7.6
550
- signing_key:
554
+ signing_key:
551
555
  specification_version: 4
552
556
  summary: Provides CLI Interface to the Morpheus Public/Private Cloud Appliance
553
557
  test_files: []