morpheus-cli 5.5.1.5 → 5.5.2.1

Sign up to get free protection for your applications and to get access to all the features.
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 +27 -8
  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