morpheus-cli 5.5.1.4 → 5.5.2

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +25 -0
  4. data/lib/morpheus/api/archive_buckets_interface.rb +1 -1
  5. data/lib/morpheus/api/body_io.rb +22 -0
  6. data/lib/morpheus/api/catalog_item_types_interface.rb +5 -1
  7. data/lib/morpheus/api/clients_interface.rb +41 -0
  8. data/lib/morpheus/api/clouds_interface.rb +21 -0
  9. data/lib/morpheus/api/instances_interface.rb +8 -1
  10. data/lib/morpheus/api/integrations_interface.rb +30 -0
  11. data/lib/morpheus/api/library_instance_types_interface.rb +15 -3
  12. data/lib/morpheus/api/network_pool_server_types_interface.rb +9 -0
  13. data/lib/morpheus/api/plugins_interface.rb +22 -0
  14. data/lib/morpheus/api/roles_interface.rb +20 -1
  15. data/lib/morpheus/api/security_package_types_interface.rb +9 -0
  16. data/lib/morpheus/api/security_packages_interface.rb +9 -0
  17. data/lib/morpheus/api/security_scans_interface.rb +9 -0
  18. data/lib/morpheus/api/servers_interface.rb +17 -17
  19. data/lib/morpheus/api/storage_providers_interface.rb +1 -1
  20. data/lib/morpheus/api/virtual_images_interface.rb +1 -23
  21. data/lib/morpheus/cli/cli_command.rb +81 -7
  22. data/lib/morpheus/cli/commands/apps.rb +28 -2
  23. data/lib/morpheus/cli/commands/archives_command.rb +2 -2
  24. data/lib/morpheus/cli/commands/blueprints_command.rb +16 -0
  25. data/lib/morpheus/cli/commands/catalog_item_types_command.rb +34 -2
  26. data/lib/morpheus/cli/commands/clients_command.rb +338 -0
  27. data/lib/morpheus/cli/commands/clouds.rb +127 -1
  28. data/lib/morpheus/cli/commands/clusters.rb +42 -12
  29. data/lib/morpheus/cli/commands/curl_command.rb +114 -135
  30. data/lib/morpheus/cli/commands/hosts.rb +108 -11
  31. data/lib/morpheus/cli/commands/instances.rb +115 -14
  32. data/lib/morpheus/cli/commands/integrations_command.rb +215 -4
  33. data/lib/morpheus/cli/commands/invoices_command.rb +20 -11
  34. data/lib/morpheus/cli/commands/jobs_command.rb +299 -190
  35. data/lib/morpheus/cli/commands/library_cluster_layouts_command.rb +16 -2
  36. data/lib/morpheus/cli/commands/library_container_scripts_command.rb +14 -0
  37. data/lib/morpheus/cli/commands/library_container_templates_command.rb +131 -48
  38. data/lib/morpheus/cli/commands/library_container_types_command.rb +17 -4
  39. data/lib/morpheus/cli/commands/library_instance_types_command.rb +85 -7
  40. data/lib/morpheus/cli/commands/library_layouts_command.rb +32 -1
  41. data/lib/morpheus/cli/commands/library_option_lists_command.rb +30 -18
  42. data/lib/morpheus/cli/commands/library_option_types_command.rb +31 -14
  43. data/lib/morpheus/cli/commands/library_spec_templates_command.rb +14 -0
  44. data/lib/morpheus/cli/commands/library_upgrades_command.rb +2 -2
  45. data/lib/morpheus/cli/commands/network_pool_server_types.rb +20 -0
  46. data/lib/morpheus/cli/commands/network_pool_servers_command.rb +55 -158
  47. data/lib/morpheus/cli/commands/network_pools_command.rb +49 -23
  48. data/lib/morpheus/cli/commands/networks_command.rb +262 -45
  49. data/lib/morpheus/cli/commands/plugins.rb +213 -0
  50. data/lib/morpheus/cli/commands/price_sets_command.rb +40 -10
  51. data/lib/morpheus/cli/commands/prices_command.rb +17 -5
  52. data/lib/morpheus/cli/commands/processes_command.rb +2 -1
  53. data/lib/morpheus/cli/commands/remote.rb +7 -10
  54. data/lib/morpheus/cli/commands/roles.rb +924 -335
  55. data/lib/morpheus/cli/commands/search_command.rb +2 -0
  56. data/lib/morpheus/cli/commands/security_groups.rb +72 -84
  57. data/lib/morpheus/cli/commands/security_package_types.rb +32 -0
  58. data/lib/morpheus/cli/commands/security_packages.rb +84 -0
  59. data/lib/morpheus/cli/commands/security_scans.rb +107 -0
  60. data/lib/morpheus/cli/commands/service_plans_command.rb +16 -14
  61. data/lib/morpheus/cli/commands/subnets_command.rb +15 -1
  62. data/lib/morpheus/cli/commands/tasks.rb +34 -1
  63. data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
  64. data/lib/morpheus/cli/commands/user_settings_command.rb +11 -2
  65. data/lib/morpheus/cli/commands/users.rb +50 -9
  66. data/lib/morpheus/cli/commands/virtual_images.rb +14 -0
  67. data/lib/morpheus/cli/commands/workflows.rb +14 -0
  68. data/lib/morpheus/cli/mixins/accounts_helper.rb +6 -5
  69. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +79 -0
  70. data/lib/morpheus/cli/mixins/jobs_helper.rb +4 -5
  71. data/lib/morpheus/cli/mixins/library_helper.rb +2 -0
  72. data/lib/morpheus/cli/mixins/logs_helper.rb +3 -0
  73. data/lib/morpheus/cli/mixins/monitoring_helper.rb +1 -1
  74. data/lib/morpheus/cli/mixins/print_helper.rb +29 -4
  75. data/lib/morpheus/cli/mixins/provisioning_helper.rb +38 -9
  76. data/lib/morpheus/cli/mixins/rest_command.rb +106 -8
  77. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +6 -2
  78. data/lib/morpheus/cli/option_types.rb +94 -25
  79. data/lib/morpheus/cli/version.rb +1 -1
  80. data/lib/morpheus/formatters.rb +10 -1
  81. metadata +15 -2
@@ -2,172 +2,45 @@ require 'morpheus/cli/cli_command'
2
2
 
3
3
  class Morpheus::Cli::NetworkPoolServersCommand
4
4
  include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::RestCommand
5
6
  include Morpheus::Cli::InfrastructureHelper
6
7
 
8
+ set_command_description "View and manage network pool servers (IPAM integrations)"
7
9
  set_command_name :'network-pool-servers'
8
10
 
9
11
  register_subcommands :list, :get, :add, :update, :remove
12
+ register_subcommands :list_types, :get_type
10
13
 
11
- # set_default_subcommand :list
12
-
13
- def initialize()
14
- # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
15
- end
16
-
17
- def connect(opts)
18
- @api_client = establish_remote_appliance_connection(opts)
19
- @network_pool_servers_interface = @api_client.network_pool_servers
20
- @clouds_interface = @api_client.clouds
21
- @options_interface = @api_client.options
22
- end
14
+ # RestCommand settings
15
+ register_interfaces :network_pool_servers, :network_pool_server_types, :clouds, :options
16
+ set_rest_has_type true
17
+ # set_rest_type :network_pool_server_types
23
18
 
24
19
  def handle(args)
25
20
  handle_subcommand(args)
26
21
  end
27
22
 
28
- def list(args)
29
- options = {}
30
- params = {}
31
- optparse = Morpheus::Cli::OptionParser.new do |opts|
32
- opts.banner = subcommand_usage()
33
- build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :json, :dry_run, :remote])
34
- opts.footer = "List network pool servers."
35
- end
36
- optparse.parse!(args)
37
- connect(options)
38
- begin
39
- params.merge!(parse_list_options(options))
40
- @network_pool_servers_interface.setopts(options)
41
- if options[:dry_run]
42
- print_dry_run @network_pool_servers_interface.dry.list(params)
43
- return
44
- end
45
- json_response = @network_pool_servers_interface.list(params)
46
- network_pool_servers = json_response["networkPoolServers"]
47
- if options[:json]
48
- puts as_json(json_response, options, "networkPoolServers")
49
- return 0
50
- elsif options[:yaml]
51
- puts as_yaml(json_response, options, "networkPoolServers")
52
- return 0
53
- elsif options[:csv]
54
- puts records_as_csv(network_pool_servers, options)
55
- return 0
56
- end
57
- title = "Morpheus Network Pool Servers"
58
- subtitles = []
59
- subtitles += parse_list_subtitles(options)
60
- print_h1 title, subtitles
61
- if network_pool_servers.empty?
62
- print cyan,"No network pool servers found.",reset,"\n"
63
- else
64
- rows = network_pool_servers.collect {|network_pool_server|
65
- row = {
66
- id: network_pool_server['id'],
67
- name: network_pool_server['name'],
68
- # description: network_pool_server['description'],
69
- type: network_pool_server['type'] ? network_pool_server['type']['name'] : '',
70
- pools: network_pool_server['pools'] ? network_pool_server['pools'].collect {|it| it['name'] }.uniq.join(', ') : '',
71
- }
72
- row
73
- }
74
- columns = [:id, :name, :type, :pools]
75
- if options[:include_fields]
76
- columns = options[:include_fields]
77
- end
78
- print cyan
79
- print as_pretty_table(rows, columns, options)
80
- print reset
81
- print_results_pagination(json_response, {:label => "network pool server", :n_label => "network pool servers"})
82
- end
83
- print reset,"\n"
84
- return 0
85
- rescue RestClient::Exception => e
86
- print_rest_exception(e, options)
87
- exit 1
88
- end
89
- end
90
-
91
- def get(args)
92
- options = {}
93
- optparse = Morpheus::Cli::OptionParser.new do |opts|
94
- opts.banner = subcommand_usage("[network-pool-server]")
95
- build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
96
- opts.footer = "Get details about a network pool server." + "\n" +
97
- "[network-pool-server] is required. This is the name or id of a network pool server."
98
- end
99
- optparse.parse!(args)
100
- if args.count != 1
101
- print_error Morpheus::Terminal.angry_prompt
102
- puts_error "#{command_name} missing argument: [network-pool-server]\n#{optparse}"
103
- return 1
104
- end
105
- connect(options)
106
- begin
107
- @network_pool_servers_interface.setopts(options)
108
- if options[:dry_run]
109
- if args[0].to_s =~ /\A\d{1,}\Z/
110
- print_dry_run @network_pool_servers_interface.dry.get(args[0].to_i)
111
- else
112
- print_dry_run @network_pool_servers_interface.dry.list({name:args[0]})
113
- end
114
- return
115
- end
116
- network_pool_server = find_network_pool_server_by_name_or_id(args[0])
117
- return 1 if network_pool_server.nil?
118
- json_response = {'networkPoolServer' => network_pool_server} # skip redundant request
119
- # json_response = @network_pool_servers_interface.get(network_pool_server['id'])
120
- network_pool_server = json_response['networkPoolServer']
121
- if options[:json]
122
- puts as_json(json_response, options, 'networkPoolServer')
123
- return 0
124
- elsif options[:yaml]
125
- puts as_yaml(json_response, options, 'networkPoolServer')
126
- return 0
127
- elsif options[:csv]
128
- puts records_as_csv([network_pool_server], options)
129
- return 0
130
- end
131
- print_h1 "Network Pool Server Details"
132
- print cyan
133
- description_cols = {
134
- "ID" => 'id',
135
- "Name" => lambda {|it| it['name'] },
136
- "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
137
- # "Service URL" => lambda {|it| it['serviceUrl'] : '' },
138
- "Pools" => lambda {|it| it['pools'] ? it['pools'].collect {|p| p['name'] }.uniq.join(', ') : '' },
139
- }
140
- print_description_list(description_cols, network_pool_server)
141
- print reset,"\n"
142
- return 0
143
- rescue RestClient::Exception => e
144
- print_rest_exception(e, options)
145
- return 1
146
- end
147
- end
148
-
149
23
  def add(args)
150
24
  options = {}
151
25
  ip_range_list = nil
152
26
  optparse = Morpheus::Cli::OptionParser.new do |opts|
153
- opts.banner = subcommand_usage()
27
+ opts.banner = subcommand_usage("[name]")
154
28
  opts.on('--name VALUE', String, "Name for this network pool server") do |val|
155
29
  options['name'] = val
156
30
  end
157
31
  opts.on('--type VALUE', String, "Type of network pool server") do |val|
158
32
  options['type'] = val
159
33
  end
34
+ opts.on('--enabled [on|off]', String, "Can be used to disable") do |val|
35
+ options[:options]['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
36
+ end
160
37
  # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
161
38
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
162
39
  opts.footer = "Create a new network pool server." + "\n" +
163
40
  "[name] is required and can be passed as --name instead."
164
41
  end
165
42
  optparse.parse!(args)
166
- if args.count > 1
167
- print_error Morpheus::Terminal.angry_prompt
168
- puts_error "wrong number of arguments, expected 0-1 and got #{args.count}\n#{optparse}"
169
- return 1
170
- end
43
+ verify_args!(args:args, optparse:optparse, max: 1)
171
44
  connect(options)
172
45
  begin
173
46
  # merge -O options into normally parsed options
@@ -210,10 +83,11 @@ class Morpheus::Cli::NetworkPoolServersCommand
210
83
  return 1
211
84
  end
212
85
 
213
- payload['networkPoolServer']['type'] = {'id' => network_type_id.to_i }
214
-
215
- # prompt options
86
+ # prompt options by type
216
87
  network_pool_server_type = @network_pool_servers_interface.get_type(network_type_id.to_i)['networkPoolServerType']
88
+ # use type: "bluecat" instead of id
89
+ #payload['networkPoolServer']['type'] = {'id' => network_type_id.to_i }
90
+ payload['networkPoolServer']['type'] = network_pool_server_type['code']
217
91
  option_result = Morpheus::Cli::OptionTypes.prompt(network_pool_server_type['optionTypes'], options[:options].deep_merge({:context_map => {'networkPoolServer' => ''}}), @api_client, {}, options[:no_prompt], true)
218
92
  payload['networkPoolServer'].deep_merge!(option_result)
219
93
  end
@@ -230,7 +104,7 @@ class Morpheus::Cli::NetworkPoolServersCommand
230
104
  elsif !options[:quiet]
231
105
  network_pool_server = json_response['networkPoolServer']
232
106
  print_green_success "Added network pool server #{network_pool_server['name']}"
233
- get([network_pool_server['id']])
107
+ _get(network_pool_server['id'], {}, options)
234
108
  end
235
109
  return 0
236
110
  rescue RestClient::Exception => e
@@ -247,8 +121,8 @@ class Morpheus::Cli::NetworkPoolServersCommand
247
121
  opts.on('--name VALUE', String, "Name for this network pool server") do |val|
248
122
  options['name'] = val
249
123
  end
250
- opts.on('--type VALUE', String, "Type of network pool server") do |val|
251
- options['description'] = val
124
+ opts.on('--enabled [on|off]', String, "Can be used to enable or disable it") do |val|
125
+ options[:options]['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
252
126
  end
253
127
  # ['name', 'serviceUsername', 'servicePassword', 'servicePort', 'serviceHost', 'serviceUrl', 'serviceMode', 'networkFilter', 'tenantMatch']
254
128
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
@@ -256,11 +130,7 @@ class Morpheus::Cli::NetworkPoolServersCommand
256
130
  "[network-pool-server] is required. This is the id of a network pool server."
257
131
  end
258
132
  optparse.parse!(args)
259
- if args.count != 1
260
- print_error Morpheus::Terminal.angry_prompt
261
- puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
262
- return 1
263
- end
133
+ verify_args!(args:args, optparse:optparse, count: 1)
264
134
  connect(options)
265
135
 
266
136
  begin
@@ -319,7 +189,7 @@ class Morpheus::Cli::NetworkPoolServersCommand
319
189
  else
320
190
  network_pool_server = json_response['networkPoolServer']
321
191
  print_green_success "Updated network pool server #{network_pool_server['name']}"
322
- get([network_pool_server['id']])
192
+ _get(network_pool_server['id'], {}, options)
323
193
  end
324
194
  return 0
325
195
  rescue RestClient::Exception => e
@@ -337,13 +207,7 @@ class Morpheus::Cli::NetworkPoolServersCommand
337
207
  "[network-pool-server] is required. This is the name or id of a network pool server."
338
208
  end
339
209
  optparse.parse!(args)
340
-
341
- if args.count < 1
342
- print_error Morpheus::Terminal.angry_prompt
343
- puts_error "#{command_name} missing argument: [network-pool-server]\n#{optparse}"
344
- return 1
345
- end
346
-
210
+ verify_args!(args:args, optparse:optparse, count: 1)
347
211
  connect(options)
348
212
  begin
349
213
  network_pool_server = find_network_pool_server_by_name_or_id(args[0])
@@ -374,6 +238,39 @@ class Morpheus::Cli::NetworkPoolServersCommand
374
238
 
375
239
  private
376
240
 
241
+ def render_response_for_get(json_response, options)
242
+ # load the type and show fields dynamically based on optionTypes
243
+ render_response(json_response, options, rest_object_key) do
244
+ type_record = rest_type_find_by_name_or_id(json_response[rest_object_key]['type']['id']) rescue nil
245
+ type_option_types = type_record ? (type_record['optionTypes'] || []) : []
246
+ record = json_response[rest_object_key]
247
+ print_h1 rest_label, [], options
248
+ print cyan
249
+ columns = rest_column_definitions(options)
250
+ if record['credential'] && record['credential']['type'] != 'local'
251
+ columns.delete("Username")
252
+ columns.delete("Password")
253
+ end
254
+ columns.delete("Throttle Rate") unless type_option_types.find {|it| it['fieldName'] == 'serviceThrottleRate' }
255
+ columns.delete("Disable SSL SNI") unless type_option_types.find {|it| it['fieldName'] == 'ignoreSsl' }
256
+ columns.delete("Network Filter") unless type_option_types.find {|it| it['fieldName'] == 'networkFilter' }
257
+ columns.delete("Zone Filter") unless type_option_types.find {|it| it['fieldName'] == 'zoneFilter' }
258
+ columns.delete("Tenant Match") unless type_option_types.find {|it| it['fieldName'] == 'tenantMatch' }
259
+ columns.delete("IP Mode") unless type_option_types.find {|it| it['fieldName'] == 'serviceMode' }
260
+ columns.delete("Extra Attributes") unless type_option_types.find {|it| it['fieldName'] == 'extraAttributes' }
261
+ columns.delete("App ID") unless type_option_types.find {|it| it['fieldName'] == 'appId' }
262
+ columns.delete("Inventory Existing") unless type_option_types.find {|it| it['fieldName'] == 'inventoryExisting' }
263
+ columns.delete("Enabled") if record['enabled'].nil? # was not always returned, so don't show false if not present..
264
+ print_description_list(columns, record, options)
265
+ # show Pools
266
+ pools = record['pools']
267
+ if pools && !pools.empty?
268
+ print_h2 "Network Pools"
269
+ print as_pretty_table(pools, [:id, :name], options)
270
+ end
271
+ print reset,"\n"
272
+ end
273
+ end
377
274
 
378
275
  def find_network_pool_server_by_name_or_id(val)
379
276
  if val.to_s =~ /\A\d{1,}\Z/
@@ -17,6 +17,7 @@ class Morpheus::Cli::NetworkPoolsCommand
17
17
  @api_client = establish_remote_appliance_connection(opts)
18
18
  @network_pools_interface = @api_client.network_pools
19
19
  @network_pool_ips_interface = @api_client.network_pool_ips
20
+ @network_pool_servers_interface = @api_client.network_pool_servers
20
21
  @clouds_interface = @api_client.clouds
21
22
  @options_interface = @api_client.options
22
23
  end
@@ -30,6 +31,9 @@ class Morpheus::Cli::NetworkPoolsCommand
30
31
  params = {}
31
32
  optparse = Morpheus::Cli::OptionParser.new do |opts|
32
33
  opts.banner = subcommand_usage()
34
+ opts.on('--pool-server SERVER', String, "Filter by Network Pool Server Name or ID") do |val|
35
+ options[:pool_server] = val
36
+ end
33
37
  build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
34
38
  opts.footer = "List network pools."
35
39
  end
@@ -37,6 +41,14 @@ class Morpheus::Cli::NetworkPoolsCommand
37
41
  connect(options)
38
42
  begin
39
43
  params.merge!(parse_list_options(options))
44
+ if options[:pool_server]
45
+ record = find_by_name_or_id(:network_pool_server, options[:pool_server])
46
+ if record.nil?
47
+ exit 1 #return 1, "Network Pool Server not found by '#{val}'"
48
+ else
49
+ params['poolServerId'] = record['id']
50
+ end
51
+ end
40
52
  @network_pools_interface.setopts(options)
41
53
  if options[:dry_run]
42
54
  print_dry_run @network_pools_interface.dry.list(params)
@@ -69,7 +81,7 @@ class Morpheus::Cli::NetworkPoolsCommand
69
81
  network: network_pool['name'],
70
82
  # network: network_pool['network'] ? network_pool['network']['name'] : '',
71
83
  type: network_pool['type'] ? network_pool['type']['name'] : '',
72
- ipRanges: network_pool['ipRanges'] ? network_pool['ipRanges'].collect {|it| it['startAddress'].to_s + " - " + it['endAddress'].to_s }.uniq.join(', ') : '',
84
+ ipRanges: build_ip_ranges(network_pool['ipRanges']).uniq.join(', '),
73
85
  total: ("#{network_pool['ipCount']}/#{network_pool['freeCount']}")
74
86
  }
75
87
  row
@@ -147,8 +159,8 @@ class Morpheus::Cli::NetworkPoolsCommand
147
159
  print_h2 "IP Ranges"
148
160
  print cyan
149
161
  if network_pool['ipRanges']
150
- network_pool['ipRanges'].each do |r|
151
- puts " * #{r['startAddress']} - #{r['endAddress']}"
162
+ build_ip_ranges(network_pool['ipRanges']).each do |r|
163
+ puts " * #{r}"
152
164
  end
153
165
  end
154
166
  print reset,"\n"
@@ -170,15 +182,11 @@ class Morpheus::Cli::NetworkPoolsCommand
170
182
  opts.on('--type VALUE', String, "Type of network pool") do |val|
171
183
  options['type'] = val
172
184
  end
173
- opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end.") do |list|
185
+ opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end or an IPv6 CIDR") do |list|
174
186
  if list.size == 1 && list[0] == 'null' # hacky way to clear it
175
187
  ip_range_list = []
176
188
  else
177
- ip_range_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
178
- ip_range_list = ip_range_list.collect {|it|
179
- range_parts = it.split("-")
180
- {startAddress: range_parts[0].to_s.strip, endAddress: range_parts[1].to_s.strip}
181
- }
189
+ ip_range_list = parse_ipv4_and_ipv6_ranges(list)
182
190
  end
183
191
  end
184
192
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
@@ -244,13 +252,8 @@ class Morpheus::Cli::NetworkPoolsCommand
244
252
  if ip_range_list
245
253
  payload['networkPool']['ipRanges'] = ip_range_list
246
254
  else
247
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ipRanges', 'fieldLabel' => 'IP Ranges', 'type' => 'text', 'required' => true, 'description' => 'IP Ranges in the pool, comma separated list of ranges in the format start-end.'}], options)
248
- ip_range_list = v_prompt['ipRanges'].to_s.split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
249
- ip_range_list = ip_range_list.collect {|it|
250
- range_parts = it.split("-")
251
- range = {startAddress: range_parts[0].to_s.strip, endAddress: range_parts[1].to_s.strip}
252
- range
253
- }
255
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ipRanges', 'fieldLabel' => 'IP Ranges', 'type' => 'text', 'required' => true, 'description' => 'IP Ranges in the pool, comma separated list of ranges in the format start-end or an IPv6 CIDR'}], options)
256
+ ip_range_list = parse_ipv4_and_ipv6_ranges(v_prompt['ipRanges'].to_s.split(","))
254
257
  payload['networkPool']['ipRanges'] = ip_range_list
255
258
  end
256
259
 
@@ -308,15 +311,11 @@ class Morpheus::Cli::NetworkPoolsCommand
308
311
  # poolEnabled
309
312
  # tftpServer
310
313
  # bootFile
311
- opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end.") do |list|
314
+ opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end or an IPv6 CIDR") do |list|
312
315
  if list.size == 1 && list[0] == 'null' # hacky way to clear it
313
316
  ip_range_list = []
314
317
  else
315
- ip_range_list = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
316
- ip_range_list = ip_range_list.collect {|it|
317
- range_parts = it.split("-")
318
- {startAddress: range_parts[0].to_s.strip, endAddress: range_parts[1].to_s.strip}
319
- }
318
+ ip_range_list = parse_ipv4_and_ipv6_ranges(list)
320
319
  end
321
320
  end
322
321
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
@@ -369,7 +368,7 @@ class Morpheus::Cli::NetworkPoolsCommand
369
368
  # ugh, need to allow changing an existing range by id too
370
369
  if network_pool['ipRanges']
371
370
  existing_range = network_pool['ipRanges'].find {|r|
372
- range[:startAddress] == r['startAddress'] && range[:endAddress] == r['endAddress']
371
+ (range[:startAddress] == r['startAddress'] && range[:endAddress] == r['endAddress']) || range[:cidrIPv6] == r['cidrIPv6']
373
372
  }
374
373
  if existing_range
375
374
  range[:id] = existing_range['id']
@@ -874,4 +873,31 @@ class Morpheus::Cli::NetworkPoolsCommand
874
873
  end
875
874
  end
876
875
 
876
+ def build_ip_ranges(ip_ranges)
877
+ if ip_ranges.empty?
878
+ return []
879
+ else
880
+ ranges = ip_ranges.collect do |it|
881
+ if !it['cidrIPv6'].nil?
882
+ it['cidrIPv6'].to_s
883
+ else
884
+ it['startAddress'].to_s + " - " + it['endAddress'].to_s
885
+ end
886
+ end
887
+ end
888
+ end
889
+
890
+ def parse_ipv4_and_ipv6_ranges(range_string_list)
891
+ ip_range_list = range_string_list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
892
+ ip_range_list = ip_range_list.collect do |range_string|
893
+ if range_string.include?('-')
894
+ range_parts = range_string.split("-")
895
+ {startAddress: range_parts[0].to_s.strip, endAddress: range_parts[1].to_s.strip}
896
+ elsif range_string.include?(':')
897
+ {cidrIPv6: range_string}
898
+ end
899
+ end
900
+ return ip_range_list
901
+ end
902
+
877
903
  end