morpheus-cli 5.3.3 → 5.4.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.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/account_users_interface.rb +68 -0
  4. data/lib/morpheus/api/api_client.rb +75 -8
  5. data/lib/morpheus/api/audit_interface.rb +9 -0
  6. data/lib/morpheus/api/clouds_interface.rb +4 -11
  7. data/lib/morpheus/api/health_interface.rb +37 -3
  8. data/lib/morpheus/api/instances_interface.rb +21 -0
  9. data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
  10. data/lib/morpheus/api/load_balancer_profiles_interface.rb +9 -0
  11. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +9 -0
  12. data/lib/morpheus/api/load_balancers_interface.rb +5 -0
  13. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  14. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  15. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  16. data/lib/morpheus/api/network_routers_interface.rb +30 -0
  17. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  18. data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
  19. data/lib/morpheus/api/read_interface.rb +4 -3
  20. data/lib/morpheus/api/rest_interface.rb +5 -4
  21. data/lib/morpheus/api/roles_interface.rb +7 -0
  22. data/lib/morpheus/api/secondary_read_interface.rb +1 -1
  23. data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
  24. data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
  25. data/lib/morpheus/api/storage_servers_interface.rb +9 -0
  26. data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
  27. data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
  28. data/lib/morpheus/api/users_interface.rb +16 -63
  29. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  30. data/lib/morpheus/cli/cli_command.rb +262 -14
  31. data/lib/morpheus/cli/cli_registry.rb +2 -1
  32. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  33. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  34. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  35. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +1 -4
  36. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  37. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  38. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +14 -87
  39. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  40. data/lib/morpheus/cli/commands/audit.rb +188 -0
  41. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  42. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  43. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  44. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  45. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +1 -1
  46. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  47. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  48. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  49. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  50. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  51. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  52. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  53. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  54. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +1 -5
  55. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  56. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +38 -19
  57. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  58. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  59. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  60. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  61. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  62. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  63. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  64. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  65. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  66. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  67. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  68. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  69. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  70. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  71. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  72. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  73. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  74. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  75. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  76. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  77. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  78. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  79. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  80. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  81. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +15 -25
  82. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +6 -16
  83. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  84. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +220 -13
  85. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +1 -12
  86. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +43 -39
  87. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  88. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  89. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +0 -4
  90. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  91. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  92. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  93. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  94. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  95. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  96. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  97. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  98. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  99. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  100. data/lib/morpheus/cli/commands/load_balancer_monitors.rb +70 -0
  101. data/lib/morpheus/cli/commands/load_balancer_pools.rb +90 -0
  102. data/lib/morpheus/cli/commands/load_balancer_profiles.rb +64 -0
  103. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +9 -8
  104. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +147 -0
  105. data/lib/morpheus/cli/commands/load_balancers.rb +192 -0
  106. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  107. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  108. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  109. data/lib/morpheus/cli/commands/logout.rb +63 -0
  110. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  111. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  112. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  113. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  114. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +0 -1
  115. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  116. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  117. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  118. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  119. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  120. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  121. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  122. data/lib/morpheus/cli/commands/network_firewalls_command.rb +823 -0
  123. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  124. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  125. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  126. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  127. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +387 -57
  128. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  129. data/lib/morpheus/cli/commands/network_static_routes_command.rb +446 -0
  130. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  131. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +20 -20
  132. data/lib/morpheus/cli/commands/open_command.rb +30 -0
  133. data/lib/morpheus/cli/commands/options.rb +98 -0
  134. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  135. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  136. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +1 -8
  137. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  138. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  139. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  140. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +7 -7
  141. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  142. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  143. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  144. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  145. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  146. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +5 -9
  147. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  148. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  149. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +245 -40
  150. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  151. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  152. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  153. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  154. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  155. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  156. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  157. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +4 -105
  158. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  159. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  160. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  161. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  162. data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
  163. data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
  164. data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
  165. data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
  166. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  167. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  168. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  169. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +1 -8
  170. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  171. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  172. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +1 -2
  173. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +2 -1
  174. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +1 -2
  175. data/lib/morpheus/cli/{users.rb → commands/users.rb} +28 -35
  176. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  177. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  178. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  179. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  180. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +0 -0
  181. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  182. data/lib/morpheus/cli/commands/view.rb +102 -0
  183. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +2 -4
  184. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  185. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  186. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  187. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  188. data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
  189. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +26 -6
  190. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  191. data/lib/morpheus/cli/mixins/print_helper.rb +51 -18
  192. data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
  193. data/lib/morpheus/cli/mixins/provisioning_helper.rb +48 -17
  194. data/lib/morpheus/cli/mixins/rest_command.rb +270 -94
  195. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +667 -0
  196. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
  197. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
  198. data/lib/morpheus/cli/option_types.rb +149 -40
  199. data/lib/morpheus/cli/version.rb +1 -1
  200. data/lib/morpheus/cli.rb +6 -128
  201. data/lib/morpheus/ext/string.rb +29 -6
  202. data/lib/morpheus/routes.rb +238 -0
  203. data/lib/morpheus/terminal.rb +5 -6
  204. data/lib/morpheus/util.rb +6 -1
  205. metadata +176 -141
  206. data/lib/morpheus/cli/change_password_command.rb +0 -147
  207. data/lib/morpheus/cli/library.rb +0 -1
  208. data/lib/morpheus/cli/load_balancers.rb +0 -245
  209. data/lib/morpheus/cli/logout.rb +0 -81
@@ -0,0 +1,446 @@
1
+ require 'morpheus/cli/cli_command'
2
+
3
+ class Morpheus::Cli::NetworkStaticRoutesCommand
4
+ include Morpheus::Cli::CliCommand
5
+ include Morpheus::Cli::ProvisioningHelper
6
+ include Morpheus::Cli::WhoamiHelper
7
+
8
+ set_command_name :'network-static-routes'
9
+ register_subcommands :list, :get, :add, :remove, :update
10
+
11
+ def connect(opts)
12
+ @api_client = establish_remote_appliance_connection(opts)
13
+ @account_interface = @api_client.accounts
14
+ @network_static_routes_interface = @api_client.network_static_routes
15
+ @networks_interface = @api_client.networks
16
+ @network_types_interface = @api_client.network_types
17
+ @options_interface = @api_client.options
18
+ end
19
+
20
+ def handle(args)
21
+ handle_subcommand(args)
22
+ end
23
+
24
+ def list(args)
25
+ options = {}
26
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
27
+ opts.banner = subcommand_usage("[network] [search]")
28
+ build_standard_list_options(opts, options)
29
+ opts.footer = "List network DHCP Static Routes." + "\n" +
30
+ "[network] is required. This is the name or id of a network."
31
+ end
32
+
33
+ optparse.parse!(args)
34
+ connect(options)
35
+
36
+ verify_args!(args:args, optparse:optparse, min:1)
37
+ if args.count > 1
38
+ options[:phrase] = args[1..-1].join(" ")
39
+ end
40
+
41
+ network = find_network(args[0])
42
+ if network.nil?
43
+ return 1
44
+ end
45
+
46
+ network_type = find_network_type(network['type']['id'])
47
+ if network_type.nil?
48
+ return 1
49
+ end
50
+
51
+ _list(network, network_type, options)
52
+ end
53
+
54
+ def _list(network, network_type, options)
55
+ params = parse_list_options(options)
56
+ @network_static_routes_interface.setopts(options)
57
+ if options[:dry_run]
58
+ print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], params)
59
+ return
60
+ end
61
+
62
+ json_response = @network_static_routes_interface.list_static_routes(network['id'], params)
63
+ render_response(json_response, options, 'networkRoutes') do
64
+ print_h1 "Network DHCP Static Routes For: #{network['name']}"
65
+ print_static_routes(network, network_type, json_response)
66
+ end
67
+ return 0, nil
68
+ end
69
+
70
+ def get(args)
71
+ options = {}
72
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
73
+ opts.banner = subcommand_usage("[network] [network_route]")
74
+ build_standard_get_options(opts, options)
75
+ opts.footer = "Display details on a network Static Route." + "\n" +
76
+ "[network] is required. This is the name or id of a network.\n" +
77
+ "[network_route] is required. This is the id of a network route.\n"
78
+ end
79
+
80
+ optparse.parse!(args)
81
+ connect(options)
82
+
83
+ verify_args!(args:args, optparse:optparse, count:2)
84
+
85
+ network = find_network(args[0])
86
+ if network.nil?
87
+ return 1
88
+ end
89
+
90
+ network_type = find_network_type(network['type']['id'])
91
+ if network_type.nil?
92
+ return 1
93
+ end
94
+
95
+ _get(network, network_type, args[1], options)
96
+ end
97
+
98
+ def _get(network, network_type, route_id, options)
99
+ # params = parse_query_options(options) # todo: use this
100
+ @network_static_routes_interface.setopts(options)
101
+
102
+ if options[:dry_run]
103
+ if route_id.to_s =~ /\A\d{1,}\Z/
104
+ print_dry_run @network_static_routes_interface.dry.get_static_route(network['id'], route_id.to_i)
105
+ else
106
+ print_dry_run @network_static_routes_interface.dry.list_static_routes(network['id'], {name: route_id})
107
+ end
108
+ return
109
+ end
110
+
111
+ route = find_static_route(network['id'], route_id)
112
+ return 1 if route.nil?
113
+
114
+ render_response({route: route}, options, 'route') do
115
+ print_h1 "Network Route Details"
116
+ print cyan
117
+
118
+ description_cols = {}
119
+
120
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
121
+ description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
122
+ end
123
+ print_description_list(description_cols, route)
124
+ end
125
+
126
+ println reset
127
+ end
128
+
129
+ def add(args)
130
+ options = {:options=>{}}
131
+ params = {}
132
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
133
+ opts.banner = subcommand_usage("[network]")
134
+ build_standard_add_options(opts, options)
135
+ opts.footer = "Create a network static route." + "\n" +
136
+ "[network] is required. This is the name or id of a network.\n";
137
+ end
138
+ optparse.parse!(args)
139
+ connect(options)
140
+ verify_args!(args:args, optparse:optparse, count:1)
141
+
142
+ network = find_network(args[0])
143
+ if network.nil?
144
+ return 1
145
+ end
146
+
147
+ network_type = find_network_type(network['type']['id'])
148
+ if network_type.nil?
149
+ return 1
150
+ end
151
+
152
+ payload = nil
153
+ if options[:payload]
154
+ payload = options[:payload]
155
+ else
156
+ option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
157
+ # prompt options
158
+ option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'networkRoute' => ''}}), @api_client, {'networkId' => network['id']}, nil, true)
159
+ payload = {'networkRoute' => params.deep_merge(option_result)}
160
+ # copy all domain level fields to route
161
+ if payload['networkRoute']['domain']
162
+ payload['networkRoute']['domain'].each do |k,v|
163
+ payload['networkRoute'][k] = v
164
+ end
165
+ end
166
+ payload['networkRoute'].delete('domain')
167
+
168
+ end
169
+
170
+ @network_static_routes_interface.setopts(options)
171
+
172
+ if options[:dry_run]
173
+ print_dry_run @network_static_routes_interface.dry.create_static_route(network['id'], payload)
174
+ return
175
+ end
176
+
177
+ json_response = @network_static_routes_interface.create_static_route(network['id'], payload)
178
+ render_response(json_response, options, 'networkRoute') do
179
+ print_green_success "\nAdded Network Static Route #{json_response['id']}\n"
180
+ _get(network, network_type, json_response['id'], options)
181
+ end
182
+ end
183
+
184
+ def update(args)
185
+ options = {:options=>{}}
186
+ params = {}
187
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
188
+ opts.banner = subcommand_usage("[network] [networkRoute]")
189
+ build_standard_update_options(opts, options)
190
+ opts.footer = "Update a network Static Route.\n" +
191
+ "[network] is required. This is the name or id of an existing network.\n" +
192
+ "[networkRoute] is required. This is the name or id of an existing network static route."
193
+ end
194
+ optparse.parse!(args)
195
+ verify_args!(args:args, optparse:optparse, count:2)
196
+ connect(options)
197
+
198
+ network = find_network(args[0])
199
+ if network.nil?
200
+ return 1
201
+ end
202
+
203
+ network_type = find_network_type(network['type']['id'])
204
+ if network_type.nil?
205
+ return 1
206
+ end
207
+
208
+ route = find_static_route(network['id'], args[1])
209
+ return 1 if route.nil?
210
+
211
+ payload = parse_payload(options) || {'networkRoute' => params}
212
+ payload['networkRoute'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['networkRoute'].nil?
213
+
214
+ if payload['networkRoute'].empty?
215
+ option_types = network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}
216
+ print_green_success "Nothing to update"
217
+ println cyan
218
+ print Morpheus::Cli::OptionTypes.display_option_types_help(
219
+ option_types,
220
+ {:include_context => true, :context_map => {'networkRoute' => ''}, :color => cyan, :title => "Available Network Static Route Options"}
221
+ )
222
+ exit 1
223
+ end
224
+
225
+ # copy all domain level fields to route
226
+ if payload['networkRoute']['domain']
227
+ payload['networkRoute']['domain'].each do |k,v|
228
+ payload['networkRoute'][k] = v
229
+ end
230
+ payload['networkRoute'].delete('domain')
231
+ end
232
+
233
+ @network_static_routes_interface.setopts(options)
234
+
235
+ if options[:dry_run]
236
+ print_dry_run @network_static_routes_interface.dry.update_static_route(network['id'], route['id'], payload)
237
+ return
238
+ end
239
+
240
+ # build update payload
241
+ update_payload = {'networkRoute' => route.select{|x| !['id', 'code', 'internalId', 'externalId', 'uniqueId', 'providerId', 'externalType', 'enabled', 'visible', 'externalInterface'].include?(x)}}.deep_merge(payload)
242
+
243
+ json_response = @network_static_routes_interface.update_static_route(network['id'], route['id'], update_payload)
244
+ render_response(json_response, options, 'networkRoute') do
245
+ print_green_success "\nUpdated Network Static Route #{route['id']}\n"
246
+ _get(network, network_type, route['id'], options)
247
+ end
248
+ end
249
+
250
+ def remove(args)
251
+ options = {}
252
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
253
+ opts.banner = subcommand_usage("[network] [network_route]")
254
+ build_standard_remove_options(opts, options)
255
+ opts.footer = "Delete a network static route.\n" +
256
+ "[network] is required. This is the name or id of an existing network.\n" +
257
+ "[network_route] is required. This is the name or id of an existing network static route."
258
+ end
259
+ optparse.parse!(args)
260
+ verify_args!(args:args, optparse:optparse, count:2)
261
+ connect(options)
262
+
263
+ network = find_network(args[0])
264
+ if network.nil?
265
+ return 1
266
+ end
267
+
268
+ network_type = find_network_type(network['type']['id'])
269
+ if network_type.nil?
270
+ return 1
271
+ end
272
+
273
+ route = find_static_route(network['id'], args[1])
274
+ return 1 if route.nil?
275
+
276
+ unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the network static route '#{route['source']},#{route['destination']}' from network '#{network['name']}'?", options)
277
+ return 9, "aborted command"
278
+ end
279
+
280
+ @network_static_routes_interface.setopts(options)
281
+
282
+ if options[:dry_run]
283
+ print_dry_run @network_static_routes_interface.dry.delete_static_routes(network['id'], route['id'])
284
+ return
285
+ end
286
+ json_response = @network_static_routes_interface.delete_static_route(network['id'], route['id'])
287
+ render_response(json_response, options, 'networkRoute') do
288
+ print_green_success "\nDeleted Network Static Route '#{route['source']},#{route['destination']}'\n"
289
+ _list(network, network_type, options)
290
+ end
291
+ end
292
+
293
+ private
294
+
295
+ def print_static_routes(network, network_type, json_response)
296
+ routes = json_response['networkRoutes']
297
+ print cyan
298
+ if routes.count > 0
299
+ cols = [:id]
300
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
301
+ cols << option_type['fieldLabel']
302
+ end
303
+ rows = routes.collect do |it|
304
+ row = {
305
+ id: it['id']
306
+ }
307
+ network_type['routeOptionTypes'].sort_by {|it| it['displayOrder']}.each do |option_type|
308
+ row[option_type['fieldLabel']] = Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)
309
+ end
310
+ row
311
+ end
312
+ print as_pretty_table(rows, cols)
313
+ print_results_pagination(json_response)
314
+ else
315
+ println "No Static Routes"
316
+ end
317
+ println reset
318
+ end
319
+
320
+ def find_network(val)
321
+ if val.to_s =~ /\A\d{1,}\Z/
322
+ return find_network_by_id(val)
323
+ else
324
+ if network = find_network_by_name(val)
325
+ return find_network_by_id(network['id'])
326
+ end
327
+ end
328
+ end
329
+
330
+ def find_network_by_id(id)
331
+ begin
332
+ json_response = @networks_interface.get(id.to_i)
333
+ return json_response['network']
334
+ rescue RestClient::Exception => e
335
+ if e.response && e.response.code == 404
336
+ print_red_alert "Network not found by id #{id}"
337
+ return nil
338
+ else
339
+ raise e
340
+ end
341
+ end
342
+ end
343
+
344
+ def find_network_by_name(name)
345
+ json_response = @networks_interface.list({phrase: name.to_s})
346
+ networks = json_response['network']
347
+ if networks.empty?
348
+ print_red_alert "Network not found by name #{name}"
349
+ return nil
350
+ elsif networks.size > 1
351
+ print_red_alert "#{networks.size} network found by name #{name}"
352
+ rows = networks.collect do |it|
353
+ {id: it['id'], name: it['name']}
354
+ end
355
+ puts as_pretty_table(rows, [:id, :name], {color:red})
356
+ return nil
357
+ else
358
+ return networks[0]
359
+ end
360
+ end
361
+
362
+ def find_network_type(val)
363
+ if val.to_s =~ /\A\d{1,}\Z/
364
+ return find_network_type_by_id(val)
365
+ else
366
+ if network_type = find_network_type_by_name(val)
367
+ return find_network_type_by_id(network_type['id'])
368
+ end
369
+ end
370
+ end
371
+
372
+ def find_network_type_by_id(id)
373
+ begin
374
+ json_response = @network_types_interface.get(id.to_i)
375
+ return json_response['networkType']
376
+ rescue RestClient::Exception => e
377
+ if e.response && e.response.code == 404
378
+ print_red_alert "Network Type not found by id #{id}"
379
+ return nil
380
+ else
381
+ raise e
382
+ end
383
+ end
384
+ end
385
+
386
+ def find_network_type_by_name(name)
387
+ json_response = @network_types_interface.list({phrase: name.to_s})
388
+ networkTypes = json_response['networkType']
389
+ if networkTypes.empty?
390
+ print_red_alert "Network Type not found by name #{name}"
391
+ return nil
392
+ elsif networkTypes.size > 1
393
+ print_red_alert "#{networkTypes.size} network type found by name #{name}"
394
+ rows = networkTypes.collect do |it|
395
+ {id: it['id'], name: it['name']}
396
+ end
397
+ puts as_pretty_table(rows, [:id, :name], {color:red})
398
+ return nil
399
+ else
400
+ return networkTypes[0]
401
+ end
402
+ end
403
+
404
+ def find_static_route(network_id, val)
405
+ if val.to_s =~ /\A\d{1,}\Z/
406
+ return find_static_route_by_id(network_id, val)
407
+ else
408
+ if route = find_static_route_by_name(network_id, val)
409
+ return find_static_route_by_id(network_id, route['id'])
410
+ end
411
+ end
412
+ end
413
+
414
+ def find_static_route_by_id(network_id, route_id)
415
+ begin
416
+ json_response = @network_static_routes_interface.get_static_route(network_id, route_id.to_i)
417
+ return json_response['networkRoute']
418
+ rescue RestClient::Exception => e
419
+ if e.response && e.response.code == 404
420
+ print_red_alert "Network Static Route not found by id #{route_id}"
421
+ return nil
422
+ else
423
+ raise e
424
+ end
425
+ end
426
+ end
427
+
428
+ def find_static_route_by_name(network_id, name)
429
+ json_response = @network_static_routes_interface.list_static_routes(network_id, {phrase: name.to_s})
430
+ routes = json_response['networkRoutes']
431
+ if routes.empty?
432
+ print_red_alert "Network Static Routes not found by name #{name}"
433
+ return nil
434
+ elsif routes.size > 1
435
+ print_red_alert "#{routes.size} network Static Routes found by name #{name}"
436
+ rows = routes.collect do |it|
437
+ {id: it['id'], source: it['source'], destination: it['destination']}
438
+ end
439
+ puts as_pretty_table(rows, [:id, :source, :destination], {color:red})
440
+ return nil
441
+ else
442
+ return routes[0]
443
+ end
444
+ end
445
+
446
+ end