mtncloud-cli 1.0.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 (499) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +20 -0
  3. data/.github/pull_request_template.md +14 -0
  4. data/.github/workflows/ci.yml +56 -0
  5. data/.github/workflows/release.yml +46 -0
  6. data/.gitignore +25 -0
  7. data/CLAUDE.md +24 -0
  8. data/CONTRIBUTING.md +91 -0
  9. data/Dockerfile +19 -0
  10. data/Gemfile +4 -0
  11. data/LICENSE.txt +23 -0
  12. data/README.md +187 -0
  13. data/Rakefile +26 -0
  14. data/bin/mcs +3 -0
  15. data/bin/mtncloud +27 -0
  16. data/lib/mtncloud/api/account_groups_interface.rb +48 -0
  17. data/lib/mtncloud/api/account_users_interface.rb +68 -0
  18. data/lib/mtncloud/api/accounts_interface.rb +9 -0
  19. data/lib/mtncloud/api/activity_interface.rb +9 -0
  20. data/lib/mtncloud/api/affinity_groups_interface.rb +46 -0
  21. data/lib/mtncloud/api/api_client.rb +1091 -0
  22. data/lib/mtncloud/api/appliance_settings_interface.rb +49 -0
  23. data/lib/mtncloud/api/approvals_interface.rb +32 -0
  24. data/lib/mtncloud/api/apps_interface.rb +180 -0
  25. data/lib/mtncloud/api/archive_buckets_interface.rb +116 -0
  26. data/lib/mtncloud/api/archive_files_interface.rb +173 -0
  27. data/lib/mtncloud/api/audit_interface.rb +9 -0
  28. data/lib/mtncloud/api/auth_interface.rb +58 -0
  29. data/lib/mtncloud/api/backup_jobs_interface.rb +13 -0
  30. data/lib/mtncloud/api/backup_restores_interface.rb +27 -0
  31. data/lib/mtncloud/api/backup_results_interface.rb +32 -0
  32. data/lib/mtncloud/api/backup_service_types_interface.rb +9 -0
  33. data/lib/mtncloud/api/backup_services_interface.rb +9 -0
  34. data/lib/mtncloud/api/backup_settings_interface.rb +20 -0
  35. data/lib/mtncloud/api/backup_types_interface.rb +9 -0
  36. data/lib/mtncloud/api/backups_interface.rb +21 -0
  37. data/lib/mtncloud/api/billing_interface.rb +34 -0
  38. data/lib/mtncloud/api/blueprints_interface.rb +70 -0
  39. data/lib/mtncloud/api/body_io.rb +22 -0
  40. data/lib/mtncloud/api/budgets_interface.rb +48 -0
  41. data/lib/mtncloud/api/catalog_item_types_interface.rb +29 -0
  42. data/lib/mtncloud/api/certificate_types_interface.rb +14 -0
  43. data/lib/mtncloud/api/certificates_interface.rb +9 -0
  44. data/lib/mtncloud/api/clients_interface.rb +41 -0
  45. data/lib/mtncloud/api/cloud_datastores_interface.rb +48 -0
  46. data/lib/mtncloud/api/cloud_folders_interface.rb +41 -0
  47. data/lib/mtncloud/api/cloud_policies_interface.rb +41 -0
  48. data/lib/mtncloud/api/cloud_resource_pools_interface.rb +66 -0
  49. data/lib/mtncloud/api/clouds_interface.rb +217 -0
  50. data/lib/mtncloud/api/clusters_interface.rb +471 -0
  51. data/lib/mtncloud/api/containers_interface.rb +145 -0
  52. data/lib/mtncloud/api/credential_types_interface.rb +9 -0
  53. data/lib/mtncloud/api/credentials_interface.rb +9 -0
  54. data/lib/mtncloud/api/custom_instance_types_interface.rb +99 -0
  55. data/lib/mtncloud/api/cypher_interface.rb +51 -0
  56. data/lib/mtncloud/api/dashboard_interface.rb +14 -0
  57. data/lib/mtncloud/api/datastores_interface.rb +21 -0
  58. data/lib/mtncloud/api/deploy_interface.rb +44 -0
  59. data/lib/mtncloud/api/deployments_interface.rb +79 -0
  60. data/lib/mtncloud/api/distributed_workers_interface.rb +41 -0
  61. data/lib/mtncloud/api/email_templates_interface.rb +53 -0
  62. data/lib/mtncloud/api/environments_interface.rb +48 -0
  63. data/lib/mtncloud/api/execute_schedules_interface.rb +71 -0
  64. data/lib/mtncloud/api/execution_request_interface.rb +27 -0
  65. data/lib/mtncloud/api/file_copy_request_interface.rb +68 -0
  66. data/lib/mtncloud/api/forgot_password_interface.rb +17 -0
  67. data/lib/mtncloud/api/group_policies_interface.rb +41 -0
  68. data/lib/mtncloud/api/groups_interface.rb +73 -0
  69. data/lib/mtncloud/api/guidance_interface.rb +44 -0
  70. data/lib/mtncloud/api/guidance_settings_interface.rb +17 -0
  71. data/lib/mtncloud/api/health_interface.rb +100 -0
  72. data/lib/mtncloud/api/host_vm_groups_interface.rb +37 -0
  73. data/lib/mtncloud/api/hub_interface.rb +25 -0
  74. data/lib/mtncloud/api/image_builder_boot_scripts_interface.rb +41 -0
  75. data/lib/mtncloud/api/image_builder_image_builds_interface.rb +73 -0
  76. data/lib/mtncloud/api/image_builder_interface.rb +20 -0
  77. data/lib/mtncloud/api/image_builder_preseed_scripts_interface.rb +41 -0
  78. data/lib/mtncloud/api/instance_types_interface.rb +20 -0
  79. data/lib/mtncloud/api/instances_interface.rb +453 -0
  80. data/lib/mtncloud/api/integration_types_interface.rb +14 -0
  81. data/lib/mtncloud/api/integrations_interface.rb +74 -0
  82. data/lib/mtncloud/api/invoice_line_items_interface.rb +9 -0
  83. data/lib/mtncloud/api/invoices_interface.rb +28 -0
  84. data/lib/mtncloud/api/jobs_interface.rb +83 -0
  85. data/lib/mtncloud/api/key_pairs_interface.rb +57 -0
  86. data/lib/mtncloud/api/library_cluster_layouts_interface.rb +47 -0
  87. data/lib/mtncloud/api/library_cluster_packages_interface.rb +60 -0
  88. data/lib/mtncloud/api/library_container_scripts_interface.rb +43 -0
  89. data/lib/mtncloud/api/library_container_templates_interface.rb +43 -0
  90. data/lib/mtncloud/api/library_container_types_interface.rb +59 -0
  91. data/lib/mtncloud/api/library_container_upgrades_interface.rb +60 -0
  92. data/lib/mtncloud/api/library_instance_types_interface.rb +74 -0
  93. data/lib/mtncloud/api/library_layouts_interface.rb +69 -0
  94. data/lib/mtncloud/api/library_operating_systems_interface.rb +63 -0
  95. data/lib/mtncloud/api/library_spec_template_types_interface.rb +43 -0
  96. data/lib/mtncloud/api/library_spec_templates_interface.rb +43 -0
  97. data/lib/mtncloud/api/license_interface.rb +30 -0
  98. data/lib/mtncloud/api/load_balancer_monitors_interface.rb +9 -0
  99. data/lib/mtncloud/api/load_balancer_pool_nodes_interface.rb +8 -0
  100. data/lib/mtncloud/api/load_balancer_pools_interface.rb +9 -0
  101. data/lib/mtncloud/api/load_balancer_pools_secondary_interface.rb +9 -0
  102. data/lib/mtncloud/api/load_balancer_profiles_interface.rb +9 -0
  103. data/lib/mtncloud/api/load_balancer_types_interface.rb +9 -0
  104. data/lib/mtncloud/api/load_balancer_virtual_servers_interface.rb +18 -0
  105. data/lib/mtncloud/api/load_balancers_interface.rb +14 -0
  106. data/lib/mtncloud/api/log_settings_interface.rb +44 -0
  107. data/lib/mtncloud/api/logs_interface.rb +37 -0
  108. data/lib/mtncloud/api/migrations_interface.rb +49 -0
  109. data/lib/mtncloud/api/monitoring_alerts_interface.rb +39 -0
  110. data/lib/mtncloud/api/monitoring_apps_interface.rb +69 -0
  111. data/lib/mtncloud/api/monitoring_checks_interface.rb +103 -0
  112. data/lib/mtncloud/api/monitoring_contacts_interface.rb +41 -0
  113. data/lib/mtncloud/api/monitoring_groups_interface.rb +77 -0
  114. data/lib/mtncloud/api/monitoring_incidents_interface.rb +107 -0
  115. data/lib/mtncloud/api/monitoring_interface.rb +35 -0
  116. data/lib/mtncloud/api/monitoring_settings_interface.rb +21 -0
  117. data/lib/mtncloud/api/network_dhcp_relays_interface.rb +36 -0
  118. data/lib/mtncloud/api/network_dhcp_servers_interface.rb +36 -0
  119. data/lib/mtncloud/api/network_domain_records_interface.rb +41 -0
  120. data/lib/mtncloud/api/network_domains_interface.rb +41 -0
  121. data/lib/mtncloud/api/network_edge_clusters_interface.rb +26 -0
  122. data/lib/mtncloud/api/network_floating_ips_interface.rb +40 -0
  123. data/lib/mtncloud/api/network_groups_interface.rb +41 -0
  124. data/lib/mtncloud/api/network_pool_ips_interface.rb +41 -0
  125. data/lib/mtncloud/api/network_pool_server_types_interface.rb +9 -0
  126. data/lib/mtncloud/api/network_pool_servers_interface.rb +48 -0
  127. data/lib/mtncloud/api/network_pools_interface.rb +41 -0
  128. data/lib/mtncloud/api/network_proxies_interface.rb +41 -0
  129. data/lib/mtncloud/api/network_routers_interface.rb +181 -0
  130. data/lib/mtncloud/api/network_security_server_types_interface.rb +9 -0
  131. data/lib/mtncloud/api/network_security_servers_interface.rb +27 -0
  132. data/lib/mtncloud/api/network_server_groups_interface.rb +7 -0
  133. data/lib/mtncloud/api/network_server_types_interface.rb +9 -0
  134. data/lib/mtncloud/api/network_servers_interface.rb +102 -0
  135. data/lib/mtncloud/api/network_services_interface.rb +63 -0
  136. data/lib/mtncloud/api/network_static_routes_interface.rb +36 -0
  137. data/lib/mtncloud/api/network_subnets_interface.rb +42 -0
  138. data/lib/mtncloud/api/network_types_interface.rb +20 -0
  139. data/lib/mtncloud/api/networks_interface.rb +48 -0
  140. data/lib/mtncloud/api/option_type_forms_interface.rb +9 -0
  141. data/lib/mtncloud/api/option_type_lists_interface.rb +53 -0
  142. data/lib/mtncloud/api/option_types_interface.rb +41 -0
  143. data/lib/mtncloud/api/options_interface.rb +17 -0
  144. data/lib/mtncloud/api/packages_interface.rb +112 -0
  145. data/lib/mtncloud/api/ping_interface.rb +22 -0
  146. data/lib/mtncloud/api/plugins_interface.rb +22 -0
  147. data/lib/mtncloud/api/policies_interface.rb +56 -0
  148. data/lib/mtncloud/api/power_schedules_interface.rb +71 -0
  149. data/lib/mtncloud/api/price_sets_interface.rb +39 -0
  150. data/lib/mtncloud/api/prices_interface.rb +71 -0
  151. data/lib/mtncloud/api/processes_interface.rb +40 -0
  152. data/lib/mtncloud/api/projects_interface.rb +33 -0
  153. data/lib/mtncloud/api/provision_types_interface.rb +24 -0
  154. data/lib/mtncloud/api/provisioning_license_types_interface.rb +31 -0
  155. data/lib/mtncloud/api/provisioning_licenses_interface.rb +60 -0
  156. data/lib/mtncloud/api/provisioning_settings_interface.rb +26 -0
  157. data/lib/mtncloud/api/read_interface.rb +24 -0
  158. data/lib/mtncloud/api/reports_interface.rb +70 -0
  159. data/lib/mtncloud/api/resource_pool_groups_interface.rb +51 -0
  160. data/lib/mtncloud/api/rest_interface.rb +37 -0
  161. data/lib/mtncloud/api/roles_interface.rb +151 -0
  162. data/lib/mtncloud/api/scale_thresholds_interface.rb +9 -0
  163. data/lib/mtncloud/api/search_interface.rb +13 -0
  164. data/lib/mtncloud/api/secondary_read_interface.rb +25 -0
  165. data/lib/mtncloud/api/secondary_rest_interface.rb +42 -0
  166. data/lib/mtncloud/api/security_group_rules_interface.rb +35 -0
  167. data/lib/mtncloud/api/security_groups_interface.rb +56 -0
  168. data/lib/mtncloud/api/security_package_types_interface.rb +9 -0
  169. data/lib/mtncloud/api/security_packages_interface.rb +9 -0
  170. data/lib/mtncloud/api/security_scans_interface.rb +9 -0
  171. data/lib/mtncloud/api/server_devices_interface.rb +30 -0
  172. data/lib/mtncloud/api/server_types_interface.rb +20 -0
  173. data/lib/mtncloud/api/servers_interface.rb +230 -0
  174. data/lib/mtncloud/api/service_catalog_interface.rb +89 -0
  175. data/lib/mtncloud/api/service_plans_interface.rb +62 -0
  176. data/lib/mtncloud/api/setup_interface.rb +46 -0
  177. data/lib/mtncloud/api/snapshots_interface.rb +19 -0
  178. data/lib/mtncloud/api/storage_datastores_interface.rb +44 -0
  179. data/lib/mtncloud/api/storage_providers_interface.rb +151 -0
  180. data/lib/mtncloud/api/storage_server_types_interface.rb +14 -0
  181. data/lib/mtncloud/api/storage_servers_interface.rb +9 -0
  182. data/lib/mtncloud/api/storage_volume_types_interface.rb +9 -0
  183. data/lib/mtncloud/api/storage_volumes_interface.rb +24 -0
  184. data/lib/mtncloud/api/subnet_types_interface.rb +20 -0
  185. data/lib/mtncloud/api/subnets_interface.rb +41 -0
  186. data/lib/mtncloud/api/support_bundles_interface.rb +46 -0
  187. data/lib/mtncloud/api/system_types_interface.rb +13 -0
  188. data/lib/mtncloud/api/systems_interface.rb +55 -0
  189. data/lib/mtncloud/api/task_sets_interface.rb +52 -0
  190. data/lib/mtncloud/api/tasks_interface.rb +66 -0
  191. data/lib/mtncloud/api/tokens_interface.rb +39 -0
  192. data/lib/mtncloud/api/usage_interface.rb +18 -0
  193. data/lib/mtncloud/api/user_groups_interface.rb +59 -0
  194. data/lib/mtncloud/api/user_settings_interface.rb +90 -0
  195. data/lib/mtncloud/api/user_sources_interface.rb +99 -0
  196. data/lib/mtncloud/api/users_interface.rb +33 -0
  197. data/lib/mtncloud/api/vdi_allocations_interface.rb +9 -0
  198. data/lib/mtncloud/api/vdi_apps_interface.rb +9 -0
  199. data/lib/mtncloud/api/vdi_gateways_interface.rb +9 -0
  200. data/lib/mtncloud/api/vdi_interface.rb +28 -0
  201. data/lib/mtncloud/api/vdi_pools_interface.rb +19 -0
  202. data/lib/mtncloud/api/virtual_images_interface.rb +210 -0
  203. data/lib/mtncloud/api/virtual_servers_interface.rb +9 -0
  204. data/lib/mtncloud/api/virtual_switches_interface.rb +9 -0
  205. data/lib/mtncloud/api/whitelabel_settings_interface.rb +57 -0
  206. data/lib/mtncloud/api/whoami_interface.rb +13 -0
  207. data/lib/mtncloud/api/wiki_interface.rb +48 -0
  208. data/lib/mtncloud/api.rb +12 -0
  209. data/lib/mtncloud/benchmarking.rb +259 -0
  210. data/lib/mtncloud/cli/cli_command.rb +2281 -0
  211. data/lib/mtncloud/cli/cli_registry.rb +337 -0
  212. data/lib/mtncloud/cli/commands/access_token_command.rb +201 -0
  213. data/lib/mtncloud/cli/commands/account_groups_command.rb +530 -0
  214. data/lib/mtncloud/cli/commands/activity_command.rb +149 -0
  215. data/lib/mtncloud/cli/commands/affinity_groups_command.rb +554 -0
  216. data/lib/mtncloud/cli/commands/alias_command.rb +278 -0
  217. data/lib/mtncloud/cli/commands/appliance_settings_command.rb +382 -0
  218. data/lib/mtncloud/cli/commands/approvals_command.rb +236 -0
  219. data/lib/mtncloud/cli/commands/apps.rb +2549 -0
  220. data/lib/mtncloud/cli/commands/archives_command.rb +2161 -0
  221. data/lib/mtncloud/cli/commands/audit.rb +188 -0
  222. data/lib/mtncloud/cli/commands/backup_jobs_command.rb +366 -0
  223. data/lib/mtncloud/cli/commands/backup_restores_command.rb +144 -0
  224. data/lib/mtncloud/cli/commands/backup_results_command.rb +149 -0
  225. data/lib/mtncloud/cli/commands/backup_services_command.rb +44 -0
  226. data/lib/mtncloud/cli/commands/backup_settings_command.rb +184 -0
  227. data/lib/mtncloud/cli/commands/backup_types_command.rb +53 -0
  228. data/lib/mtncloud/cli/commands/backups_command.rb +674 -0
  229. data/lib/mtncloud/cli/commands/benchmark_command.rb +458 -0
  230. data/lib/mtncloud/cli/commands/blueprints_command.rb +2297 -0
  231. data/lib/mtncloud/cli/commands/boot_scripts_command.rb +379 -0
  232. data/lib/mtncloud/cli/commands/budgets_command.rb +754 -0
  233. data/lib/mtncloud/cli/commands/cat_command.rb +45 -0
  234. data/lib/mtncloud/cli/commands/catalog_item_types_command.rb +858 -0
  235. data/lib/mtncloud/cli/commands/certificates_command.rb +575 -0
  236. data/lib/mtncloud/cli/commands/change_password_command.rb +132 -0
  237. data/lib/mtncloud/cli/commands/clients_command.rb +331 -0
  238. data/lib/mtncloud/cli/commands/cloud_datastores_command.rb +543 -0
  239. data/lib/mtncloud/cli/commands/cloud_folders_command.rb +512 -0
  240. data/lib/mtncloud/cli/commands/cloud_resource_pools_command.rb +870 -0
  241. data/lib/mtncloud/cli/commands/clouds.rb +2037 -0
  242. data/lib/mtncloud/cli/commands/clouds_types.rb +140 -0
  243. data/lib/mtncloud/cli/commands/cluster_types.rb +179 -0
  244. data/lib/mtncloud/cli/commands/clusters.rb +5855 -0
  245. data/lib/mtncloud/cli/commands/coloring_command.rb +82 -0
  246. data/lib/mtncloud/cli/commands/containers_command.rb +967 -0
  247. data/lib/mtncloud/cli/commands/credential_types_command.rb +36 -0
  248. data/lib/mtncloud/cli/commands/credentials_command.rb +124 -0
  249. data/lib/mtncloud/cli/commands/curl_command.rb +168 -0
  250. data/lib/mtncloud/cli/commands/cypher_command.rb +587 -0
  251. data/lib/mtncloud/cli/commands/dashboard_command.rb +300 -0
  252. data/lib/mtncloud/cli/commands/debug_command.rb +75 -0
  253. data/lib/mtncloud/cli/commands/deploy.rb +485 -0
  254. data/lib/mtncloud/cli/commands/deployments.rb +923 -0
  255. data/lib/mtncloud/cli/commands/deploys.rb +485 -0
  256. data/lib/mtncloud/cli/commands/distributed_workers_command.rb +282 -0
  257. data/lib/mtncloud/cli/commands/echo_command.rb +61 -0
  258. data/lib/mtncloud/cli/commands/edit_profile_command.rb +57 -0
  259. data/lib/mtncloud/cli/commands/edit_rc_command.rb +77 -0
  260. data/lib/mtncloud/cli/commands/email_templates_command.rb +373 -0
  261. data/lib/mtncloud/cli/commands/environments_command.rb +401 -0
  262. data/lib/mtncloud/cli/commands/execute_schedules_command.rb +735 -0
  263. data/lib/mtncloud/cli/commands/execution_request_command.rb +333 -0
  264. data/lib/mtncloud/cli/commands/exit_command.rb +34 -0
  265. data/lib/mtncloud/cli/commands/file_copy_request_command.rb +352 -0
  266. data/lib/mtncloud/cli/commands/forgot_password.rb +133 -0
  267. data/lib/mtncloud/cli/commands/get_prompt_command.rb +36 -0
  268. data/lib/mtncloud/cli/commands/groups.rb +818 -0
  269. data/lib/mtncloud/cli/commands/guidance_command.rb +529 -0
  270. data/lib/mtncloud/cli/commands/guidance_settings.rb +148 -0
  271. data/lib/mtncloud/cli/commands/health_command.rb +1046 -0
  272. data/lib/mtncloud/cli/commands/history_command.rb +60 -0
  273. data/lib/mtncloud/cli/commands/host_vm_groups_command.rb +423 -0
  274. data/lib/mtncloud/cli/commands/hosts.rb +2986 -0
  275. data/lib/mtncloud/cli/commands/hub.rb +215 -0
  276. data/lib/mtncloud/cli/commands/image_builder_command.rb +1197 -0
  277. data/lib/mtncloud/cli/commands/instance_types.rb +163 -0
  278. data/lib/mtncloud/cli/commands/instances.rb +5813 -0
  279. data/lib/mtncloud/cli/commands/integrations_command.rb +1412 -0
  280. data/lib/mtncloud/cli/commands/invoices_command.rb +1151 -0
  281. data/lib/mtncloud/cli/commands/jobs_command.rb +998 -0
  282. data/lib/mtncloud/cli/commands/key_pairs.rb +470 -0
  283. data/lib/mtncloud/cli/commands/library_cluster_layouts_command.rb +901 -0
  284. data/lib/mtncloud/cli/commands/library_cluster_packages_command.rb +552 -0
  285. data/lib/mtncloud/cli/commands/library_container_scripts_command.rb +446 -0
  286. data/lib/mtncloud/cli/commands/library_container_templates_command.rb +526 -0
  287. data/lib/mtncloud/cli/commands/library_container_types_command.rb +698 -0
  288. data/lib/mtncloud/cli/commands/library_forms_command.rb +625 -0
  289. data/lib/mtncloud/cli/commands/library_instance_types_command.rb +668 -0
  290. data/lib/mtncloud/cli/commands/library_layouts_command.rb +849 -0
  291. data/lib/mtncloud/cli/commands/library_operating_systems_command.rb +671 -0
  292. data/lib/mtncloud/cli/commands/library_option_lists_command.rb +503 -0
  293. data/lib/mtncloud/cli/commands/library_option_types_command.rb +329 -0
  294. data/lib/mtncloud/cli/commands/library_spec_templates_command.rb +547 -0
  295. data/lib/mtncloud/cli/commands/library_upgrades_command.rb +596 -0
  296. data/lib/mtncloud/cli/commands/license.rb +475 -0
  297. data/lib/mtncloud/cli/commands/load_balancer_monitors.rb +70 -0
  298. data/lib/mtncloud/cli/commands/load_balancer_pool_nodes.rb +87 -0
  299. data/lib/mtncloud/cli/commands/load_balancer_pools.rb +129 -0
  300. data/lib/mtncloud/cli/commands/load_balancer_profiles.rb +64 -0
  301. data/lib/mtncloud/cli/commands/load_balancer_types.rb +38 -0
  302. data/lib/mtncloud/cli/commands/load_balancer_virtual_servers.rb +147 -0
  303. data/lib/mtncloud/cli/commands/load_balancers.rb +189 -0
  304. data/lib/mtncloud/cli/commands/log_level_command.rb +54 -0
  305. data/lib/mtncloud/cli/commands/log_settings_command.rb +443 -0
  306. data/lib/mtncloud/cli/commands/login.rb +148 -0
  307. data/lib/mtncloud/cli/commands/logout.rb +63 -0
  308. data/lib/mtncloud/cli/commands/logs_command.rb +140 -0
  309. data/lib/mtncloud/cli/commands/man_command.rb +409 -0
  310. data/lib/mtncloud/cli/commands/migrations.rb +453 -0
  311. data/lib/mtncloud/cli/commands/monitoring_alerts_command.rb +791 -0
  312. data/lib/mtncloud/cli/commands/monitoring_apps_command.rb +716 -0
  313. data/lib/mtncloud/cli/commands/monitoring_checks_command.rb +766 -0
  314. data/lib/mtncloud/cli/commands/monitoring_contacts_command.rb +339 -0
  315. data/lib/mtncloud/cli/commands/monitoring_groups_command.rb +674 -0
  316. data/lib/mtncloud/cli/commands/monitoring_incidents_command.rb +835 -0
  317. data/lib/mtncloud/cli/commands/monitoring_settings.rb +212 -0
  318. data/lib/mtncloud/cli/commands/network_dhcp_relays_command.rb +375 -0
  319. data/lib/mtncloud/cli/commands/network_dhcp_servers_command.rb +366 -0
  320. data/lib/mtncloud/cli/commands/network_domains_command.rb +896 -0
  321. data/lib/mtncloud/cli/commands/network_edge_clusters_command.rb +288 -0
  322. data/lib/mtncloud/cli/commands/network_firewalls_command.rb +783 -0
  323. data/lib/mtncloud/cli/commands/network_floating_ips.rb +147 -0
  324. data/lib/mtncloud/cli/commands/network_groups_command.rb +654 -0
  325. data/lib/mtncloud/cli/commands/network_pool_server_types.rb +20 -0
  326. data/lib/mtncloud/cli/commands/network_pool_servers_command.rb +318 -0
  327. data/lib/mtncloud/cli/commands/network_pools_command.rb +903 -0
  328. data/lib/mtncloud/cli/commands/network_proxies_command.rb +578 -0
  329. data/lib/mtncloud/cli/commands/network_routers_command.rb +2628 -0
  330. data/lib/mtncloud/cli/commands/network_security_server_types.rb +20 -0
  331. data/lib/mtncloud/cli/commands/network_server_groups_command.rb +222 -0
  332. data/lib/mtncloud/cli/commands/network_server_types_command.rb +20 -0
  333. data/lib/mtncloud/cli/commands/network_servers_command.rb +398 -0
  334. data/lib/mtncloud/cli/commands/network_services_command.rb +198 -0
  335. data/lib/mtncloud/cli/commands/network_static_routes_command.rb +451 -0
  336. data/lib/mtncloud/cli/commands/network_transport_zones_command.rb +412 -0
  337. data/lib/mtncloud/cli/commands/networks_command.rb +1692 -0
  338. data/lib/mtncloud/cli/commands/open_command.rb +30 -0
  339. data/lib/mtncloud/cli/commands/options.rb +231 -0
  340. data/lib/mtncloud/cli/commands/packages_command.rb +822 -0
  341. data/lib/mtncloud/cli/commands/ping.rb +242 -0
  342. data/lib/mtncloud/cli/commands/plugins.rb +214 -0
  343. data/lib/mtncloud/cli/commands/policies_command.rb +990 -0
  344. data/lib/mtncloud/cli/commands/power_schedules_command.rb +731 -0
  345. data/lib/mtncloud/cli/commands/preseed_scripts_command.rb +378 -0
  346. data/lib/mtncloud/cli/commands/price_sets_command.rb +557 -0
  347. data/lib/mtncloud/cli/commands/prices_command.rb +692 -0
  348. data/lib/mtncloud/cli/commands/processes_command.rb +469 -0
  349. data/lib/mtncloud/cli/commands/projects_command.rb +537 -0
  350. data/lib/mtncloud/cli/commands/provisioning_licenses_command.rb +509 -0
  351. data/lib/mtncloud/cli/commands/provisioning_settings_command.rb +238 -0
  352. data/lib/mtncloud/cli/commands/recent_activity_command.rb +171 -0
  353. data/lib/mtncloud/cli/commands/remote.rb +1818 -0
  354. data/lib/mtncloud/cli/commands/reports_command.rb +724 -0
  355. data/lib/mtncloud/cli/commands/resource_pool_groups_command.rb +586 -0
  356. data/lib/mtncloud/cli/commands/rm_command.rb +14 -0
  357. data/lib/mtncloud/cli/commands/roles.rb +3120 -0
  358. data/lib/mtncloud/cli/commands/scale_thresholds.rb +103 -0
  359. data/lib/mtncloud/cli/commands/search_command.rb +184 -0
  360. data/lib/mtncloud/cli/commands/security_group_rules.rb +230 -0
  361. data/lib/mtncloud/cli/commands/security_groups.rb +1294 -0
  362. data/lib/mtncloud/cli/commands/security_package_types.rb +32 -0
  363. data/lib/mtncloud/cli/commands/security_packages.rb +84 -0
  364. data/lib/mtncloud/cli/commands/security_scans.rb +107 -0
  365. data/lib/mtncloud/cli/commands/self_service_command.rb +17 -0
  366. data/lib/mtncloud/cli/commands/server_devices_command.rb +207 -0
  367. data/lib/mtncloud/cli/commands/service_catalog_command.rb +1528 -0
  368. data/lib/mtncloud/cli/commands/service_plans_command.rb +895 -0
  369. data/lib/mtncloud/cli/commands/set_prompt_command.rb +51 -0
  370. data/lib/mtncloud/cli/commands/setup.rb +423 -0
  371. data/lib/mtncloud/cli/commands/shell.rb +717 -0
  372. data/lib/mtncloud/cli/commands/sleep_command.rb +43 -0
  373. data/lib/mtncloud/cli/commands/snapshots.rb +156 -0
  374. data/lib/mtncloud/cli/commands/source_command.rb +30 -0
  375. data/lib/mtncloud/cli/commands/ssl_verification_command.rb +47 -0
  376. data/lib/mtncloud/cli/commands/storage_datastores.rb +457 -0
  377. data/lib/mtncloud/cli/commands/storage_providers_command.rb +1401 -0
  378. data/lib/mtncloud/cli/commands/storage_server_types.rb +45 -0
  379. data/lib/mtncloud/cli/commands/storage_servers.rb +116 -0
  380. data/lib/mtncloud/cli/commands/storage_volume_types.rb +45 -0
  381. data/lib/mtncloud/cli/commands/storage_volumes.rb +236 -0
  382. data/lib/mtncloud/cli/commands/subnets_command.rb +819 -0
  383. data/lib/mtncloud/cli/commands/support_bundles_command.rb +606 -0
  384. data/lib/mtncloud/cli/commands/systems.rb +1203 -0
  385. data/lib/mtncloud/cli/commands/tasks.rb +1391 -0
  386. data/lib/mtncloud/cli/commands/tee_command.rb +14 -0
  387. data/lib/mtncloud/cli/commands/tenants_command.rb +315 -0
  388. data/lib/mtncloud/cli/commands/tokens_command.rb +391 -0
  389. data/lib/mtncloud/cli/commands/update_command.rb +46 -0
  390. data/lib/mtncloud/cli/commands/usage_command.rb +203 -0
  391. data/lib/mtncloud/cli/commands/user_groups_command.rb +512 -0
  392. data/lib/mtncloud/cli/commands/user_settings_command.rb +849 -0
  393. data/lib/mtncloud/cli/commands/user_sources_command.rb +1065 -0
  394. data/lib/mtncloud/cli/commands/users.rb +897 -0
  395. data/lib/mtncloud/cli/commands/vdi_allocations_command.rb +159 -0
  396. data/lib/mtncloud/cli/commands/vdi_apps_command.rb +317 -0
  397. data/lib/mtncloud/cli/commands/vdi_command.rb +359 -0
  398. data/lib/mtncloud/cli/commands/vdi_gateways_command.rb +290 -0
  399. data/lib/mtncloud/cli/commands/vdi_pools_command.rb +574 -0
  400. data/lib/mtncloud/cli/commands/version_command.rb +38 -0
  401. data/lib/mtncloud/cli/commands/view.rb +107 -0
  402. data/lib/mtncloud/cli/commands/virtual_images.rb +1362 -0
  403. data/lib/mtncloud/cli/commands/virtual_switches_command.rb +336 -0
  404. data/lib/mtncloud/cli/commands/whitelabel_settings_command.rb +653 -0
  405. data/lib/mtncloud/cli/commands/whoami.rb +323 -0
  406. data/lib/mtncloud/cli/commands/wiki_command.rb +448 -0
  407. data/lib/mtncloud/cli/commands/workflows.rb +1022 -0
  408. data/lib/mtncloud/cli/credentials.rb +482 -0
  409. data/lib/mtncloud/cli/dot_file.rb +180 -0
  410. data/lib/mtncloud/cli/error_handler.rb +307 -0
  411. data/lib/mtncloud/cli/errors.rb +53 -0
  412. data/lib/mtncloud/cli/expression_parser.rb +153 -0
  413. data/lib/mtncloud/cli/mixins/accounts_helper.rb +484 -0
  414. data/lib/mtncloud/cli/mixins/affinity_helper.rb +118 -0
  415. data/lib/mtncloud/cli/mixins/backups_helper.rb +200 -0
  416. data/lib/mtncloud/cli/mixins/deployments_helper.rb +163 -0
  417. data/lib/mtncloud/cli/mixins/execution_request_helper.rb +50 -0
  418. data/lib/mtncloud/cli/mixins/infrastructure_helper.rb +966 -0
  419. data/lib/mtncloud/cli/mixins/jobs_helper.rb +202 -0
  420. data/lib/mtncloud/cli/mixins/library_helper.rb +539 -0
  421. data/lib/mtncloud/cli/mixins/load_balancers_helper.rb +176 -0
  422. data/lib/mtncloud/cli/mixins/logs_helper.rb +131 -0
  423. data/lib/mtncloud/cli/mixins/monitoring_helper.rb +876 -0
  424. data/lib/mtncloud/cli/mixins/networks_helper.rb +62 -0
  425. data/lib/mtncloud/cli/mixins/operations_helper.rb +41 -0
  426. data/lib/mtncloud/cli/mixins/option_source_helper.rb +254 -0
  427. data/lib/mtncloud/cli/mixins/print_helper.rb +1631 -0
  428. data/lib/mtncloud/cli/mixins/processes_helper.rb +286 -0
  429. data/lib/mtncloud/cli/mixins/prompt_helper.rb +136 -0
  430. data/lib/mtncloud/cli/mixins/provisioning_helper.rb +2963 -0
  431. data/lib/mtncloud/cli/mixins/remote_helper.rb +139 -0
  432. data/lib/mtncloud/cli/mixins/rest_command.rb +994 -0
  433. data/lib/mtncloud/cli/mixins/secondary_rest_command.rb +700 -0
  434. data/lib/mtncloud/cli/mixins/storage_servers_helper.rb +93 -0
  435. data/lib/mtncloud/cli/mixins/storage_volumes_helper.rb +76 -0
  436. data/lib/mtncloud/cli/mixins/vdi_helper.rb +246 -0
  437. data/lib/mtncloud/cli/mixins/whoami_helper.rb +73 -0
  438. data/lib/mtncloud/cli/option_parser.rb +127 -0
  439. data/lib/mtncloud/cli/option_types.rb +1622 -0
  440. data/lib/mtncloud/cli/version.rb +6 -0
  441. data/lib/mtncloud/cli.rb +105 -0
  442. data/lib/mtncloud/currency.rb +184 -0
  443. data/lib/mtncloud/ext/hash.rb +109 -0
  444. data/lib/mtncloud/ext/nil_class.rb +5 -0
  445. data/lib/mtncloud/ext/rest_client.rb +37 -0
  446. data/lib/mtncloud/ext/string.rb +66 -0
  447. data/lib/mtncloud/formatters.rb +511 -0
  448. data/lib/mtncloud/logging.rb +185 -0
  449. data/lib/mtncloud/morpkg.rb +119 -0
  450. data/lib/mtncloud/rest_client.rb +104 -0
  451. data/lib/mtncloud/routes.rb +304 -0
  452. data/lib/mtncloud/terminal.rb +528 -0
  453. data/lib/mtncloud/util.rb +29 -0
  454. data/lib/mtncloud.rb +5 -0
  455. data/mtncloud-cli.gemspec +38 -0
  456. data/test/api/affinity_groups_interface_test.rb +43 -0
  457. data/test/api/clients_interface_test.rb +23 -0
  458. data/test/api/clouds_interface_test.rb +67 -0
  459. data/test/api/containers_interface_test.rb +68 -0
  460. data/test/api/host_vm_groups_interface_test.rb +35 -0
  461. data/test/api/instances_interface_test.rb +22 -0
  462. data/test/api/network_routers_interface_test.rb +22 -0
  463. data/test/api/systems_interface_test.rb +26 -0
  464. data/test/api/whoami_interface_test.rb +14 -0
  465. data/test/branding_test.rb +160 -0
  466. data/test/cli/access_token_test.rb +36 -0
  467. data/test/cli/affinity_groups_cloud_cluster_scope_test.rb +270 -0
  468. data/test/cli/affinity_groups_cluster_scope_test.rb +171 -0
  469. data/test/cli/affinity_groups_test.rb +57 -0
  470. data/test/cli/affinity_groups_violations_scope_test.rb +141 -0
  471. data/test/cli/affinity_helper_test.rb +367 -0
  472. data/test/cli/auth_test.rb +88 -0
  473. data/test/cli/backups_test.rb +212 -0
  474. data/test/cli/cli_test.rb +48 -0
  475. data/test/cli/clients_test.rb +45 -0
  476. data/test/cli/clusters_uuid_test.rb +146 -0
  477. data/test/cli/containers_test.rb +92 -0
  478. data/test/cli/distributed_workers_test.rb +68 -0
  479. data/test/cli/help_test.rb +25 -0
  480. data/test/cli/host_vm_groups_cluster_scope_test.rb +187 -0
  481. data/test/cli/host_vm_groups_test.rb +63 -0
  482. data/test/cli/infrastructure_helper_cluster_resolver_test.rb +250 -0
  483. data/test/cli/instances_test.rb +37 -0
  484. data/test/cli/man_test.rb +14 -0
  485. data/test/cli/migrations_test.rb +39 -0
  486. data/test/cli/network_routers_test.rb +65 -0
  487. data/test/cli/remote_test.rb +89 -0
  488. data/test/cli/roles_test.rb +47 -0
  489. data/test/cli/shell_test.rb +81 -0
  490. data/test/cli/storage_volumes_test.rb +79 -0
  491. data/test/cli/systems_test.rb +206 -0
  492. data/test/cli/version_test.rb +23 -0
  493. data/test/cli/view_test.rb +55 -0
  494. data/test/cli/whoami_test.rb +17 -0
  495. data/test/mtncloud_test.rb +16 -0
  496. data/test/test_case.rb +342 -0
  497. data/test/test_config.rb +137 -0
  498. data/test/test_data_helper.rb +97 -0
  499. metadata +807 -0
@@ -0,0 +1,783 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::NetworkFirewallsCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::NetworksHelper
6
+ include MtnCloud::Cli::ProvisioningHelper
7
+ include MtnCloud::Cli::WhoamiHelper
8
+
9
+ set_command_name :'network-firewalls'
10
+ register_subcommands :list_rules, :get_rule, :add_rule, :update_rule, :remove_rule
11
+ register_subcommands :list_rule_groups, :get_rule_group, :add_rule_group, :update_rule_group, :remove_rule_group
12
+
13
+ def connect(opts)
14
+ @api_client = establish_remote_appliance_connection(opts)
15
+ @account_interface = @api_client.accounts
16
+ @network_servers_interface = @api_client.network_servers
17
+ @options_interface = @api_client.options
18
+ end
19
+
20
+ def handle(args)
21
+ handle_subcommand(args)
22
+ end
23
+
24
+ def list_rules(args)
25
+ options = {}
26
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
27
+ opts.banner = subcommand_usage("[server]")
28
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
29
+ opts.footer = "List network firewall rules." + "\n" +
30
+ "[server] is optional. This is the name or id of a network server."
31
+ end
32
+
33
+ optparse.parse!(args)
34
+ connect(options)
35
+
36
+ if args.count > 1
37
+ print_error MtnCloud::Terminal.angry_prompt
38
+ puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
39
+ return 1
40
+ end
41
+
42
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
43
+ server = find_network_server(server_id)
44
+ return 1 if server.nil?
45
+
46
+ _list_rules(server, options)
47
+ end
48
+
49
+ def _list_rules(server, options)
50
+ params = parse_list_options(options)
51
+ @network_servers_interface.setopts(options)
52
+
53
+ if options[:dry_run]
54
+ print_dry_run @network_servers_interface.dry.list_firewall_rules(server['id'], params)
55
+ return
56
+ end
57
+
58
+ json_response = @network_servers_interface.list_firewall_rules(server['id'], params)
59
+ render_response(json_response, options, 'rules') do
60
+ print_h1 "Network Firewall Rules For: #{server['name']}"
61
+ print cyan
62
+
63
+ app_title = server['type']['titleFirewallApplications'].tr(' ', '_').downcase
64
+ rows = json_response['rules'].collect {|it|
65
+ row = {
66
+ id: it['id'], group: it['groupName'], name: it['name'], description: it['description'],
67
+ priority: it['priority'], enabled: format_boolean(it['enabled']), policy: it['policy'], direction: it['direction'],
68
+ source: it['sources'].kind_of?(Array) && it['sources'].count > 0 ? it['sources'].collect {|it| it['name']}.join(', ') : (it['sources'].nil? || it['sources'].empty? ? 'any' : it['source']),
69
+ destination: it['destinations'].kind_of?(Array) && it['destinations'].count > 0 ? it['destinations'].collect {|it| it['name']}.join(', ') : (it['destinations'].nil? || it['destinations'].empty? ? 'any' : it['destination'])
70
+ }
71
+
72
+ if it['applications'].count
73
+ row[app_title] = it['applications'].slice(0, 2).collect {|it| it['name']}.join(', ') + (it['applications'].count > 2 ? '... ' : ' ')
74
+ end
75
+ if it['protocal'] || it['portRange']
76
+ row[app_title] += "#{(it['protocol'] || 'any')} #{it['portRange'] || ''}"
77
+ end
78
+ row[app_title] = 'Any' if it['applications'].count == 0 && row['protocol'].nil? && row['portRange'].nil?
79
+
80
+ applied_to = []
81
+ if server['type']['supportsFirewallRuleAppliedTarget']
82
+ applied_to << 'All Edges' if it['config']['applyToAllEdges']
83
+ applied_to << 'Distributed Firewall' if it['config']['applyToAllDistributed']
84
+ applied_to += it['appliedTargets'].collect {|target| target['name']}
85
+ row[:applied_to] = applied_to.join(', ')
86
+ end
87
+ row
88
+ }
89
+
90
+ cols = [:id]
91
+
92
+ if server['type']['hasFirewallGroups']
93
+ cols += [:group]
94
+ end
95
+
96
+ cols += [:name, :description]
97
+ cols += [:priority] if server['type']['hasSecurityGroupRulePriority']
98
+ cols += [:applied_to] if server['type']['supportsFirewallRuleAppliedTarget']
99
+ cols += [:enabled, :policy, :direction, :source, :destination, app_title.to_sym]
100
+ puts as_pretty_table(rows, cols)
101
+ end
102
+ print reset
103
+ end
104
+
105
+ def get_rule(args)
106
+ options = {}
107
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
108
+ opts.banner = subcommand_usage("[server] [rule]")
109
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
110
+ opts.footer = "Display details on a network firewall rule." + "\n" +
111
+ "[server] is optional. This is the name or id of a network server.\n" +
112
+ "[rule] is optional. This is the id of a network firewall rule.\n"
113
+ end
114
+
115
+ optparse.parse!(args)
116
+ connect(options)
117
+
118
+ if args.count > 2
119
+ print_error MtnCloud::Terminal.angry_prompt
120
+ puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
121
+ return 1
122
+ end
123
+
124
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
125
+ server = find_network_server(server_id)
126
+ return 1 if server.nil?
127
+
128
+ rule_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
129
+ _get_rule(server, rule_id, options)
130
+ end
131
+
132
+ def _get_rule(server, name_or_id, options)
133
+ @network_servers_interface.setopts(options)
134
+
135
+ if options[:dry_run]
136
+ if name_or_id.to_s =~ /\A\d{1,}\Z/
137
+ print_dry_run @network_servers_interface.dry.get_firewall_rule(server['id'], name_or_id.to_i)
138
+ else
139
+ print_dry_run @network_servers_interface.dry.get_firewall_rule(server['id'], {name: name_or_id})
140
+ end
141
+ return
142
+ end
143
+
144
+ if server['type']['hasFirewall']
145
+ rule = find_rule(server['id'], name_or_id)
146
+
147
+ return 1 if rule.nil?
148
+
149
+ render_response({rule: rule}, options, 'rule') do
150
+ print_h1 "Network Firewall Rule Details"
151
+ print cyan
152
+
153
+ description_cols = {
154
+ "ID" => lambda {|it| it['id']},
155
+ "Name" => lambda {|it| it['name']},
156
+ "Description" => lambda {|it| it['description']},
157
+ "Enabled" => lambda {|it| format_boolean(it['enabled'])},
158
+ "Priority" => lambda {|it| it['priority']}
159
+ }
160
+
161
+ server['type']['ruleOptionTypes'].reject {|it| it['type'] == 'hidden'}.sort_by {|it| it['displayOrder']}.each do |option_type|
162
+ description_cols[option_type['fieldLabel']] = lambda {|it| MtnCloud::Cli::OptionTypes.get_option_value(it, option_type, true)}
163
+ end
164
+ print_description_list(description_cols, rule)
165
+ end
166
+ else
167
+ print_red_alert "Firewall not supported for #{server['type']['name']}"
168
+ end
169
+ println reset
170
+ end
171
+
172
+ def add_rule(args)
173
+ options = {:options=>{}}
174
+ params = {}
175
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
176
+ opts.banner = subcommand_usage("[server] [group]")
177
+ opts.on( '-g', '--group GROUP', String, "Rule group name or ID" ) do |val|
178
+ options[:group] = val
179
+ end
180
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule") do |val|
181
+ options[:options]['name'] = val
182
+ end
183
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule") do |val|
184
+ options[:options]['description'] = val
185
+ end
186
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule") do |val|
187
+ options[:options]['priority'] = val
188
+ end
189
+ opts.on('--enabled [on|off]', String, "Can be used to disable") do |val|
190
+ options[:options]['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
191
+ end
192
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
193
+ opts.footer = "Create a network firewall rule." + "\n" +
194
+ "[server] is optional. This is the name or id of a network server.\n" +
195
+ "[group] is optional. This is the name of id of rule group (applicable to select network servers)."
196
+ end
197
+ optparse.parse!(args)
198
+ connect(options)
199
+
200
+ if args.count > 2
201
+ print_error MtnCloud::Terminal.angry_prompt
202
+ puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
203
+ return 1
204
+ end
205
+
206
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
207
+ server = find_network_server(server_id)
208
+ return 1 if server.nil?
209
+
210
+ options[:group] = args[1] if options[:group].nil? && args.count == 2
211
+
212
+ if !server['type']['hasFirewall']
213
+ print_red_alert "Firewall not supported for #{server['type']['name']}"
214
+ return 1
215
+ end
216
+
217
+ if options[:payload]
218
+ payload = options[:payload]
219
+ else
220
+ if server['type']['hasFirewallGroups']
221
+ if !options[:group].nil?
222
+ group = find_rule_group(server['id'], options[:group])
223
+ if group.nil?
224
+ return 1
225
+ end
226
+ group_id = group['id']
227
+ else
228
+ avail_groups = @network_servers_interface.list_firewall_rule_groups(server['id'])['ruleGroups'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
229
+ group_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Rule Group', 'selectOptions' => avail_groups, 'required' => true, 'description' => 'Select Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
230
+ end
231
+ params['ruleGroup'] = {'id' => group_id}
232
+ end
233
+
234
+ params['name'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'Name.'}],options[:options],@api_client,{})['name']
235
+ params['description'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false, 'description' => 'Description.'}],options[:options],@api_client,{})['description']
236
+ params['enabled'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'description' => 'Enable Router.', 'defaultValue' => true, 'required' => false}], options[:options], @api_client, {})['enabled'] == 'on'
237
+
238
+ if server['type']['hasSecurityGroupRulePriority']
239
+ params['priority'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'priority', 'type' => 'number', 'fieldLabel' => 'Priority', 'required' => false, 'description' => 'Priority.'}],options[:options],@api_client,{})['priority']
240
+ end
241
+
242
+ option_types = server['type']['ruleOptionTypes'].sort_by {|it| it['displayOrder']}
243
+
244
+ # prompt options
245
+ option_result = MtnCloud::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'rule' => ''}}), @api_client, {'networkServerId' => server['id']}, nil, true)
246
+ payload = {'rule' => params.deep_merge(option_result)}
247
+ end
248
+
249
+ @network_servers_interface.setopts(options)
250
+
251
+ if options[:dry_run]
252
+ print_dry_run @network_servers_interface.dry.create_firewall_rule(server['id'], payload)
253
+ return
254
+ end
255
+
256
+ json_response = @network_servers_interface.create_firewall_rule(server['id'], payload)
257
+ render_response(json_response, options, 'rule') do
258
+ print_green_success "\nAdded Network Firewall Rule #{json_response['id']}\n"
259
+ _get_rule(server, json_response['id'], options)
260
+ end
261
+ end
262
+
263
+ def update_rule(args)
264
+ options = {:options=>{}}
265
+ params = {}
266
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
267
+ opts.banner = subcommand_usage("[server] [rule]")
268
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule") do |val|
269
+ params['name'] = val
270
+ end
271
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule") do |val|
272
+ params['description'] = val
273
+ end
274
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule") do |val|
275
+ params['priority'] = val
276
+ end
277
+ opts.on('--enabled [on|off]', String, "Can be used to disable") do |val|
278
+ params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
279
+ end
280
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
281
+ opts.footer = "Update a network firewall rule.\n" +
282
+ "[server] is optional. This is the name or id of a network server.\n" +
283
+ "[rule] is optional. This is the name or id of an existing rule."
284
+ end
285
+ optparse.parse!(args)
286
+ if args.count > 2
287
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
288
+ end
289
+ connect(options)
290
+
291
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
292
+ server = find_network_server(server_id)
293
+ return 1 if server.nil?
294
+
295
+ if !server['type']['hasFirewall']
296
+ print_red_alert "Firewall not supported for #{server['type']['name']}"
297
+ return 1
298
+ end
299
+
300
+ rule_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
301
+ rule = find_rule(server['id'], rule_id)
302
+ return 1 if rule.nil?
303
+
304
+ payload = parse_payload(options) || {'rule' => params}
305
+ payload['rule'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['rule'].nil?
306
+
307
+ if payload['rule'].empty?
308
+ option_types = server['type']['ruleOptionTypes'].sort_by {|it| it['displayOrder']}
309
+ print_green_success "Nothing to update"
310
+ println cyan
311
+ edit_option_types = option_types.reject {|it| !it['editable'] || !it['showOnEdit']}
312
+
313
+ if edit_option_types.count > 0
314
+ print MtnCloud::Cli::OptionTypes.display_option_types_help(
315
+ option_types,
316
+ {:include_context => true, :context_map => {'rule' => ''}, :color => cyan, :title => "Available Firewall Rule Options"}
317
+ )
318
+ end
319
+ exit 1
320
+ end
321
+
322
+ @network_servers_interface.setopts(options)
323
+
324
+ if options[:dry_run]
325
+ print_dry_run @network_servers_interface.dry.update_firewall_rule(server['id'], rule['id'], payload)
326
+ return
327
+ end
328
+
329
+ json_response = @network_servers_interface.update_firewall_rule(server['id'], rule['id'], payload)
330
+ render_response(json_response, options, 'rule') do
331
+ print_green_success "\nUpdated Network Firewall Rule #{rule['id']}\n"
332
+ _get_rule(server, rule['id'], options)
333
+ end
334
+ end
335
+
336
+ def remove_rule(args)
337
+ options = {}
338
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
339
+ opts.banner = subcommand_usage("[server] [rule]")
340
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
341
+ opts.footer = "Delete a network firewall rule.\n" +
342
+ "[server] is optional. This is the name or id of a network server.\n" +
343
+ "[rule] is optional. This is the name of id of an existing rule."
344
+ end
345
+ optparse.parse!(args)
346
+ if args.count > 2
347
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
348
+ end
349
+ connect(options)
350
+
351
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
352
+ server = find_network_server(server_id)
353
+ return 1 if server.nil?
354
+
355
+ if !server['type']['hasFirewall']
356
+ print_red_alert "Firewall not supported for #{server['type']['name']}"
357
+ return 1
358
+ end
359
+
360
+ rule_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
361
+ rule = find_rule(server['id'], rule_id)
362
+ return 1 if rule.nil?
363
+
364
+ unless options[:yes] || ::MtnCloud::Cli::OptionTypes::confirm("Are you sure you would like to remove the network firewall rule '#{rule['name']}' from server '#{server['name']}'?", options)
365
+ return 9, "aborted command"
366
+ end
367
+
368
+ @network_servers_interface.setopts(options)
369
+
370
+ if options[:dry_run]
371
+ print_dry_run @network_servers_interface.dry.destroy_firewall_rule(server['id'], rule['id'])
372
+ return
373
+ end
374
+ json_response = @network_servers_interface.destroy_firewall_rule(server['id'], rule['id'])
375
+ render_response(json_response, options, 'rule') do
376
+ print_green_success "\nDeleted Network Firewall Rule #{rule['name']}\n"
377
+ _list_rules(server, options)
378
+ end
379
+ end
380
+
381
+ def list_rule_groups(args)
382
+ options = {}
383
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
384
+ opts.banner = subcommand_usage("[server]")
385
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
386
+ opts.footer = "List network firewall rule groups." + "\n" +
387
+ "[server] is required. This is the name or id of a network server."
388
+ end
389
+
390
+ optparse.parse!(args)
391
+ connect(options)
392
+
393
+ if args.count > 1
394
+ print_error MtnCloud::Terminal.angry_prompt
395
+ puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
396
+ return 1
397
+ end
398
+
399
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
400
+ server = find_network_server(server_id)
401
+ return 1 if server.nil?
402
+ _list_rule_groups(server, options)
403
+ end
404
+
405
+ def _list_rule_groups(server, options)
406
+ params = parse_list_options(options)
407
+ @network_servers_interface.setopts(options)
408
+
409
+ if options[:dry_run]
410
+ print_dry_run @network_servers_interface.dry.list_firewall_rule_groups(server['id'], params)
411
+ return
412
+ end
413
+
414
+ if server['type']['hasFirewallGroups']
415
+ json_response = @network_servers_interface.list_firewall_rule_groups(server['id'], params)
416
+ render_response(json_response, options, 'ruleGroups') do
417
+ print_h1 "#{server['type']['titleFirewallGroups'] || 'Network firewall rule groups'} For: #{server['name']}"
418
+ print cyan
419
+ puts as_pretty_table(json_response['ruleGroups'].collect {|it|
420
+ {id: it['id'], name: it['name'], description: it['description'], priority: it['priority'], category: it['groupLayer']}
421
+ }, [:id, :name, :description, :priority, :category])
422
+ end
423
+ else
424
+ print_red_alert "#{server['type']['titleFirewallGroups'] || 'Network firewall rule groups'} not supported for #{server['type']['name']}"
425
+ end
426
+ print reset
427
+ end
428
+
429
+ def get_rule_group(args)
430
+ options = {}
431
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
432
+ opts.banner = subcommand_usage("[server] [group]")
433
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
434
+ opts.footer = "Display details on a network firewall rule group." + "\n" +
435
+ "[server] is optional. This is the name or id of a network server.\n" +
436
+ "[group] is optional. This is the id of a network firewall rule group.\n"
437
+ end
438
+
439
+ optparse.parse!(args)
440
+ connect(options)
441
+
442
+ if args.count > 2
443
+ print_error MtnCloud::Terminal.angry_prompt
444
+ puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
445
+ return 1
446
+ end
447
+
448
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
449
+ server = find_network_server(server_id)
450
+ return 1 if server.nil?
451
+
452
+ group_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
453
+ _get_rule_group(server, group_id, options)
454
+ end
455
+
456
+ def _get_rule_group(server, name_or_id, options)
457
+ @network_servers_interface.setopts(options)
458
+
459
+ if options[:dry_run]
460
+ if name_or_id.to_s =~ /\A\d{1,}\Z/
461
+ print_dry_run @network_servers_interface.dry.get_firewall_rule_group(server['id'], name_or_id.to_i)
462
+ else
463
+ print_dry_run @network_servers_interface.dry.list_firewall_rule_groups(server['id'], {name: name_or_id})
464
+ end
465
+ return
466
+ end
467
+
468
+ if server['type']['hasFirewallGroups']
469
+ group = find_rule_group(server['id'], name_or_id)
470
+ return 1 if group.nil?
471
+
472
+ render_response({ruleGroup: group}, options, 'ruleGroup') do
473
+ print_h1 "Network Firewall Rule Group Details"
474
+ print cyan
475
+
476
+ description_cols = {
477
+ "ID" => lambda {|it| it['id']},
478
+ "Name" => lambda {|it| it['name']},
479
+ "Description" => lambda {|it| it['description']},
480
+ "Priority" => lambda {|it| it['priority']},
481
+ "Category" => lambda {|it| it['groupLayer']}
482
+ }
483
+
484
+ server['type']['firewallGroupOptionTypes'].reject {|it| it['type'] == 'hidden'}.sort_by {|it| it['displayOrder']}.each do |option_type|
485
+ description_cols[option_type['fieldLabel']] = lambda {|it| MtnCloud::Cli::OptionTypes.get_option_value(it, option_type, true)}
486
+ end
487
+
488
+ if is_master_account
489
+ description_cols["Visibility"] = lambda {|it| it['visibility']}
490
+ description_cols["Tenants"] = lambda {|it| it['tenants'].collect {|tenant| tenant['name']}.join(', ')}
491
+ end
492
+ print_description_list(description_cols, group)
493
+ end
494
+ else
495
+ print_red_alert "Network firewall rule groups not supported for #{server['type']['name']}"
496
+ end
497
+ println reset
498
+ end
499
+
500
+ def add_rule_group(args)
501
+ options = {:options=>{}}
502
+ params = {}
503
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
504
+ opts.banner = subcommand_usage("[server]")
505
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
506
+ options[:options]['name'] = val
507
+ end
508
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
509
+ options[:options]['description'] = val
510
+ end
511
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
512
+ options[:options]['priority'] = val
513
+ end
514
+ add_perms_options(opts, options, ['plans', 'groups'])
515
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
516
+ opts.footer = "Create a network firewall rule group." + "\n" +
517
+ "[server] is optional. This is the name or id of a network server.\n";
518
+ end
519
+ optparse.parse!(args)
520
+ connect(options)
521
+ if args.count > 1
522
+ print_error MtnCloud::Terminal.angry_prompt
523
+ puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
524
+ return 1
525
+ end
526
+
527
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
528
+ server = find_network_server(server_id)
529
+ return 1 if server.nil?
530
+
531
+ if !server['type']['hasFirewallGroups']
532
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
533
+ return 1
534
+ end
535
+
536
+ if options[:payload]
537
+ payload = options[:payload]
538
+ else
539
+ params['name'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'Name.'}],options[:options],@api_client, {})['name']
540
+ params['description'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false, 'description' => 'Description.'}],options[:options],@api_client,{})['description']
541
+ params['priority'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'priority', 'type' => 'number', 'fieldLabel' => 'Priority', 'required' => false, 'description' => 'Priority.'}],options[:options],@api_client,{})['priority']
542
+
543
+ option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
544
+
545
+ # prompt options
546
+ option_result = MtnCloud::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'ruleGroup' => ''}}), @api_client, {'networkServerId' => server['id']}, nil, true)
547
+
548
+ # prompt perms
549
+ if is_master_account
550
+ params.merge!(prompt_permissions_v2(options, ['plans', 'groups']))
551
+ end
552
+ payload = {'ruleGroup' => params.deep_merge(option_result)}
553
+ end
554
+
555
+ @network_servers_interface.setopts(options)
556
+
557
+ if options[:dry_run]
558
+ print_dry_run @network_servers_interface.dry.create_firewall_rule_group(server['id'], payload)
559
+ return
560
+ end
561
+
562
+ json_response = @network_servers_interface.create_firewall_rule_group(server['id'], payload)
563
+ render_response(json_response, options, 'ruleGroup') do
564
+ print_green_success "\nAdded Network Firewall Rule Group #{json_response['id']}\n"
565
+ _get_rule_group(server, json_response['id'], options)
566
+ end
567
+ end
568
+
569
+ def update_rule_group(args)
570
+ options = {:options=>{}}
571
+ params = {}
572
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
573
+ opts.banner = subcommand_usage("[server] [group]")
574
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
575
+ options[:options]['name'] = val
576
+ end
577
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
578
+ options[:options]['description'] = val
579
+ end
580
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
581
+ options[:options]['priority'] = val
582
+ end
583
+ add_perms_options(opts, options, ['plans', 'groups'])
584
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
585
+ opts.footer = "Update a network firewall rule group.\n" +
586
+ "[server] is optional. This is the name or id of an existing network server.\n" +
587
+ "[group] is optional. This is the name or id of an existing network firewall rule group."
588
+ end
589
+ optparse.parse!(args)
590
+ if args.count > 2
591
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
592
+ end
593
+ connect(options)
594
+
595
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
596
+ server = find_network_server(server_id)
597
+ return 1 if server.nil?
598
+
599
+ if !server['type']['hasFirewallGroups']
600
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
601
+ return 1
602
+ end
603
+
604
+ group_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
605
+ group = find_rule_group(server['id'], group_id)
606
+ return 1 if group.nil?
607
+
608
+ if is_master_account
609
+ params['visibility'] = options[:visibility] if !options[:visibility].nil?
610
+ params['tenants'] = options[:tenants].collect {|it| {'id' => it}} if !options[:tenants].nil?
611
+ end
612
+
613
+ payload = parse_payload(options) || {'ruleGroup' => params}
614
+ payload['ruleGroup'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['ruleGroup'].nil?
615
+
616
+ if payload['ruleGroup'].empty?
617
+ print_green_success "Nothing to update"
618
+ println cyan
619
+ option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
620
+ edit_option_types = option_types.reject {|it| !it['editable'] || !it['showOnEdit']}
621
+
622
+ if edit_option_types.count > 0
623
+ print MtnCloud::Cli::OptionTypes.display_option_types_help(option_types, {:include_context => true, :context_map => {'ruleGroup' => ''}, :color => cyan, :title => "Available Firewall Rule Group Options"})
624
+ end
625
+ exit 1
626
+ end
627
+
628
+ @network_servers_interface.setopts(options)
629
+
630
+ if options[:dry_run]
631
+ print_dry_run @network_servers_interface.dry.update_firewall_rule_group(server['id'], group['id'], payload)
632
+ return
633
+ end
634
+
635
+ json_response = @network_servers_interface.update_firewall_rule_group(server['id'], group['id'], payload)
636
+ render_response(json_response, options, 'ruleGroup') do
637
+ print_green_success "\nUpdated Network Firewall Rule Group #{group['id']}\n"
638
+ _get_rule_group(server, group['id'], options)
639
+ end
640
+ end
641
+
642
+ def remove_rule_group(args)
643
+ options = {}
644
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
645
+ opts.banner = subcommand_usage("[server] [group]")
646
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
647
+ opts.footer = "Delete a network firewall group.\n" +
648
+ "[server] is optional. This is the name or id of an existing network server.\n" +
649
+ "[group] is optional. This is the name or id of an existing network firewall rule group."
650
+ end
651
+ optparse.parse!(args)
652
+ if args.count > 2
653
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
654
+ end
655
+ connect(options)
656
+
657
+ server_id = args.count > 0 ? args[0] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
658
+ server = find_network_server(server_id)
659
+ return 1 if server.nil?
660
+
661
+ if !server['type']['hasFirewallGroups']
662
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
663
+ return 1
664
+ end
665
+
666
+ group_id = args.count > 1 ? args[1] : MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
667
+ group = find_rule_group(server['id'], group_id)
668
+ return 1 if group.nil?
669
+
670
+ unless options[:yes] || ::MtnCloud::Cli::OptionTypes::confirm("Are you sure you would like to remove the network firewall rule group '#{group['name']}' from server '#{server['name']}'?", options)
671
+ return 9, "aborted command"
672
+ end
673
+
674
+ @network_servers_interface.setopts(options)
675
+
676
+ if options[:dry_run]
677
+ print_dry_run @network_servers_interface.dry.destroy_firewall_rule_group(server['id'], group['id'])
678
+ return
679
+ end
680
+ json_response = @network_servers_interface.destroy_firewall_rule_group(server['id'], group['id'])
681
+ render_response(json_response, options, 'ruleGroup') do
682
+ print_green_success "\nDeleted Network Firewall Rule Group #{group['name']}\n"
683
+ _list_rule_groups(server, options)
684
+ end
685
+ end
686
+
687
+ private
688
+
689
+ def search_network_servers(phrase = nil)
690
+ @network_servers_interface.list(phrase ? {phrase: phrase.to_s} : {})['networkServers']
691
+ end
692
+
693
+ def find_rule(server_id, val)
694
+ if val.to_s =~ /\A\d{1,}\Z/
695
+ return find_rule_by_id(server_id, val)
696
+ else
697
+ if rule = find_rule_by_name(server_id, val)
698
+ return find_rule_by_id(server_id, rule['id'])
699
+ end
700
+ end
701
+ end
702
+
703
+ def find_rule_by_id(server_id, rule_id)
704
+ begin
705
+ json_response = @network_servers_interface.get_firewall_rule(server_id, rule_id.to_i)
706
+ return json_response['rule']
707
+ rescue RestClient::Exception => e
708
+ if e.response && e.response.code == 404
709
+ print_red_alert "Network firewall rule not found by id #{rule_id}"
710
+ return nil
711
+ else
712
+ raise e
713
+ end
714
+ end
715
+ end
716
+
717
+ def find_rule_by_name(server_id, name)
718
+ rules = search_rules(server_id, name)
719
+ if rules.empty?
720
+ print_red_alert "Network firewall rule not found by name #{name}"
721
+ return nil
722
+ elsif rules.size > 1
723
+ print_red_alert "#{rules.size} network firewall rules found by name #{name}"
724
+ rows = rules.collect do |it|
725
+ {id: it['id'], name: it['name']}
726
+ end
727
+ puts as_pretty_table(rows, [:id, :name], {color:red})
728
+ return nil
729
+ else
730
+ return rules[0]
731
+ end
732
+ end
733
+
734
+ def search_rules(server_id, phrase = nil)
735
+ @network_servers_interface.list_firewall_rules(server_id, phrase ? {phrase: phrase.to_s} : {})['rules']
736
+ end
737
+
738
+ def find_rule_group(server_id, val)
739
+ if val.to_s =~ /\A\d{1,}\Z/
740
+ return find_rule_group_by_id(server_id, val)
741
+ else
742
+ if group = find_rule_group_by_name(server_id, val)
743
+ return find_rule_group_by_id(server_id, group['id'])
744
+ end
745
+ end
746
+ end
747
+
748
+ def find_rule_group_by_id(server_id, group_id)
749
+ begin
750
+ json_response = @network_servers_interface.get_firewall_rule_group(server_id, group_id.to_i)
751
+ return json_response['ruleGroup']
752
+ rescue RestClient::Exception => e
753
+ if e.response && e.response.code == 404
754
+ print_red_alert "Network firewall rule group not found by id #{group_id}"
755
+ return nil
756
+ else
757
+ raise e
758
+ end
759
+ end
760
+ end
761
+
762
+ def find_rule_group_by_name(server_id, name)
763
+ groups = search_rule_groups(server_id, name)
764
+ if groups.empty?
765
+ print_red_alert "Network firewall rule group not found by name #{name}"
766
+ return nil
767
+ elsif groups.size > 1
768
+ print_red_alert "#{groups.size} network firewall rule groups found by name #{name}"
769
+ rows = groups.collect do |it|
770
+ {id: it['id'], name: it['name']}
771
+ end
772
+ puts as_pretty_table(rows, [:id, :name], {color:red})
773
+ return nil
774
+ else
775
+ return groups[0]
776
+ end
777
+ end
778
+
779
+ def search_rule_groups(server_id, phrase = nil)
780
+ @network_servers_interface.list_firewall_rule_groups(server_id, phrase ? {phrase: phrase.to_s} : {})['ruleGroups']
781
+ end
782
+
783
+ end