morpheus-cli 5.3.2.2 → 5.4.0

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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +26 -1
  4. data/lib/morpheus/api/clouds_interface.rb +4 -11
  5. data/lib/morpheus/api/health_interface.rb +37 -3
  6. data/lib/morpheus/api/instances_interface.rb +18 -5
  7. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  8. data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
  9. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
  10. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  11. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  12. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  13. data/lib/morpheus/api/network_routers_interface.rb +21 -0
  14. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  15. data/lib/morpheus/api/rest_interface.rb +2 -1
  16. data/lib/morpheus/api/roles_interface.rb +7 -0
  17. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  18. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  19. data/lib/morpheus/cli/cli_command.rb +21 -14
  20. data/lib/morpheus/cli/cli_registry.rb +56 -2
  21. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  22. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  23. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  24. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +0 -3
  25. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  26. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  27. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +3 -11
  28. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  29. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  30. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  31. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  32. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  33. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +0 -0
  34. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  35. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  36. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  37. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  38. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  39. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  40. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  41. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  42. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
  43. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  44. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +51 -39
  45. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  46. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  47. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  48. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  49. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  50. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  51. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  52. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  53. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  54. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  55. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  56. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  57. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  58. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  59. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  60. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  61. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  62. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  63. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  64. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  65. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  66. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  67. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  68. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  69. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +0 -10
  70. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
  71. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  72. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +364 -148
  73. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
  74. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
  75. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  76. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  77. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
  78. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  79. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  80. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  81. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  82. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  83. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  84. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  85. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  86. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  87. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  88. data/lib/morpheus/cli/commands/load_balancer_pools.rb +111 -0
  89. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +0 -4
  90. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +136 -0
  91. data/lib/morpheus/cli/commands/load_balancers.rb +89 -0
  92. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  93. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  94. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  95. data/lib/morpheus/cli/commands/logout.rb +63 -0
  96. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  97. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  98. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  99. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  100. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
  101. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  102. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  103. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  104. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  105. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  106. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  107. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  108. data/lib/morpheus/cli/commands/network_firewalls_command.rb +806 -0
  109. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  110. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  111. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  112. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  113. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +291 -12
  114. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  115. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  116. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
  117. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  118. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  119. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +0 -7
  120. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  121. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  122. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  123. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +0 -0
  124. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  125. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  126. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  127. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  128. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  129. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +1 -7
  130. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  131. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  132. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +244 -39
  133. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  134. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  135. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  136. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  137. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  138. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  139. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  140. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +2 -103
  141. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  142. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  143. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  144. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  145. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  146. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  147. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  148. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +0 -7
  149. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  150. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  151. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +0 -1
  152. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +0 -0
  153. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +0 -1
  154. data/lib/morpheus/cli/{users.rb → commands/users.rb} +0 -7
  155. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  156. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  157. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  158. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  159. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
  160. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  161. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
  162. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  163. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  164. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  165. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  166. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
  167. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  168. data/lib/morpheus/cli/mixins/print_helper.rb +1 -0
  169. data/lib/morpheus/cli/mixins/provisioning_helper.rb +155 -112
  170. data/lib/morpheus/cli/mixins/rest_command.rb +154 -52
  171. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +575 -0
  172. data/lib/morpheus/cli/option_parser.rb +25 -17
  173. data/lib/morpheus/cli/option_types.rb +96 -32
  174. data/lib/morpheus/cli/version.rb +1 -1
  175. data/lib/morpheus/cli.rb +5 -128
  176. data/lib/morpheus/terminal.rb +5 -6
  177. data/morpheus-cli.gemspec +1 -1
  178. metadata +156 -143
  179. data/lib/morpheus/cli/change_password_command.rb +0 -147
  180. data/lib/morpheus/cli/library.rb +0 -1
  181. data/lib/morpheus/cli/load_balancers.rb +0 -245
  182. data/lib/morpheus/cli/logout.rb +0 -81
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkGroupsCommand
8
4
  include Morpheus::Cli::CliCommand
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkPoolServersCommand
8
4
  include Morpheus::Cli::CliCommand
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkPoolsCommand
8
4
  include Morpheus::Cli::CliCommand
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkProxiesCommand
8
4
  include Morpheus::Cli::CliCommand
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkRoutersCommand
8
4
  include Morpheus::Cli::CliCommand
@@ -17,6 +13,7 @@ class Morpheus::Cli::NetworkRoutersCommand
17
13
  register_subcommands :add_route, :remove_route, :routes
18
14
  register_subcommands :update_permissions
19
15
  register_subcommands :add_nat, :update_nat, :remove_nat, :nats, :nat
16
+ register_subcommands :add_bgp_neighbor, :update_bgp_neighbor, :remove_bgp_neighbor, :bgp_neighbors, :bgp_neighbor
20
17
 
21
18
  def initialize()
22
19
  end
@@ -313,7 +310,7 @@ class Morpheus::Cli::NetworkRoutersCommand
313
310
  server_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'required' => true, 'optionSource' => 'networkServer'}], options[:options], @api_client, params, nil, true)['networkServer']
314
311
  server = {'id' => server_id}
315
312
  end
316
- router['networkServer'] = {'id' => server['id']}
313
+ params['router']['networkServer'] = router['networkServer'] = {'id' => server['id']}
317
314
  params['networkServerId'] = server['id']
318
315
  else
319
316
  # prompt cloud
@@ -1148,7 +1145,6 @@ class Morpheus::Cli::NetworkRoutersCommand
1148
1145
  api_params = {}
1149
1146
  api_params['networkServerId'] = router['networkServer']['id'] if router['networkServer']
1150
1147
  api_params['zoneId'] = router['zone']['id'] if router['networkServer'].nil?
1151
- api_params['groupId'] = options[:group] if !options[:group].nil?
1152
1148
  option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'rule' => ''}}), @api_client, api_params, nil, true)
1153
1149
  payload = {'rule' => params.deep_merge(option_result)}
1154
1150
  end
@@ -1517,11 +1513,11 @@ class Morpheus::Cli::NetworkRoutersCommand
1517
1513
  options = {}
1518
1514
  query_params = {}
1519
1515
  optparse = Morpheus::Cli::OptionParser.new do |opts|
1520
- opts.banner = subcommand_usage("[router] [rule]")
1516
+ opts.banner = subcommand_usage("[router] [route]")
1521
1517
  build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
1522
1518
  opts.footer = "Delete a network router route.\n" +
1523
- "[router] is required. This is the name or id of an existing network router."
1524
- "[route] is required. This is the name or id of an existing network router route."
1519
+ "[router] is required. This is the name or id of an existing network router."
1520
+ "[route] is required. This is the name or id of an existing network router route."
1525
1521
  end
1526
1522
  optparse.parse!(args)
1527
1523
  if args.count != 2
@@ -1628,11 +1624,11 @@ class Morpheus::Cli::NetworkRoutersCommand
1628
1624
  def nat(args)
1629
1625
  options = {}
1630
1626
  optparse = Morpheus::Cli::OptionParser.new do |opts|
1631
- opts.banner = subcommand_usage("[router] [rule]")
1627
+ opts.banner = subcommand_usage("[router] [nat]")
1632
1628
  build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
1633
1629
  opts.footer = "Display network router firewall rule details." + "\n" +
1634
1630
  "[router] is required. This is the name or id of a network router.\n" +
1635
- "[rule] is required. This is the name or id of a firewall rule.\n"
1631
+ "[nat] is required. This is the name or id of a NAT.\n"
1636
1632
  end
1637
1633
 
1638
1634
  optparse.parse!(args)
@@ -1887,6 +1883,268 @@ class Morpheus::Cli::NetworkRoutersCommand
1887
1883
  end
1888
1884
  end
1889
1885
 
1886
+ def bgp_neighbors(args)
1887
+ options = {}
1888
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1889
+ opts.banner = subcommand_usage("[router]")
1890
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
1891
+ opts.footer = "List network router BGP neighbors." + "\n" +
1892
+ "[router] is required. This is the name or id of a network router."
1893
+ end
1894
+
1895
+ optparse.parse!(args)
1896
+ connect(options)
1897
+
1898
+ if args.count < 1
1899
+ puts optparse
1900
+ return 1
1901
+ end
1902
+ _bgp_neighbors(args[0], options)
1903
+ end
1904
+
1905
+ def _bgp_neighbors(router_id, options)
1906
+ @network_routers_interface.setopts(options)
1907
+ if options[:dry_run]
1908
+ if args[0].to_s =~ /\A\d{1,}\Z/
1909
+ print_dry_run @network_routers_interface.dry.get(router_id.to_i)
1910
+ else
1911
+ print_dry_run @network_routers_interface.dry.list({name:router_id})
1912
+ end
1913
+ return
1914
+ end
1915
+ router = find_router(router_id)
1916
+ if router.nil?
1917
+ return 1
1918
+ end
1919
+
1920
+ if router['type']['hasBgp']
1921
+ json_response = {'networkRouterBgpNeighbors' => router['bgpNeighbors']}
1922
+ render_response(json_response, options, 'networkRouterBgpNeighbor') do
1923
+ print_h1 "Network Router BGP Neighbors For: #{router['name']}"
1924
+ print cyan
1925
+ print_bgp_neighbors(router)
1926
+ end
1927
+ else
1928
+ print_red_alert "BGP not supported for #{router['type']['name']}"
1929
+ end
1930
+ print reset
1931
+ end
1932
+
1933
+ def bgp_neighbor(args)
1934
+ options = {}
1935
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
1936
+ opts.banner = subcommand_usage("[router] [BGP neighbor]")
1937
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
1938
+ opts.footer = "Display details on network router BGP neighbor." + "\n" +
1939
+ "[router] is required. This is the name or id of a network router.\n" +
1940
+ "[BGP neighbor] is required. This is the id of a BGP neighbor.\n"
1941
+ end
1942
+
1943
+ optparse.parse!(args)
1944
+ connect(options)
1945
+
1946
+ if args.count < 2
1947
+ puts optparse
1948
+ return 1
1949
+ end
1950
+
1951
+ @network_routers_interface.setopts(options)
1952
+ if options[:dry_run]
1953
+ if args[0].to_s =~ /\A\d{1,}\Z/
1954
+ print_dry_run @network_routers_interface.dry.get(args[0].to_i)
1955
+ else
1956
+ print_dry_run @network_routers_interface.dry.list({name:args[0]})
1957
+ end
1958
+ return
1959
+ end
1960
+ router = find_router(args[0])
1961
+ if router.nil?
1962
+ return 1
1963
+ end
1964
+
1965
+ if router['type']['hasBgp']
1966
+ bgp_neighbor = (router['bgpNeighbors'] || []).find {|it| it['id'] == args[1].to_i}
1967
+
1968
+ if bgp_neighbor
1969
+ json_response = {'networkRouterBgpNeighbor' => bgp_neighbor}
1970
+ render_response(json_response, options, 'networkRouterBgpNeighbor') do
1971
+ print_h1 "Network Router BGP Neighbor Details"
1972
+ print cyan
1973
+
1974
+ description_cols = {
1975
+ "ID" => lambda {|it| it['id']}
1976
+ }
1977
+
1978
+ router['type']['bgpNeighborOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
1979
+ description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
1980
+ end
1981
+ print_description_list(description_cols, bgp_neighbor)
1982
+ end
1983
+ else
1984
+ print_red_alert "BGP Neighbors #{args[1]} not found for router #{router['name']}"
1985
+ end
1986
+ else
1987
+ print_red_alert "BGP Neighbors not supported for #{router['type']['name']}"
1988
+ end
1989
+ println reset
1990
+ end
1991
+
1992
+ def add_bgp_neighbor(args)
1993
+ options = {:options=>{}}
1994
+ params = {}
1995
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
1996
+ opts.banner = subcommand_usage("[router]")
1997
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
1998
+ opts.footer = "Create a network router BGP neighbor."
1999
+ end
2000
+ optparse.parse!(args)
2001
+ connect(options)
2002
+ if args.count < 1
2003
+ print_error Morpheus::Terminal.angry_prompt
2004
+ puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
2005
+ return 1
2006
+ end
2007
+
2008
+ router = find_router(args[0])
2009
+
2010
+ if router.nil?
2011
+ return 1
2012
+ end
2013
+
2014
+ if !router['type']['hasNat']
2015
+ print_red_alert "BGP not supported for #{router['type']['name']}"
2016
+ return 1
2017
+ end
2018
+
2019
+ if options[:payload]
2020
+ payload = options[:payload]
2021
+ else
2022
+ option_types = router['type']['bgpNeighborOptionTypes'].sort_by {|it| it['displayOrder']}
2023
+
2024
+ # prompt options
2025
+ option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'bgpNeighbor' => ''}}), @api_client, {'networkRouterId' => router['id']}, nil, true)
2026
+ payload = {'networkRouterBgpNeighbor' => params.deep_merge(option_result)}
2027
+ end
2028
+
2029
+ @network_routers_interface.setopts(options)
2030
+ if options[:dry_run]
2031
+ print_dry_run @network_routers_interface.dry.create_bgp_neighbor(router['id'], payload)
2032
+ return
2033
+ end
2034
+
2035
+ json_response = @network_routers_interface.create_bgp_neighbor(router['id'], payload)
2036
+ render_response(json_response, options, 'networkRouterBgpNeighbor') do
2037
+ print_green_success "\nAdded Network Router BGP neighbor #{json_response['id']}\n"
2038
+ _bgp_neighbors(router['id'], options)
2039
+ end
2040
+ end
2041
+
2042
+ def update_bgp_neighbor(args)
2043
+ options = {:options=>{}}
2044
+ params = {}
2045
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
2046
+ opts.banner = subcommand_usage("[router] [BGP neighbor]")
2047
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
2048
+ opts.footer = "Update a network router BGP neighbor.\n" +
2049
+ "[router] is required. This is the name or id of an existing network router.\n" +
2050
+ "[BGP neighbor] is required. This is the id of an existing network router BGP neighbor."
2051
+ end
2052
+ optparse.parse!(args)
2053
+ if args.count != 2
2054
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args}\n#{optparse}"
2055
+ end
2056
+ connect(options)
2057
+
2058
+ router = find_router(args[0])
2059
+
2060
+ if router.nil?
2061
+ return 1
2062
+ end
2063
+
2064
+ if !router['type']['hasBgp']
2065
+ print_red_alert "BGP not supported for #{router['type']['name']}"
2066
+ return 1
2067
+ end
2068
+
2069
+ bgp_neighbor = router['bgpNeighbors'] ? router['bgpNeighbors'].find {|it| it['id'] == args[1].to_i} : nil
2070
+
2071
+ if !bgp_neighbor
2072
+ print_red_alert "BGP neighbor #{args[1]} not found for router #{router['name']}"
2073
+ exit 1
2074
+ end
2075
+
2076
+ payload = parse_payload(options) || {'networkRouterBgpNeighbor' => params}
2077
+ payload['networkRouterBgpNeighbor'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['networkRouterBgpNeighbor'].nil?
2078
+
2079
+ if payload['networkRouterBgpNeighbor'].empty?
2080
+ option_types = router['type']['bgpNeighborOptionTypes'].sort_by {|it| it['displayOrder']}
2081
+ print_green_success "Nothing to update"
2082
+ println cyan
2083
+ print Morpheus::Cli::OptionTypes.display_option_types_help(
2084
+ option_types,
2085
+ {:include_context => true, :context_map => {'bgpNeighbor' => ''}, :color => cyan, :title => "Available BGP Neighbor Options"}
2086
+ )
2087
+ exit 1
2088
+ end
2089
+
2090
+ @network_routers_interface.setopts(options)
2091
+ if options[:dry_run]
2092
+ print_dry_run @network_routers_interface.dry.update_bgp_neighbor(router['id'], bgp_neighbor['id'], payload)
2093
+ return
2094
+ end
2095
+
2096
+ json_response = @network_routers_interface.update_bgp_neighbor(router['id'], bgp_neighbor['id'], payload)
2097
+ render_response(json_response, options, 'networkRouterBgpNeighbor') do
2098
+ print_green_success "\nUpdated Network Router BGP Neighbor #{bgp_neighbor['id']}\n"
2099
+ _bgp_neighbors(router['id'], options)
2100
+ end
2101
+ end
2102
+
2103
+ def remove_bgp_neighbor(args)
2104
+ options = {}
2105
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
2106
+ opts.banner = subcommand_usage("[router] [BGP neighbor]")
2107
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
2108
+ opts.footer = "Delete a network router BGP neighbor.\n" +
2109
+ "[router] is required. This is the name or id of an existing network router."
2110
+ "[BGP neighbor] is required. This is the id of an existing network router BGP neighbor."
2111
+ end
2112
+ optparse.parse!(args)
2113
+ if args.count != 2
2114
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args}\n#{optparse}"
2115
+ end
2116
+ connect(options)
2117
+
2118
+ router = find_router(args[0])
2119
+ return if !router
2120
+
2121
+ if !router['type']['hasBgp']
2122
+ print_red_alert "BGP not supported for #{router['type']['name']}"
2123
+ return 1
2124
+ end
2125
+
2126
+ bgp_neighbor = router['bgpNeighbors'] ? router['bgpNeighbors'].find {|it| it['id'] == args[1].to_i} : nil
2127
+
2128
+ if !bgp_neighbor
2129
+ print_red_alert "BGP neighbor #{args[1]} not found for router #{router['name']}"
2130
+ exit 1
2131
+ end
2132
+
2133
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the BGP neighbor '#{bgp_neighbor['id']}' from router '#{router['name']}'?", options)
2134
+ return 9, "aborted command"
2135
+ end
2136
+ @network_routers_interface.setopts(options)
2137
+ if options[:dry_run]
2138
+ print_dry_run @network_routers_interface.dry.destroy_bgp_neighbor(router['id'], bgp_neighbor['id'])
2139
+ return
2140
+ end
2141
+ json_response = @network_routers_interface.destroy_bgp_neighbor(router['id'], bgp_neighbor['id'])
2142
+ render_response(json_response, options, 'networkRouterBgpNeighbor') do
2143
+ print_green_success "\nDeleted Network Router BGP Neighbor #{bgp_neighbor['id']}\n"
2144
+ _bgp_neighbors(router['id'], options)
2145
+ end
2146
+ end
2147
+
1890
2148
  def types(args)
1891
2149
  options = {}
1892
2150
  optparse = Morpheus::Cli::OptionParser.new do |opts|
@@ -1989,7 +2247,7 @@ class Morpheus::Cli::NetworkRoutersCommand
1989
2247
  }
1990
2248
  print_description_list(description_cols, router_type)
1991
2249
 
1992
- {'optionTypes' => 'Router', 'ruleOptionTypes' => 'Firewall Rule', 'ruleGroupOptionTypes' => 'Firewall Rule Group', 'natOptionTypes' => 'NAT'}.each_pair do |field, title|
2250
+ {'optionTypes' => 'Router', 'ruleOptionTypes' => 'Firewall Rule', 'ruleGroupOptionTypes' => 'Firewall Rule Group', 'natOptionTypes' => 'NAT', 'bgpNeighborOptionTypes' => 'BGP Neighbor'}.each_pair do |field, title|
1993
2251
  if !router_type[field].nil? && router_type[field].count > 0
1994
2252
  println cyan
1995
2253
  print Morpheus::Cli::OptionTypes.display_option_types_help(
@@ -2187,6 +2445,27 @@ class Morpheus::Cli::NetworkRoutersCommand
2187
2445
  end
2188
2446
  end
2189
2447
 
2448
+ def print_bgp_neighbors(router)
2449
+ if router['type']['hasBgp']
2450
+ if router['bgpNeighbors'].count > 0
2451
+ rows = router['bgpNeighbors'].sort_by {|it| it['id']}.collect do |it|
2452
+ {
2453
+ id: it['id'],
2454
+ ip_address: it['ipAddress'],
2455
+ bfd_enabled: it['bfdEnabled'],
2456
+ remote_as: it['remoteAs'],
2457
+ route_filtering_out: it['routeFilteringOut'],
2458
+ route_filtering_in: it['routeFilteringIn'],
2459
+ allow_as_in: it['allowAsIn']
2460
+ }
2461
+ end
2462
+ puts as_pretty_table(rows, [:id, :ip_address, :bfd_enabled, :remote_as, :route_filtering_out, :route_filtering_in, :allow_as_in])
2463
+ else
2464
+ println "No BGP Neighbors\n"
2465
+ end
2466
+ end
2467
+ end
2468
+
2190
2469
  def format_router_status(router, return_color = cyan)
2191
2470
  status = router['status']
2192
2471
  color = white
@@ -1,8 +1,4 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::NetworkServicesCommand
8
4
  include Morpheus::Cli::CliCommand