morpheus-cli 5.3.2 → 5.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/accounts_interface.rb +4 -30
  4. data/lib/morpheus/api/api_client.rb +12 -0
  5. data/lib/morpheus/api/instances_interface.rb +18 -5
  6. data/lib/morpheus/api/load_balancer_pools_interface.rb +9 -0
  7. data/lib/morpheus/api/load_balancer_types_interface.rb +9 -0
  8. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +9 -0
  9. data/lib/morpheus/api/load_balancers_interface.rb +4 -53
  10. data/lib/morpheus/api/network_routers_interface.rb +56 -0
  11. data/lib/morpheus/api/secondary_read_interface.rb +25 -0
  12. data/lib/morpheus/api/secondary_rest_interface.rb +42 -0
  13. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  14. data/lib/morpheus/cli/apps.rb +3 -2
  15. data/lib/morpheus/cli/cli_command.rb +21 -14
  16. data/lib/morpheus/cli/cli_registry.rb +55 -2
  17. data/lib/morpheus/cli/cloud_resource_pools_command.rb +169 -133
  18. data/lib/morpheus/cli/clusters.rb +51 -33
  19. data/lib/morpheus/cli/instances.rb +292 -174
  20. data/lib/morpheus/cli/invoices_command.rb +79 -99
  21. data/lib/morpheus/cli/library_cluster_layouts_command.rb +20 -0
  22. data/lib/morpheus/cli/load_balancer_types.rb +37 -0
  23. data/lib/morpheus/cli/load_balancers.rb +149 -314
  24. data/lib/morpheus/cli/log_settings_command.rb +7 -3
  25. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +156 -0
  26. data/lib/morpheus/cli/mixins/print_helper.rb +11 -0
  27. data/lib/morpheus/cli/mixins/provisioning_helper.rb +123 -101
  28. data/lib/morpheus/cli/mixins/rest_command.rb +657 -0
  29. data/lib/morpheus/cli/monitoring_checks_command.rb +2 -0
  30. data/lib/morpheus/cli/network_routers_command.rb +1183 -185
  31. data/lib/morpheus/cli/networks_command.rb +194 -101
  32. data/lib/morpheus/cli/option_parser.rb +25 -17
  33. data/lib/morpheus/cli/option_types.rb +42 -45
  34. data/lib/morpheus/cli/tenants_command.rb +18 -20
  35. data/lib/morpheus/cli/vdi_pools_command.rb +4 -1
  36. data/lib/morpheus/cli/version.rb +1 -1
  37. data/lib/morpheus/cli/virtual_images.rb +249 -29
  38. data/lib/morpheus/cli.rb +1 -0
  39. data/lib/morpheus/ext/string.rb +41 -0
  40. data/lib/morpheus/formatters.rb +4 -0
  41. data/morpheus-cli.gemspec +1 -1
  42. metadata +13 -4
@@ -77,14 +77,26 @@ module Morpheus
77
77
 
78
78
  def exec_command(command_name, args)
79
79
  #puts "exec_command(#{command_name}, #{args})"
80
- found_alias_command = instance.get_alias(command_name)
81
80
  if has_alias?(command_name)
82
81
  exec_alias(command_name, args)
83
82
  elsif has_command?(command_name)
84
83
  instance.get(command_name).new.handle(args)
85
84
  else
86
85
  # todo: need to just return error instead of raise
87
- raise CommandNotFoundError.new("'#{command_name}' is not a morpheus command.")
86
+ msg = "'#{command_name}' is not a morpheus command."
87
+ suggestions = find_command_suggestions(command_name)
88
+ if suggestions && suggestions.size == 1
89
+ msg += "\nThe most similar command is:\n"
90
+ suggestions.first(5).each do |suggestion|
91
+ msg += "\t" + suggestion + "\n"
92
+ end
93
+ elsif suggestions && suggestions.size > 1
94
+ msg += "\nThe most similar commands are:\n"
95
+ suggestions.first(5).each do |suggestion|
96
+ msg += "\t" + suggestion + "\n"
97
+ end
98
+ end
99
+ raise CommandNotFoundError.new(msg)
88
100
  end
89
101
  end
90
102
 
@@ -269,6 +281,47 @@ module Morpheus
269
281
  return exit_code, err
270
282
  end
271
283
 
284
+ def cached_command_list
285
+ @cached_command_list ||= (all.keys + all_aliases.keys).collect { |it| it.to_s }.sort
286
+ end
287
+
288
+ def clear_cached_command_list
289
+ @cached_command_list = nil
290
+ end
291
+
292
+ # find suggested commands (or aliases) for a name that was not found
293
+ # First this looks for the plural of the original guess
294
+ # Then pop characters off the end looking for partial matches
295
+ # as long as the guess is at least 3 characters
296
+ def find_command_suggestions(command_name)
297
+ every_command = cached_command_list
298
+ guess = command_name
299
+ suggestions = []
300
+ while guess.size >= 3
301
+ plural_guess = guess.pluralize
302
+ if every_command.include?(guess)
303
+ suggestions << guess
304
+ end
305
+ if every_command.include?(plural_guess)
306
+ suggestions << plural_guess
307
+ end
308
+ # if every_command.include?(guess)
309
+ # suggestions << plural_guess
310
+ # else
311
+ guess_regexp = /^#{Regexp.escape(guess)}/i
312
+ every_command.each do |it|
313
+ if it =~ guess_regexp
314
+ suggestions << it
315
+ end
316
+ end
317
+ # end
318
+ guess = guess[0..-2]
319
+ end
320
+ suggestions.uniq!
321
+ suggestions.sort! { |x,y| [x.split('-').size, x] <=> [y.split('-').size, y] }
322
+ return suggestions
323
+ end
324
+
272
325
  end
273
326
 
274
327
  end
@@ -7,6 +7,7 @@ require 'morpheus/cli/mixins/infrastructure_helper'
7
7
  class Morpheus::Cli::CloudResourcePoolsCommand
8
8
  include Morpheus::Cli::CliCommand
9
9
  include Morpheus::Cli::InfrastructureHelper
10
+ include Morpheus::Cli::OptionSourceHelper
10
11
 
11
12
  #set_command_name :'cloud-resource-pools'
12
13
  set_command_name :'resource-pools'
@@ -191,6 +192,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
191
192
  "Status" => lambda {|it| it['status'].to_s.capitalize },
192
193
  "Tenants" => lambda {|it| it['tenants'] ? it['tenants'].collect {|it| it['name'] }.uniq.join(', ') : '' }
193
194
  }
195
+
196
+ if cloud['zoneType']['code'] == 'openstack'
197
+ role = resource_pool['config']['roleId'] ? load_option_source_data('openstackRoles', {zoneId: cloud['id']}).find {|it| it['value'] == resource_pool['config']['roleId']} : nil
198
+ description_cols['Role'] = lambda {|it| role ? role['name'] : ''}
199
+ end
200
+
194
201
  print_description_list(description_cols, resource_pool)
195
202
 
196
203
  if resource_pool['resourcePermission'].nil?
@@ -329,8 +336,14 @@ class Morpheus::Cli::CloudResourcePoolsCommand
329
336
  opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
330
337
  options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
331
338
  end
332
- build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
333
- opts.footer = "Update a resource pool." + "\n" +
339
+ opts.on("--description [TEXT]", String, "Description") do |val|
340
+ options['description'] = val.to_s
341
+ end
342
+ opts.on( '--role ROLE', String, "Role Name or ID (applicable to select resource pools)" ) do |val|
343
+ options[:role] = val
344
+ end
345
+ build_standard_add_options(opts, options)
346
+ opts.footer = "Add a resource pool." + "\n" +
334
347
  "[cloud] is required. This is the name or id of the cloud."
335
348
  end
336
349
  optparse.parse!(args)
@@ -349,151 +362,156 @@ class Morpheus::Cli::CloudResourcePoolsCommand
349
362
 
350
363
  connect(options)
351
364
 
352
- begin
353
- # load cloud
354
- if cloud_id.nil?
355
- puts_error "#{Morpheus::Terminal.angry_prompt}missing required option: [cloud]\n#{optparse}"
356
- return 1
357
- end
358
- cloud = find_cloud_by_name_or_id(cloud_id)
359
- return 1 if cloud.nil?
360
-
361
- # merge -O options into normally parsed options
362
- options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
365
+ # load cloud
366
+ if cloud_id.nil?
367
+ puts_error "#{Morpheus::Terminal.angry_prompt}missing required option: [cloud]\n#{optparse}"
368
+ return 1
369
+ end
370
+ cloud = find_cloud_by_name_or_id(cloud_id)
371
+ return 1 if cloud.nil?
363
372
 
364
- # construct payload
365
- payload = nil
366
- if options[:payload]
367
- payload = options[:payload]
368
- else
369
- # prompt for resource pool options
370
- payload = {
371
- 'resourcePool' => {
372
- }
373
+ # merge -O options into normally parsed options
374
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
375
+
376
+ # construct payload
377
+ payload = nil
378
+ if options[:payload]
379
+ payload = options[:payload]
380
+ else
381
+ # prompt for resource pool options
382
+ payload = {
383
+ 'resourcePool' => {
373
384
  }
374
-
375
- # allow arbitrary -O options
376
- payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
385
+ }
377
386
 
387
+ # allow arbitrary -O options
388
+ payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
378
389
 
379
- # Name
380
- if options['name']
381
- payload['resourcePool']['name'] = options['name']
382
- else
383
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options)
384
- payload['resourcePool']['name'] = v_prompt['name']
385
- end
390
+ # Name
391
+ if options['name']
392
+ payload['resourcePool']['name'] = options['name']
393
+ else
394
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options)
395
+ payload['resourcePool']['name'] = v_prompt['name']
396
+ end
386
397
 
387
- # Group Access
388
- if group_access_all != nil
398
+ # Group Access
399
+ if group_access_all != nil
400
+ payload['resourcePermissions'] ||= {}
401
+ payload['resourcePermissions']['all'] = group_access_all
402
+ else
403
+ # default to all
404
+ if payload['resourcePermissions'].nil? || payload['resourcePermissions']['all'].nil?
389
405
  payload['resourcePermissions'] ||= {}
390
- payload['resourcePermissions']['all'] = group_access_all
391
- else
392
- # default to all
393
- if payload['resourcePermissions'].nil? || payload['resourcePermissions']['all'].nil?
394
- payload['resourcePermissions'] ||= {}
395
- payload['resourcePermissions']['all'] = true
396
- end
406
+ payload['resourcePermissions']['all'] = true
397
407
  end
398
- if group_access_list != nil
399
- payload['resourcePermissions'] ||= {}
400
- payload['resourcePermissions']['sites'] = group_access_list.collect do |site_id|
401
- site = {"id" => site_id.to_i}
402
- if group_defaults_list && group_defaults_list.include?(site_id)
403
- site["default"] = true
404
- end
405
- site
408
+ end
409
+ if group_access_list != nil
410
+ payload['resourcePermissions'] ||= {}
411
+ payload['resourcePermissions']['sites'] = group_access_list.collect do |site_id|
412
+ site = {"id" => site_id.to_i}
413
+ if group_defaults_list && group_defaults_list.include?(site_id)
414
+ site["default"] = true
406
415
  end
416
+ site
407
417
  end
418
+ end
408
419
 
409
- # Service Plan Access
410
- if plan_access_all != nil
420
+ # Service Plan Access
421
+ if plan_access_all != nil
422
+ payload['resourcePermissions'] ||= {}
423
+ payload['resourcePermissions']['allPlans'] = plan_access_all
424
+ else
425
+ # default to all
426
+ if payload['resourcePermissions'].nil? || payload['resourcePermissions']['allPlans'].nil?
411
427
  payload['resourcePermissions'] ||= {}
412
- payload['resourcePermissions']['allPlans'] = plan_access_all
413
- else
414
- # default to all
415
- if payload['resourcePermissions'].nil? || payload['resourcePermissions']['allPlans'].nil?
416
- payload['resourcePermissions'] ||= {}
417
- payload['resourcePermissions']['allPlans'] = true
418
- end
428
+ payload['resourcePermissions']['allPlans'] = true
419
429
  end
420
- if plan_access_list != nil
421
- payload['resourcePermissions'] ||= {}
422
- payload['resourcePermissions']['plans'] = plan_access_list.collect do |site_id|
423
- site = {"id" => site_id.to_i}
424
- if plan_defaults_list && plan_defaults_list.include?(site_id)
425
- site["default"] = true
426
- end
427
- site
430
+ end
431
+ if plan_access_list != nil
432
+ payload['resourcePermissions'] ||= {}
433
+ payload['resourcePermissions']['plans'] = plan_access_list.collect do |site_id|
434
+ site = {"id" => site_id.to_i}
435
+ if plan_defaults_list && plan_defaults_list.include?(site_id)
436
+ site["default"] = true
428
437
  end
438
+ site
429
439
  end
440
+ end
430
441
 
431
- # Tenants
432
- if options['tenants']
433
- payload['tenantPermissions'] = {}
434
- payload['tenantPermissions']['accounts'] = options['tenants']
435
- end
436
-
437
- # Active
438
- if options['active'] != nil
439
- payload['resourcePool']['active'] = options['active']
440
- else
441
- payload['resourcePool']['active'] = true
442
- end
442
+ # Tenants
443
+ if options['tenants']
444
+ payload['tenantPermissions'] = {}
445
+ payload['tenantPermissions']['accounts'] = options['tenants']
446
+ end
443
447
 
444
- # Default
445
- if options['defaultPool'] != nil
446
- payload['resourcePool']['defaultPool'] = options['defaultPool']
447
- end
448
-
449
- # Visibility
450
- if options['visibility'] != nil
451
- payload['resourcePool']['visibility'] = options['visibility']
452
- else
453
- payload['resourcePool']['visibility'] = 'private'
454
- end
455
-
456
-
457
- # Config options depend on type (until api returns these as optionTypes)
458
- zone_type = cloud['zoneType'] ? cloud['zoneType']['code'] : ''
459
- if zone_type == 'amazon'
460
- payload['resourcePool']['config'] ||= {}
461
- # CIDR
462
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'cidrBlock', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => true, 'description' => 'Provide the base CIDR Block to use for this VPC (must be between a /16 and /28 Block)'}], options)
463
- payload['resourcePool']['config']['cidrBlock'] = v_prompt['config']['cidrBlock']
464
- # Tenancy
465
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'tenancy', 'fieldLabel' => 'Tenancy', 'type' => 'select', 'selectOptions' => [{'name' => 'Default', 'value' => 'default'}, {'name' => 'Dedicated', 'value' => 'dedicated'}], 'defaultValue' => 'default'}], options)
466
- payload['resourcePool']['config']['tenancy'] = v_prompt['config']['tenancy']
467
-
468
- elsif zone_type == 'azure'
469
- # no options
470
- elsif zone_type == 'cloudFoundry' || zone_type == 'bluemixCloudFoundry'
471
-
472
- elsif zone_type == 'standard'
473
- # no options
474
- else
475
- #raise_command_error "Cloud type '#{zone_type}' does not allow creating resource pools"
476
- end
448
+ # Active
449
+ if options['active'] != nil
450
+ payload['resourcePool']['active'] = options['active']
451
+ else
452
+ payload['resourcePool']['active'] = true
453
+ end
477
454
 
455
+ # Default
456
+ if options['defaultPool'] != nil
457
+ payload['resourcePool']['defaultPool'] = options['defaultPool']
478
458
  end
479
- @cloud_resource_pools_interface.setopts(options)
480
- if options[:dry_run]
481
- print_dry_run @cloud_resource_pools_interface.dry.create(cloud['id'], payload)
482
- return
459
+
460
+ # Visibility
461
+ if options['visibility'] != nil
462
+ payload['resourcePool']['visibility'] = options['visibility']
463
+ else
464
+ payload['resourcePool']['visibility'] = 'private'
483
465
  end
484
- json_response = @cloud_resource_pools_interface.create(cloud['id'], payload)
485
- if options[:json]
486
- puts as_json(json_response)
466
+
467
+
468
+ # Config options depend on type (until api returns these as optionTypes)
469
+ zone_type = cloud['zoneType'] ? cloud['zoneType']['code'] : ''
470
+ if zone_type == 'amazon'
471
+ payload['resourcePool']['config'] ||= {}
472
+ # CIDR
473
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'cidrBlock', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => true, 'description' => 'Provide the base CIDR Block to use for this VPC (must be between a /16 and /28 Block)'}], options)
474
+ payload['resourcePool']['config']['cidrBlock'] = v_prompt['config']['cidrBlock']
475
+ # Tenancy
476
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'tenancy', 'fieldLabel' => 'Tenancy', 'type' => 'select', 'selectOptions' => [{'name' => 'Default', 'value' => 'default'}, {'name' => 'Dedicated', 'value' => 'dedicated'}], 'defaultValue' => 'default'}], options)
477
+ payload['resourcePool']['config']['tenancy'] = v_prompt['config']['tenancy']
478
+
479
+ elsif zone_type == 'azure'
480
+ # no options
481
+ elsif zone_type == 'cloudFoundry' || zone_type == 'bluemixCloudFoundry'
482
+
483
+ elsif zone_type == 'openstack'
484
+ payload['resourcePool']['config'] ||= {}
485
+ # Description
486
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'}], options)
487
+ payload['resourcePool']['description'] = v_prompt['description']
488
+ # Role
489
+ role_options = load_option_source_data('openstackRoles', {zoneId: cloud['id']})
490
+ if role = options[:role] ? role_options.find {|it| [it['name'], it['value']].include?(options[:role])} : nil
491
+ payload['resourcePool']['config']['roleId'] = role['value']
492
+ else
493
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'roleId', 'fieldLabel' => 'Role', 'type' => 'select', 'selectOptions' => role_options, 'required' => true}], options, @api_client,{zoneId: cloud['id']})
494
+ payload['resourcePool']['config']['roleId'] = v_prompt['config']['roleId']
495
+ end
496
+ elsif zone_type == 'standard'
497
+ # no options
487
498
  else
488
- resource_pool = json_response['resourcePool']
489
- print_green_success "Created resource pool #{resource_pool['name']}"
490
- get([cloud['id'].to_s, resource_pool['id'].to_s])
499
+ #raise_command_error "Cloud type '#{zone_type}' does not allow creating resource pools"
491
500
  end
492
- return 0
493
- rescue RestClient::Exception => e
494
- print_rest_exception(e, options)
495
- return 1
496
501
  end
502
+
503
+ @cloud_resource_pools_interface.setopts(options)
504
+ if options[:dry_run]
505
+ print_dry_run @cloud_resource_pools_interface.dry.create(cloud['id'], payload)
506
+ return
507
+ end
508
+ json_response = @cloud_resource_pools_interface.create(cloud['id'], payload)
509
+ render_response(json_response, options, 'resourcePool') do
510
+ resource_pool = json_response['resourcePool']
511
+ print_green_success "Created resource pool #{resource_pool['name']}"
512
+ get([cloud['id'].to_s, resource_pool['id'].to_s])
513
+ end
514
+ return 0, nil
497
515
  end
498
516
 
499
517
  def update(args)
@@ -563,6 +581,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
563
581
  opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
564
582
  options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
565
583
  end
584
+ opts.on("--description [TEXT]", String, "Description") do |val|
585
+ options['description'] = val.to_s
586
+ end
587
+ opts.on( '--role ROLE', String, "Role Name or ID (applicable to select resource pools)" ) do |val|
588
+ options['role'] = val
589
+ end
566
590
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
567
591
  opts.footer = "Update a resource pool." + "\n" +
568
592
  "[cloud] is required. This is the name or id of the cloud." + "\n"
@@ -591,7 +615,7 @@ class Morpheus::Cli::CloudResourcePoolsCommand
591
615
 
592
616
  resource_pool = find_resource_pool_by_name_or_id(cloud['id'], resource_pool_id)
593
617
  return 1 if resource_pool.nil?
594
-
618
+
595
619
  # merge -O options into normally parsed options
596
620
  options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
597
621
 
@@ -605,11 +629,11 @@ class Morpheus::Cli::CloudResourcePoolsCommand
605
629
  'resourcePool' => {
606
630
  }
607
631
  }
608
-
632
+
609
633
  # allow arbitrary -O options
610
634
  payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
611
635
 
612
-
636
+
613
637
  # Group Access
614
638
  if group_access_all != nil
615
639
  payload['resourcePermissions'] ||= {}
@@ -657,12 +681,26 @@ class Morpheus::Cli::CloudResourcePoolsCommand
657
681
  if options['defaultPool'] != nil
658
682
  payload['resourcePool']['defaultPool'] = options['defaultPool']
659
683
  end
660
-
684
+
661
685
  # Visibility
662
686
  if options['visibility'] != nil
663
687
  payload['resourcePool']['visibility'] = options['visibility']
664
688
  end
665
689
 
690
+ # Description
691
+ if options['description'] != nil
692
+ payload['resourcePool']['description'] = options['description']
693
+ end
694
+
695
+ # Role
696
+ if options['role'] != nil
697
+ role_options = load_option_source_data('openstackRoles', {zoneId: cloud['id']})
698
+ if role = role_options.find {|it| [it['name'], it['value']].include?(options['role'])}
699
+ payload['resourcePool']['config'] ||= {}
700
+ payload['resourcePool']['config']['roleId'] = role['value']
701
+ end
702
+ end
703
+
666
704
  if payload['resourcePool'].empty? && payload['resourcePermissions'].nil? && payload['tenantPermissions'].nil?
667
705
  raise_command_error "Specify at least one option to update.\n#{optparse}"
668
706
  end
@@ -674,14 +712,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
674
712
  return
675
713
  end
676
714
  json_response = @cloud_resource_pools_interface.update(cloud['id'], resource_pool["id"], payload)
677
- if options[:json]
678
- puts as_json(json_response)
679
- else
715
+ render_response(json_response, options, 'resourcePool') do
680
716
  resource_pool = json_response['resourcePool']
681
717
  print_green_success "Updated resource pool #{resource_pool['name']}"
682
718
  get([cloud['id'].to_s, resource_pool['id'].to_s])
683
719
  end
684
- return 0
720
+ return 0, nil
685
721
  rescue RestClient::Exception => e
686
722
  print_rest_exception(e, options)
687
723
  return 1