morpheus-cli 4.1.5 → 4.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8cf9fe88c6a717fcd35c655ca1bf208842bd6669c793a698cbee17d6a1c6263a
4
- data.tar.gz: fc1ecf887d8b6bd1ef7b3de650d1a2a9d88bd13a7fc4b6a781858623da57dcd3
3
+ metadata.gz: c550fa0412be48d0457ca10f54822e7b77e25bb515e6c5cb6092d43f9aee66a6
4
+ data.tar.gz: a8949f6a0ace1bc99f6a327ebe30e8f9678c9922c9a3d8a776543475c94141f0
5
5
  SHA512:
6
- metadata.gz: 2af125ef03ebc7cfcdd528f069c33a4af72e037039b3256c954bb2e8f75511989b25be9b06a5508a49d28ebfe2686ecec6057ba19066c4daf466135570d3a9bd
7
- data.tar.gz: ccf40b9d7d5e1a0bc7f12d5cb9249da035c5d043028fbf5ceb58dfdf95f2fad5b53eda43a0e9521060f92d77fd2e6369cbbe53616b92bf78ad762c241014aac8
6
+ metadata.gz: 46e33763b7980a60312a7479d0104dab355e34c8a01e7a561b98a18468360a975dbbc26fabc2f61ac7f0506be8e8c4f3dbc8fc998d23cd6b1481cdedbb341d1a
7
+ data.tar.gz: 6e64c4f697547bbad0fcba6e9aeb6ec218daf37491d5b0ebb4b309ac523a3389aeb621e6c9265035c6233bc3b0b7189d36d5ba9c08133d2d104430135802d598
@@ -490,12 +490,12 @@ class Morpheus::APIClient
490
490
  Morpheus::NetworkTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
491
491
  end
492
492
 
493
- def network_subnets
494
- Morpheus::NetworkSubnetsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
493
+ def subnets
494
+ Morpheus::SubnetsInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
495
495
  end
496
496
 
497
- def network_subnet_types
498
- Morpheus::NetworkSubnetTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
497
+ def subnet_types
498
+ Morpheus::SubnetTypesInterface.new(@access_token, @refresh_token, @expires_at, @base_url).setopts(@options)
499
499
  end
500
500
 
501
501
  def network_groups
@@ -1,5 +1,6 @@
1
1
  require 'morpheus/api/api_client'
2
2
 
3
+ # This is deprecated, use SubnetsInterface instead.
3
4
  class Morpheus::NetworkSubnetsInterface < Morpheus::APIClient
4
5
  def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
5
6
  @access_token = access_token
@@ -15,7 +15,7 @@ class Morpheus::SecurityGroupsInterface < Morpheus::APIClient
15
15
  end
16
16
 
17
17
  def get(id, params={})
18
- url = "#{@base_url}/api/security-groups"
18
+ url = "#{@base_url}/api/security-groups/#{id}"
19
19
  headers = { params: {}, authorization: "Bearer #{@access_token}" }
20
20
 
21
21
  if options.is_a?(Hash)
@@ -1,6 +1,6 @@
1
1
  require 'morpheus/api/api_client'
2
2
 
3
- class Morpheus::NetworkSubnetTypesInterface < Morpheus::APIClient
3
+ class Morpheus::SubnetTypesInterface < Morpheus::APIClient
4
4
  def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
5
5
  @access_token = access_token
6
6
  @refresh_token = refresh_token
@@ -10,14 +10,14 @@ class Morpheus::NetworkSubnetTypesInterface < Morpheus::APIClient
10
10
 
11
11
  def get(id, params={})
12
12
  raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
13
- url = "#{@base_url}/api/network-subnet-types/#{id}"
13
+ url = "#{@base_url}/api/subnet-types/#{id}"
14
14
  headers = { params: params, authorization: "Bearer #{@access_token}" }
15
15
  opts = {method: :get, url: url, headers: headers}
16
16
  execute(opts)
17
17
  end
18
18
 
19
19
  def list(params={})
20
- url = "#{@base_url}/api/network-subnet-types"
20
+ url = "#{@base_url}/api/subnet-types"
21
21
  headers = { params: params, authorization: "Bearer #{@access_token}" }
22
22
  opts = {method: :get, url: url, headers: headers}
23
23
  execute(opts)
@@ -24,7 +24,7 @@ class Morpheus::SubnetsInterface < Morpheus::APIClient
24
24
  end
25
25
 
26
26
  def create(network_id, payload)
27
- url = "#{@base_url}/api/subnets"
27
+ url = "#{@base_url}/api/networks/#{network_id}/subnets"
28
28
  headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
29
29
  opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
30
30
  execute(opts)
@@ -3,15 +3,13 @@ require 'morpheus/cli/cli_command'
3
3
  class Morpheus::Cli::ApplianceSettingsCommand
4
4
  include Morpheus::Cli::CliCommand
5
5
  include Morpheus::Cli::AccountsHelper
6
-
6
+ set_command_hidden # hide until 4.2.0
7
7
  set_command_name :'appliance-settings'
8
8
 
9
9
  register_subcommands :get, :update
10
10
 
11
11
  set_default_subcommand :get
12
12
 
13
- set_command_hidden # hiding until 4.2 release
14
-
15
13
  def connect(opts)
16
14
  @api_client = establish_remote_appliance_connection(opts)
17
15
  @appliance_settings_interface = @api_client.appliance_settings
@@ -966,6 +966,10 @@ module Morpheus
966
966
  else
967
967
  output = records_as_csv([row], options)
968
968
  end
969
+ elsif options[:quiet]
970
+ # note: returning non nil means the calling function knows to return rght away.. kinda weird..
971
+ # but means we need less if options[:quiet] blocks in every action.
972
+ output = ""
969
973
  end
970
974
  if output
971
975
  if options[:outfile]
@@ -354,7 +354,7 @@ module Morpheus
354
354
  @@appliance_credentials_map = load_credentials_file || {}
355
355
  @@appliance_credentials_map.delete(appliance_name.to_s)
356
356
  @@appliance_credentials_map.delete(appliance_name.to_sym)
357
- Morpheus::Logging::DarkPrinter.puts "clearing credentials for #{appliance_name} from file #{credentials_file_path}" if Morpheus::Logging.debug?
357
+ #Morpheus::Logging::DarkPrinter.puts "clearing credentials for #{appliance_name} from file #{credentials_file_path}" if Morpheus::Logging.debug?
358
358
  File.open(credentials_file_path, 'w') {|f| f.write @@appliance_credentials_map.to_yaml } #Store
359
359
  ::Morpheus::Cli::Remote.recalculate_variable_map()
360
360
  true
@@ -376,7 +376,7 @@ module Morpheus
376
376
  def load_credentials_file
377
377
  fn = credentials_file_path
378
378
  if File.exist? fn
379
- Morpheus::Logging::DarkPrinter.puts "loading credentials file #{fn}" if Morpheus::Logging.debug?
379
+ #Morpheus::Logging::DarkPrinter.puts "loading credentials file #{fn}" if Morpheus::Logging.debug?
380
380
  return YAML.load_file(fn)
381
381
  else
382
382
  return nil
@@ -405,7 +405,7 @@ module Morpheus
405
405
  if !Dir.exists?(File.dirname(fn))
406
406
  FileUtils.mkdir_p(File.dirname(fn))
407
407
  end
408
- Morpheus::Logging::DarkPrinter.puts "adding credentials for #{appliance_name} to #{fn}" if Morpheus::Logging.debug?
408
+ #Morpheus::Logging::DarkPrinter.puts "adding credentials for #{appliance_name} to #{fn}" if Morpheus::Logging.debug?
409
409
  File.open(fn, 'w') {|f| f.write credential_map.to_yaml } #Store
410
410
  FileUtils.chmod(0600, fn)
411
411
  @@appliance_credentials_map = credential_map
@@ -442,8 +442,7 @@ module Morpheus
442
442
  if !Dir.exists?(File.dirname(fn))
443
443
  FileUtils.mkdir_p(File.dirname(fn))
444
444
  end
445
- #Morpheus::Logging::DarkPrinter.puts "renaming credentials for #{appliance_name} to #{fn}" if Morpheus::Logging.debug?
446
- Morpheus::Logging::DarkPrinter.puts "renaming credentials from #{appliance_name} to #{appliance_name}" if Morpheus::Logging.debug?
445
+ #Morpheus::Logging::DarkPrinter.puts "renaming credentials from #{appliance_name} to #{new_appliance_name}" if Morpheus::Logging.debug?
447
446
  File.open(fn, 'w') {|f| f.write credential_map.to_yaml } #Store
448
447
  FileUtils.chmod(0600, fn)
449
448
  @@appliance_credentials_map = credential_map
@@ -17,11 +17,13 @@ class Morpheus::Cli::ErrorHandler
17
17
  def handle_error(err, options={})
18
18
  exit_code = 1
19
19
  options = (options || {}).clone
20
- # heh
21
- if Morpheus::Logging.debug? && options[:debug].nil?
20
+ if Morpheus::Logging.debug?
22
21
  options[:debug] = true
23
22
  end
24
23
  do_print_stacktrace = true
24
+
25
+ #@stderr.puts "#{dark}Handling error #{err.class} - #{err}#{reset}"
26
+
25
27
  case (err)
26
28
  when ::OptionParser::InvalidOption, ::OptionParser::AmbiguousOption,
27
29
  ::OptionParser::MissingArgument, ::OptionParser::InvalidArgument,
@@ -61,10 +63,7 @@ class Morpheus::Cli::ErrorHandler
61
63
  when RestClient::Exception
62
64
  print_rest_exception(err, options)
63
65
  # no stacktrace for now...
64
- return exit_code
65
- # if !options[:debug]
66
- # return exit_code
67
- # end
66
+ return exit_code, err
68
67
  when ArgumentError
69
68
  @stderr.puts "#{red}Argument Error: #{err.message}#{reset}"
70
69
  else
@@ -83,7 +82,7 @@ class Morpheus::Cli::ErrorHandler
83
82
  end
84
83
  end
85
84
 
86
- return exit_code
85
+ return exit_code, err
87
86
 
88
87
  end
89
88
 
@@ -149,7 +148,8 @@ class Morpheus::Cli::ErrorHandler
149
148
  @stderr.print red, "Error Communicating with the Appliance. #{e}", reset, "\n"
150
149
  end
151
150
  # uh, having this print method return exit_code, err to standardize return values of methods that are still calling it, at the end just by chance..
152
- return exit_code, err #.to_s
151
+ # return exit_code, err
152
+ return 1, err
153
153
  end
154
154
 
155
155
  def print_rest_errors(response, options={})
@@ -773,7 +773,7 @@ public
773
773
  def load_group_file
774
774
  fn = groups_file_path
775
775
  if File.exist? fn
776
- Morpheus::Logging::DarkPrinter.puts "loading groups file #{fn}" if Morpheus::Logging.debug?
776
+ #Morpheus::Logging::DarkPrinter.puts "loading groups file #{fn}" if Morpheus::Logging.debug?
777
777
  return YAML.load_file(fn)
778
778
  else
779
779
  {}
@@ -68,10 +68,10 @@ class Morpheus::Cli::License
68
68
  return exit_code, err
69
69
  end
70
70
 
71
- # if exit_code != 0
72
- # print_error red, err.to_s, reset, "\n"
73
- # return exit_code, err
74
- # end
71
+ if exit_code != 0
72
+ print_error red, err.to_s, reset, "\n"
73
+ return exit_code, err
74
+ end
75
75
 
76
76
  # render output
77
77
 
@@ -143,8 +143,8 @@ class Morpheus::Cli::License
143
143
  if options[:json]
144
144
  puts JSON.pretty_generate(json_response)
145
145
  else
146
- print_green_success "License applied successfully!"
147
- # get([]) # show it
146
+ print_green_success "License installed!"
147
+ get([] + (options[:remote] ? ["-r",options[:remote]] : []))
148
148
  end
149
149
  return 0
150
150
  rescue RestClient::Exception => e
@@ -265,12 +265,6 @@ class Morpheus::Cli::License
265
265
  end
266
266
 
267
267
  json_response = @license_interface.uninstall(params)
268
-
269
- @apps_interface.setopts(options)
270
- if options[:dry_run]
271
- print_dry_run @apps_interface.dry.wiki(app["id"], params)
272
- return
273
- end
274
268
  render_result = render_with_format(json_response, options)
275
269
  return 0 if render_result
276
270
  return 0 if options[:quiet]
@@ -21,6 +21,36 @@ module Morpheus::Cli::InfrastructureHelper
21
21
  @clouds_interface
22
22
  end
23
23
 
24
+ def networks_interface
25
+ # @api_client.networks
26
+ raise "#{self.class} has not defined @networks_interface" if @networks_interface.nil?
27
+ @networks_interface
28
+ end
29
+
30
+ def subnets_interface
31
+ # @api_client.subnets
32
+ raise "#{self.class} has not defined @subnets_interface" if @subnets_interface.nil?
33
+ @subnets_interface
34
+ end
35
+
36
+ def network_groups_interface
37
+ # @api_client.network_groups
38
+ raise "#{self.class} has not defined @network_groups_interface" if @network_groups_interface.nil?
39
+ @network_groups_interface
40
+ end
41
+
42
+ def network_types_interface
43
+ # @api_client.network_types
44
+ raise "#{self.class} has not defined @network_types_interface" if @network_types_interface.nil?
45
+ @network_types_interface
46
+ end
47
+
48
+ def subnet_types_interface
49
+ # @api_client.subnet_types
50
+ raise "#{self.class} has not defined @subnet_types_interface" if @subnet_types_interface.nil?
51
+ @subnet_types_interface
52
+ end
53
+
24
54
  def find_group_by_name_or_id(val)
25
55
  if val.to_s =~ /\A\d{1,}\Z/
26
56
  return find_group_by_id(val)
@@ -103,4 +133,349 @@ module Morpheus::Cli::InfrastructureHelper
103
133
  return get_available_cloud_types().find { |z| z['name'].downcase == name.downcase || z['code'].downcase == name.downcase}
104
134
  end
105
135
 
136
+
137
+ # Networks
138
+
139
+ def find_network_by_name_or_id(val)
140
+ if val.to_s =~ /\A\d{1,}\Z/
141
+ return find_network_by_id(val)
142
+ else
143
+ return find_network_by_name(val)
144
+ end
145
+ end
146
+
147
+ def find_network_by_id(id)
148
+ begin
149
+ json_response = networks_interface.get(id.to_i)
150
+ return json_response['network']
151
+ rescue RestClient::Exception => e
152
+ if e.response && e.response.code == 404
153
+ print_red_alert "Network not found by id #{id}"
154
+ return nil
155
+ else
156
+ raise e
157
+ end
158
+ end
159
+ end
160
+
161
+ def find_network_by_name(name)
162
+ json_response = networks_interface.list({name: name.to_s})
163
+ networks = json_response['networks']
164
+ if networks.empty?
165
+ print_red_alert "Network not found by name #{name}"
166
+ return nil
167
+ elsif networks.size > 1
168
+ print_red_alert "#{networks.size} networks found by name #{name}"
169
+ rows = networks.collect do |it|
170
+ {id: it['id'], name: it['name']}
171
+ end
172
+ puts as_pretty_table(rows, [:id, :name], {color:red})
173
+ return nil
174
+ else
175
+ network = networks[0]
176
+ # merge in tenants map
177
+ if json_response['tenants'] && json_response['tenants'][network['id']]
178
+ network['tenants'] = json_response['tenants'][network['id']]
179
+ end
180
+ return network
181
+ end
182
+ end
183
+
184
+ def find_network_type_by_name_or_id(val)
185
+ if val.to_s =~ /\A\d{1,}\Z/
186
+ return find_network_type_by_id(val)
187
+ else
188
+ return find_network_type_by_name(val)
189
+ end
190
+ end
191
+
192
+ def find_network_type_by_id(id)
193
+ begin
194
+ json_response = network_types_interface.get(id.to_i)
195
+ return json_response['networkType']
196
+ rescue RestClient::Exception => e
197
+ if e.response && e.response.code == 404
198
+ print_red_alert "Network Type not found by id #{id}"
199
+ return nil
200
+ else
201
+ raise e
202
+ end
203
+ end
204
+ end
205
+
206
+ def find_network_type_by_name(name)
207
+ json_response = network_types_interface.list({name: name.to_s})
208
+ network_types = json_response['networkTypes']
209
+ if network_types.empty?
210
+ print_red_alert "Network Type not found by name #{name}"
211
+ return network_types
212
+ elsif network_types.size > 1
213
+ print_red_alert "#{network_types.size} network types found by name #{name}"
214
+ rows = network_types.collect do |it|
215
+ {id: it['id'], name: it['name']}
216
+ end
217
+ puts as_pretty_table(rows, [:id, :name], {color:red})
218
+ return nil
219
+ else
220
+ return network_types[0]
221
+ end
222
+ end
223
+
224
+ def find_subnet_by_name_or_id(val)
225
+ if val.to_s =~ /\A\d{1,}\Z/
226
+ return find_subnet_by_id(val)
227
+ else
228
+ return find_subnet_by_name(val)
229
+ end
230
+ end
231
+
232
+ def find_subnet_by_id(id)
233
+ begin
234
+ json_response = subnets_interface.get(id.to_i)
235
+ return json_response['subnet']
236
+ rescue RestClient::Exception => e
237
+ if e.response && e.response.code == 404
238
+ print_red_alert "Subnet not found by id #{id}"
239
+ return nil
240
+ else
241
+ raise e
242
+ end
243
+ end
244
+ end
245
+
246
+ def find_subnet_by_name(name)
247
+ json_response = subnets_interface.list({name: name.to_s})
248
+ subnets = json_response['subnets']
249
+ if subnets.empty?
250
+ print_red_alert "Subnet not found by name #{name}"
251
+ return nil
252
+ elsif subnets.size > 1
253
+ print_red_alert "#{subnets.size} subnets found by name #{name}"
254
+ rows = subnets.collect do |it|
255
+ {id: it['id'], name: it['name']}
256
+ end
257
+ puts as_pretty_table(rows, [:id, :name], {color:red})
258
+ return nil
259
+ else
260
+ return subnets[0]
261
+ end
262
+ end
263
+
264
+ def find_subnet_type_by_name_or_id(val)
265
+ if val.to_s =~ /\A\d{1,}\Z/
266
+ return find_subnet_type_by_id(val)
267
+ else
268
+ return find_subnet_type_by_name(val)
269
+ end
270
+ end
271
+
272
+ def find_subnet_type_by_id(id)
273
+ begin
274
+ json_response = subnet_types_interface.get(id.to_i)
275
+ return json_response['subnetType']
276
+ rescue RestClient::Exception => e
277
+ if e.response && e.response.code == 404
278
+ print_red_alert "Subnet Type not found by id #{id}"
279
+ return nil
280
+ else
281
+ raise e
282
+ end
283
+ end
284
+ end
285
+
286
+ def find_subnet_type_by_name(name)
287
+ json_response = subnet_types_interface.list({name: name.to_s})
288
+ subnet_types = json_response['subnetTypes']
289
+ if subnet_types.empty?
290
+ print_red_alert "Subnet Type not found by name #{name}"
291
+ return subnet_types
292
+ elsif subnet_types.size > 1
293
+ print_red_alert "#{subnet_types.size} subnet types found by name #{name}"
294
+ rows = subnet_types.collect do |it|
295
+ {id: it['id'], name: it['name']}
296
+ end
297
+ puts as_pretty_table(rows, [:id, :name], {color:red})
298
+ return nil
299
+ else
300
+ return subnet_types[0]
301
+ end
302
+ end
303
+
304
+ def find_network_group_by_name_or_id(val)
305
+ if val.to_s =~ /\A\d{1,}\Z/
306
+ return find_network_group_by_id(val)
307
+ else
308
+ return find_network_group_by_name(val)
309
+ end
310
+ end
311
+
312
+ def find_network_group_by_id(id)
313
+ begin
314
+ json_response = network_groups_interface.get(id.to_i)
315
+ return json_response['networkGroup']
316
+ rescue RestClient::Exception => e
317
+ if e.response && e.response.code == 404
318
+ print_red_alert "Network Group not found by id #{id}"
319
+ return nil
320
+ else
321
+ raise e
322
+ end
323
+ end
324
+ end
325
+
326
+ def find_network_group_by_name(name)
327
+ json_response = network_groups_interface.list({name: name.to_s})
328
+ network_groups = json_response['networkGroups']
329
+ if network_groups.empty?
330
+ print_red_alert "Network Group not found by name #{name}"
331
+ return nil
332
+ elsif network_groups.size > 1
333
+ print_red_alert "#{network_groups.size} network groups found by name #{name}"
334
+ # print_networks_table(networks, {color: red})
335
+ rows = network_groups.collect do |it|
336
+ {id: it['id'], name: it['name']}
337
+ end
338
+ puts as_pretty_table(rows, [:id, :name], {color:red})
339
+ return nil
340
+ else
341
+ return network_groups[0]
342
+ end
343
+ end
344
+
345
+ def prompt_for_network(network_id, options={}, required=true, field_name='network', field_label='Network')
346
+ # Prompt for a Network, text input that searches by name or id
347
+ network = nil
348
+ still_prompting = true
349
+ while still_prompting do
350
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => field_name, 'type' => 'text', 'fieldLabel' => field_label, 'required' => required, 'description' => 'Network name or ID.'}], network_id ? {(field_name) => network_id} : {})
351
+ network_id = v_prompt['network']
352
+ begin
353
+ network = find_network_by_name_or_id(network_id)
354
+ rescue SystemExit => cmdexit
355
+ end
356
+ if options[:no_prompt]
357
+ still_prompting = false
358
+ else
359
+ still_prompting = network ? false : true
360
+ end
361
+ if still_prompting
362
+ network_id = nil
363
+ end
364
+ end
365
+ return {success:!!network, network: network}
366
+ end
367
+
368
+ def prompt_for_networks(params, options={}, api_client=nil, api_params={})
369
+ # Networks
370
+ network_list = nil
371
+ network_ids = nil
372
+ still_prompting = true
373
+ if params['networks'].nil?
374
+ still_prompting = true
375
+ while still_prompting do
376
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networks', 'type' => 'text', 'fieldLabel' => 'Networks', 'required' => false, 'description' => 'Networks to include, comma separated list of names or IDs.'}], options[:options])
377
+ unless v_prompt['networks'].to_s.empty?
378
+ network_list = v_prompt['networks'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
379
+ end
380
+ network_ids = []
381
+ bad_ids = []
382
+ if network_list && network_list.size > 0
383
+ network_list.each do |it|
384
+ found_network = nil
385
+ begin
386
+ found_network = find_network_by_name_or_id(it)
387
+ rescue SystemExit => cmdexit
388
+ end
389
+ if found_network
390
+ network_ids << found_network['id']
391
+ else
392
+ bad_ids << it
393
+ end
394
+ end
395
+ end
396
+ still_prompting = bad_ids.empty? ? false : true
397
+ end
398
+ else
399
+ network_list = params['networks']
400
+ still_prompting = false
401
+ network_ids = []
402
+ bad_ids = []
403
+ if network_list && network_list.size > 0
404
+ network_list.each do |it|
405
+ found_network = nil
406
+ begin
407
+ found_network = find_network_by_name_or_id(it)
408
+ rescue SystemExit => cmdexit
409
+ end
410
+ if found_network
411
+ network_ids << found_network['id']
412
+ else
413
+ bad_ids << it
414
+ end
415
+ end
416
+ end
417
+ if !bad_ids.empty?
418
+ return {success:false, msg:"Networks not found: #{bad_ids}"}
419
+ end
420
+ end
421
+ return {success:true, data: network_ids}
422
+ end
423
+
424
+ def prompt_for_subnets(params, options={}, api_client=nil, api_params={})
425
+ # todo: make this a generic method now please.
426
+ # Subnets
427
+ record_list = nil
428
+ record_ids = nil
429
+ still_prompting = true
430
+ if params['subnets'].nil?
431
+ still_prompting = true
432
+ while still_prompting do
433
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'subnets', 'type' => 'text', 'fieldLabel' => 'Subnets', 'required' => false, 'description' => 'Subnets to include, comma separated list of names or IDs.'}], options[:options])
434
+ unless v_prompt['subnets'].to_s.empty?
435
+ record_list = v_prompt['subnets'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
436
+ end
437
+ record_ids = []
438
+ bad_ids = []
439
+ if record_list && record_list.size > 0
440
+ record_list.each do |it|
441
+ found_record = nil
442
+ begin
443
+ found_record = find_subnet_by_name_or_id(it)
444
+ rescue SystemExit => cmdexit
445
+ end
446
+ if found_record
447
+ record_ids << found_record['id']
448
+ else
449
+ bad_ids << it
450
+ end
451
+ end
452
+ end
453
+ still_prompting = bad_ids.empty? ? false : true
454
+ end
455
+ else
456
+ record_list = params['subnets']
457
+ still_prompting = false
458
+ record_ids = []
459
+ bad_ids = []
460
+ if record_list && record_list.size > 0
461
+ record_list.each do |it|
462
+ found_network = nil
463
+ begin
464
+ found_network = find_record_by_name_or_id(it)
465
+ rescue SystemExit => cmdexit
466
+ end
467
+ if found_network
468
+ record_ids << found_network['id']
469
+ else
470
+ bad_ids << it
471
+ end
472
+ end
473
+ end
474
+ if !bad_ids.empty?
475
+ return {success:false, msg:"Subnets not found: #{bad_ids}"}
476
+ end
477
+ end
478
+ return {success:true, data: record_ids}
479
+ end
480
+
106
481
  end
@@ -15,8 +15,6 @@ class Morpheus::Cli::MonitoringAlertsCommand
15
15
 
16
16
  register_subcommands :list, :get, :add, :update, :remove
17
17
 
18
- set_command_hidden # hiding until 4.1.1 release
19
-
20
18
  def initialize()
21
19
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
22
20
  end