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.
- 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 +40 -10
- 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
|