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.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +25 -0
- data/lib/morpheus/api/archive_buckets_interface.rb +1 -1
- data/lib/morpheus/api/body_io.rb +22 -0
- data/lib/morpheus/api/catalog_item_types_interface.rb +5 -1
- data/lib/morpheus/api/clients_interface.rb +41 -0
- data/lib/morpheus/api/clouds_interface.rb +21 -0
- data/lib/morpheus/api/instances_interface.rb +8 -1
- data/lib/morpheus/api/integrations_interface.rb +30 -0
- data/lib/morpheus/api/library_instance_types_interface.rb +15 -3
- data/lib/morpheus/api/network_pool_server_types_interface.rb +9 -0
- data/lib/morpheus/api/plugins_interface.rb +22 -0
- data/lib/morpheus/api/roles_interface.rb +20 -1
- data/lib/morpheus/api/security_package_types_interface.rb +9 -0
- data/lib/morpheus/api/security_packages_interface.rb +9 -0
- data/lib/morpheus/api/security_scans_interface.rb +9 -0
- data/lib/morpheus/api/servers_interface.rb +17 -17
- data/lib/morpheus/api/storage_providers_interface.rb +1 -1
- data/lib/morpheus/api/virtual_images_interface.rb +1 -23
- data/lib/morpheus/cli/cli_command.rb +81 -7
- data/lib/morpheus/cli/commands/apps.rb +28 -2
- data/lib/morpheus/cli/commands/archives_command.rb +2 -2
- data/lib/morpheus/cli/commands/blueprints_command.rb +16 -0
- data/lib/morpheus/cli/commands/catalog_item_types_command.rb +34 -2
- data/lib/morpheus/cli/commands/clients_command.rb +338 -0
- data/lib/morpheus/cli/commands/clouds.rb +127 -1
- data/lib/morpheus/cli/commands/clusters.rb +42 -12
- data/lib/morpheus/cli/commands/curl_command.rb +114 -135
- data/lib/morpheus/cli/commands/hosts.rb +108 -11
- data/lib/morpheus/cli/commands/instances.rb +115 -14
- data/lib/morpheus/cli/commands/integrations_command.rb +215 -4
- data/lib/morpheus/cli/commands/invoices_command.rb +20 -11
- data/lib/morpheus/cli/commands/jobs_command.rb +299 -190
- data/lib/morpheus/cli/commands/library_cluster_layouts_command.rb +16 -2
- data/lib/morpheus/cli/commands/library_container_scripts_command.rb +14 -0
- data/lib/morpheus/cli/commands/library_container_templates_command.rb +131 -48
- data/lib/morpheus/cli/commands/library_container_types_command.rb +17 -4
- data/lib/morpheus/cli/commands/library_instance_types_command.rb +85 -7
- data/lib/morpheus/cli/commands/library_layouts_command.rb +32 -1
- data/lib/morpheus/cli/commands/library_option_lists_command.rb +30 -18
- data/lib/morpheus/cli/commands/library_option_types_command.rb +31 -14
- data/lib/morpheus/cli/commands/library_spec_templates_command.rb +14 -0
- data/lib/morpheus/cli/commands/library_upgrades_command.rb +2 -2
- data/lib/morpheus/cli/commands/network_pool_server_types.rb +20 -0
- data/lib/morpheus/cli/commands/network_pool_servers_command.rb +55 -158
- data/lib/morpheus/cli/commands/network_pools_command.rb +49 -23
- data/lib/morpheus/cli/commands/networks_command.rb +262 -45
- data/lib/morpheus/cli/commands/plugins.rb +213 -0
- data/lib/morpheus/cli/commands/price_sets_command.rb +27 -8
- data/lib/morpheus/cli/commands/prices_command.rb +17 -5
- data/lib/morpheus/cli/commands/processes_command.rb +2 -1
- data/lib/morpheus/cli/commands/remote.rb +7 -10
- data/lib/morpheus/cli/commands/roles.rb +924 -335
- data/lib/morpheus/cli/commands/search_command.rb +2 -0
- data/lib/morpheus/cli/commands/security_groups.rb +72 -84
- data/lib/morpheus/cli/commands/security_package_types.rb +32 -0
- data/lib/morpheus/cli/commands/security_packages.rb +84 -0
- data/lib/morpheus/cli/commands/security_scans.rb +107 -0
- data/lib/morpheus/cli/commands/service_plans_command.rb +16 -14
- data/lib/morpheus/cli/commands/subnets_command.rb +15 -1
- data/lib/morpheus/cli/commands/tasks.rb +34 -1
- data/lib/morpheus/cli/commands/tenants_command.rb +1 -1
- data/lib/morpheus/cli/commands/user_settings_command.rb +11 -2
- data/lib/morpheus/cli/commands/users.rb +50 -9
- data/lib/morpheus/cli/commands/virtual_images.rb +14 -0
- data/lib/morpheus/cli/commands/workflows.rb +14 -0
- data/lib/morpheus/cli/mixins/accounts_helper.rb +6 -5
- data/lib/morpheus/cli/mixins/infrastructure_helper.rb +79 -0
- data/lib/morpheus/cli/mixins/jobs_helper.rb +4 -5
- data/lib/morpheus/cli/mixins/library_helper.rb +2 -0
- data/lib/morpheus/cli/mixins/logs_helper.rb +3 -0
- data/lib/morpheus/cli/mixins/monitoring_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/print_helper.rb +29 -4
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +38 -9
- data/lib/morpheus/cli/mixins/rest_command.rb +106 -8
- data/lib/morpheus/cli/mixins/secondary_rest_command.rb +6 -2
- data/lib/morpheus/cli/option_types.rb +94 -25
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/formatters.rb +10 -1
- 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
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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('--
|
251
|
-
options['
|
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
|
-
|
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
|
-
|
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']
|
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
|
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
|
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
|
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
|
248
|
-
ip_range_list = v_prompt['ipRanges'].to_s.split(",")
|
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
|
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
|
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
|