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,903 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::NetworkPoolsCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::InfrastructureHelper
6
+
7
+ set_command_name :'network-pools'
8
+
9
+ register_subcommands :list, :get, :add, :update, :remove #, :generate_pool
10
+ register_subcommands :list_ips, :get_ip, :add_ip, :update_ip, :remove_ip
11
+
12
+ def initialize()
13
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
14
+ end
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @network_pools_interface = @api_client.network_pools
19
+ @network_pool_ips_interface = @api_client.network_pool_ips
20
+ @network_pool_servers_interface = @api_client.network_pool_servers
21
+ @clouds_interface = @api_client.clouds
22
+ @options_interface = @api_client.options
23
+ end
24
+
25
+ def handle(args)
26
+ handle_subcommand(args)
27
+ end
28
+
29
+ def list(args)
30
+ options = {}
31
+ params = {}
32
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
33
+ opts.banner = subcommand_usage()
34
+ opts.on('--pool-server SERVER', String, "Filter by Network Pool Server Name or ID") do |val|
35
+ options[:pool_server] = val
36
+ end
37
+ build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :dry_run, :remote])
38
+ opts.footer = "List network pools."
39
+ end
40
+ optparse.parse!(args)
41
+ connect(options)
42
+ begin
43
+ params.merge!(parse_list_options(options))
44
+ if options[:pool_server]
45
+ record = find_by_name_or_id(:network_pool_server, options[:pool_server])
46
+ if record.nil?
47
+ exit 1 #return 1, "Network Pool Server not found by '#{val}'"
48
+ else
49
+ params['poolServerId'] = record['id']
50
+ end
51
+ end
52
+ @network_pools_interface.setopts(options)
53
+ if options[:dry_run]
54
+ print_dry_run @network_pools_interface.dry.list(params)
55
+ return
56
+ end
57
+ json_response = @network_pools_interface.list(params)
58
+ network_pools = json_response["networkPools"]
59
+ if options[:json]
60
+ puts as_json(json_response, options, "networkPools")
61
+ return 0
62
+ elsif options[:yaml]
63
+ puts as_yaml(json_response, options, "networkPools")
64
+ return 0
65
+ elsif options[:csv]
66
+ puts records_as_csv(network_pools, options)
67
+ return 0
68
+ end
69
+ title = "Network Pools"
70
+ subtitles = []
71
+ subtitles += parse_list_subtitles(options)
72
+ print_h1 title, subtitles
73
+ if network_pools.empty?
74
+ print cyan,"No network pools found.",reset,"\n"
75
+ else
76
+ rows = network_pools.collect {|network_pool|
77
+ row = {
78
+ id: network_pool['id'],
79
+ # matching UI, but huh??
80
+ name: !network_pool['displayName'].to_s.empty? ? network_pool['displayName'] : network_pool['name'],
81
+ network: network_pool['name'],
82
+ # network: network_pool['network'] ? network_pool['network']['name'] : '',
83
+ type: network_pool['type'] ? network_pool['type']['name'] : '',
84
+ ipRanges: build_ip_ranges(network_pool['ipRanges']).uniq.join(', '),
85
+ total: ("#{network_pool['ipCount']}/#{network_pool['freeCount']}")
86
+ }
87
+ row
88
+ }
89
+ columns = [:id, :name, :network, :type, {:ipRanges => {:display_name => "IP RANGES"} }, {:total => {:display_name => "TOTAL/FREE IPs"} }]
90
+ if options[:include_fields]
91
+ columns = options[:include_fields]
92
+ end
93
+ print cyan
94
+ print as_pretty_table(rows, columns, options)
95
+ print reset
96
+ print_results_pagination(json_response, {:label => "network pool", :n_label => "network pools"})
97
+ end
98
+ print reset,"\n"
99
+ return 0
100
+ rescue RestClient::Exception => e
101
+ print_rest_exception(e, options)
102
+ exit 1
103
+ end
104
+ end
105
+
106
+ def get(args)
107
+ options = {}
108
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
109
+ opts.banner = subcommand_usage("[network-pool]")
110
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
111
+ opts.footer = "Get details about a network pool." + "\n" +
112
+ "[network-pool] is required. This is the name or id of a network pool."
113
+ end
114
+ optparse.parse!(args)
115
+ if args.count != 1
116
+ print_error MtnCloud::Terminal.angry_prompt
117
+ puts_error "#{command_name} missing argument: [network-pool]\n#{optparse}"
118
+ return 1
119
+ end
120
+ connect(options)
121
+ begin
122
+ @network_pools_interface.setopts(options)
123
+ if options[:dry_run]
124
+ if args[0].to_s =~ /\A\d{1,}\Z/
125
+ print_dry_run @network_pools_interface.dry.get(args[0].to_i)
126
+ else
127
+ print_dry_run @network_pools_interface.dry.list({name:args[0]})
128
+ end
129
+ return
130
+ end
131
+ network_pool = find_network_pool_by_name_or_id(args[0])
132
+ return 1 if network_pool.nil?
133
+ json_response = {'networkPool' => network_pool} # skip redundant request
134
+ # json_response = @network_pools_interface.get(network_pool['id'])
135
+ network_pool = json_response['networkPool']
136
+ if options[:json]
137
+ puts as_json(json_response, options, "networkPool")
138
+ return 0
139
+ elsif options[:yaml]
140
+ puts as_yaml(json_response, options, "networkPool")
141
+ return 0
142
+ elsif options[:csv]
143
+ puts records_as_csv([network_pool], options)
144
+ return 0
145
+ end
146
+ print_h1 "Network Pool Details"
147
+ print cyan
148
+ description_cols = {
149
+ "ID" => 'id',
150
+ "Name" => lambda {|it| !it['displayName'].to_s.empty? ? it['displayName'] : it['name'] },
151
+ "Network" => lambda {|it| it['name'] },
152
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
153
+ # "IP Ranges" => lambda {|it| it['ipRanges'] ? it['ipRanges'].collect {|r| r['startAddress'].to_s + " - " + r['endAddress'].to_s }.uniq.join(', ') : '' },
154
+ "Total IPs" => lambda {|it| it['ipCount'] },
155
+ "Free IPs" => lambda {|it| it['freeCount'] },
156
+ }
157
+ print_description_list(description_cols, network_pool)
158
+
159
+ print_h2 "IP Ranges"
160
+ print cyan
161
+ if network_pool['ipRanges']
162
+ build_ip_ranges(network_pool['ipRanges']).each do |r|
163
+ puts " * #{r}"
164
+ end
165
+ end
166
+ print reset,"\n"
167
+ return 0
168
+ rescue RestClient::Exception => e
169
+ print_rest_exception(e, options)
170
+ return 1
171
+ end
172
+ end
173
+
174
+ def add(args)
175
+ options = {}
176
+ ip_range_list = nil
177
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
178
+ opts.banner = subcommand_usage()
179
+ opts.on('--name VALUE', String, "Name for this network pool") do |val|
180
+ options['name'] = val
181
+ end
182
+ opts.on('--type VALUE', String, "Type of network pool") do |val|
183
+ options['type'] = val
184
+ end
185
+ opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end or an IPv6 CIDR") do |list|
186
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
187
+ ip_range_list = []
188
+ else
189
+ ip_range_list = parse_ipv4_and_ipv6_ranges(list)
190
+ end
191
+ end
192
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
193
+ opts.footer = "Create a new network pool." + "\n" +
194
+ "[name] is required and can be passed as --name instead."
195
+ end
196
+ optparse.parse!(args)
197
+ if args.count > 1
198
+ print_error MtnCloud::Terminal.angry_prompt
199
+ puts_error "wrong number of arguments, expected 0-1 and got #{args.count}\n#{optparse}"
200
+ return 1
201
+ end
202
+ connect(options)
203
+ begin
204
+ # merge -O options into normally parsed options
205
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
206
+
207
+ # support [name] as first argument
208
+ if args[0]
209
+ options['name'] = args[0]
210
+ end
211
+
212
+ # construct payload
213
+ payload = nil
214
+ if options[:payload]
215
+ payload = options[:payload]
216
+ else
217
+ # prompt for network options
218
+ payload = {
219
+ 'networkPool' => {
220
+ # 'config' => {}
221
+ }
222
+ }
223
+
224
+ # allow arbitrary -O options
225
+ payload['networkPool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
226
+
227
+ # Name
228
+ if options['name']
229
+ payload['networkPool']['name'] = options['name']
230
+ else
231
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name for this network pool.'}], options)
232
+ payload['networkPool']['name'] = v_prompt['name']
233
+ end
234
+
235
+ # Network Pool Type
236
+ network_type_code = nil
237
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Pool Type', 'type' => 'select', 'optionSource' => 'networkPoolTypes', 'required' => true, 'description' => 'Choose a network pool type.'}], options, @api_client, {})
238
+ network_type_code = v_prompt['type']
239
+ if network_type_code.nil? || network_type_code.to_s.empty?
240
+ print_red_alert "Pool Type not found by code '#{options['type']}'"
241
+ return 1
242
+ end
243
+ # pre 4.1.1 expects ID
244
+ if network_type_code.to_s =~ /\A\d{1,}\Z/
245
+ payload['networkPool']['type'] = {'id' => network_type_code }
246
+ else
247
+ payload['networkPool']['type'] = {'code' => network_type_code }
248
+ end
249
+ # payload['networkPool']['type'] = network_type_code # this works too, simpler
250
+
251
+ # IP Ranges
252
+ if ip_range_list
253
+ payload['networkPool']['ipRanges'] = ip_range_list
254
+ else
255
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ipRanges', 'fieldLabel' => 'IP Ranges', 'type' => 'text', 'required' => true, 'description' => 'IP Ranges in the pool, comma separated list of ranges in the format start-end or an IPv6 CIDR'}], options)
256
+ ip_range_list = parse_ipv4_and_ipv6_ranges(v_prompt['ipRanges'].to_s.split(","))
257
+ payload['networkPool']['ipRanges'] = ip_range_list
258
+ end
259
+
260
+ end
261
+
262
+ @network_pools_interface.setopts(options)
263
+ if options[:dry_run]
264
+ print_dry_run @network_pools_interface.dry.create(payload)
265
+ return
266
+ end
267
+ json_response = @network_pools_interface.create(payload)
268
+ if options[:json]
269
+ print JSON.pretty_generate(json_response)
270
+ print "\n"
271
+ elsif !options[:quiet]
272
+ network_pool = json_response['networkPool']
273
+ print_green_success "Added network pool #{network_pool['name']}"
274
+ get([network_pool['id']])
275
+ end
276
+ return 0
277
+ rescue RestClient::Exception => e
278
+ print_rest_exception(e, options)
279
+ exit 1
280
+ end
281
+ end
282
+
283
+ def update(args)
284
+ options = {}
285
+ ip_range_list = nil
286
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
287
+ opts.banner = subcommand_usage("[network-pool] [options]")
288
+ opts.on('--name VALUE', String, "Name for this network pool") do |val|
289
+ options['name'] = val
290
+ end
291
+ opts.on('--code VALUE', String, "Code") do |val|
292
+ options['code'] = val
293
+ end
294
+ opts.on('--category VALUE', String, "Category") do |val|
295
+ options['category'] = val
296
+ end
297
+ # todo all of these
298
+ # internalId
299
+ # externalId
300
+ # dnsDomain
301
+ # dnsSearchPath
302
+ # hostPrefix
303
+ # httpProxy
304
+ # dnsServers
305
+ # dnsSuffixList
306
+ # dhcpServer
307
+ # dhcpIp
308
+ # gateway
309
+ # netmask
310
+ # subnetAddress
311
+ # poolEnabled
312
+ # tftpServer
313
+ # bootFile
314
+ opts.on('--ip-ranges LIST', Array, "IP Ranges, comma separated list IP ranges in the format start-end or an IPv6 CIDR") do |list|
315
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
316
+ ip_range_list = []
317
+ else
318
+ ip_range_list = parse_ipv4_and_ipv6_ranges(list)
319
+ end
320
+ end
321
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
322
+ opts.footer = "Update a network pool." + "\n" +
323
+ "[network-pool] is required. This is the id of a network pool."
324
+ end
325
+ optparse.parse!(args)
326
+ if args.count != 1
327
+ print_error MtnCloud::Terminal.angry_prompt
328
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
329
+ return 1
330
+ end
331
+ connect(options)
332
+
333
+ begin
334
+ network_pool = find_network_pool_by_name_or_id(args[0])
335
+ return 1 if network_pool.nil?
336
+
337
+ # merge -O options into normally parsed options
338
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
339
+
340
+ # construct payload
341
+ payload = nil
342
+ if options[:payload]
343
+ payload = options[:payload]
344
+ else
345
+ # prompt for network options
346
+ payload = {
347
+ 'networkPool' => {
348
+ }
349
+ }
350
+
351
+ # allow arbitrary -O options
352
+ payload['networkPool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
353
+
354
+ # Name
355
+ if options['name']
356
+ payload['networkPool']['name'] = options['name']
357
+ end
358
+ if options['category']
359
+ payload['networkPool']['category'] = options['category']
360
+ end
361
+ if options['code']
362
+ payload['networkPool']['code'] = options['code']
363
+ end
364
+
365
+ # IP Ranges
366
+ if ip_range_list
367
+ ip_range_list = ip_range_list.collect {|range|
368
+ # ugh, need to allow changing an existing range by id too
369
+ if network_pool['ipRanges']
370
+ existing_range = network_pool['ipRanges'].find {|r|
371
+ (range[:startAddress] == r['startAddress'] && range[:endAddress] == r['endAddress']) || range[:cidrIPv6] == r['cidrIPv6']
372
+ }
373
+ if existing_range
374
+ range[:id] = existing_range['id']
375
+ end
376
+ end
377
+ range
378
+ }
379
+ payload['networkPool']['ipRanges'] = ip_range_list
380
+ else
381
+ # v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ipRanges', 'fieldLabel' => 'IP Ranges', 'type' => 'text', 'required' => true, 'description' => 'IP Ranges in the pool, comma separated list of ranges in the format start-end.'}], options)
382
+ # payload['networkPool']['ipRanges'] = v_prompt['ipRanges'].to_s.split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq.collect {|it|
383
+ # it
384
+ # }
385
+ end
386
+
387
+ end
388
+ @network_pools_interface.setopts(options)
389
+ if options[:dry_run]
390
+ print_dry_run @network_pools_interface.dry.update(network_pool["id"], payload)
391
+ return
392
+ end
393
+ json_response = @network_pools_interface.update(network_pool["id"], payload)
394
+ if options[:json]
395
+ puts as_json(json_response)
396
+ else
397
+ network_pool = json_response['networkPool']
398
+ print_green_success "Updated network pool #{network_pool['name']}"
399
+ get([network_pool['id']])
400
+ end
401
+ return 0
402
+ rescue RestClient::Exception => e
403
+ print_rest_exception(e, options)
404
+ return 1
405
+ end
406
+ end
407
+
408
+ def remove(args)
409
+ options = {}
410
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
411
+ opts.banner = subcommand_usage("[network-pool]")
412
+ build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run, :remote])
413
+ opts.footer = "Delete a network pool." + "\n" +
414
+ "[network-pool] is required. This is the name or id of a network pool."
415
+ end
416
+ optparse.parse!(args)
417
+
418
+ if args.count < 1
419
+ print_error MtnCloud::Terminal.angry_prompt
420
+ puts_error "#{command_name} missing argument: [network-pool]\n#{optparse}"
421
+ return 1
422
+ end
423
+
424
+ connect(options)
425
+ begin
426
+ network_pool = find_network_pool_by_name_or_id(args[0])
427
+ return 1 if network_pool.nil?
428
+
429
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the network pool: #{network_pool['name']}?")
430
+ return 9, "aborted command"
431
+ end
432
+ @network_pools_interface.setopts(options)
433
+ if options[:dry_run]
434
+ print_dry_run @network_pools_interface.dry.destroy(network_pool['id'])
435
+ return 0
436
+ end
437
+ json_response = @network_pools_interface.destroy(network_pool['id'])
438
+ if options[:json]
439
+ print JSON.pretty_generate(json_response)
440
+ print "\n"
441
+ else
442
+ print_green_success "Removed network pool #{network_pool['name']}"
443
+ # list([])
444
+ end
445
+ return 0
446
+ rescue RestClient::Exception => e
447
+ print_rest_exception(e, options)
448
+ return 1
449
+ end
450
+ end
451
+
452
+ def list_ips(args)
453
+ options = {}
454
+ params = {}
455
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
456
+ opts.banner = subcommand_usage("[network-pool]")
457
+ build_common_options(opts, options, [:list, :json, :yaml, :csv, :fields, :json, :dry_run, :remote])
458
+ opts.footer = "List network pool IP addresses.\n" +
459
+ "[network-pool] is required. This is the name or id of a network pool."
460
+ end
461
+ optparse.parse!(args)
462
+ connect(options)
463
+ if args.count != 1
464
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args}\n#{optparse}"
465
+ end
466
+ begin
467
+ network_pool = find_network_pool_by_name_or_id(args[0])
468
+ return 1 if network_pool.nil?
469
+ network_pool_id = network_pool['id']
470
+
471
+ params.merge!(parse_list_options(options))
472
+ @network_pool_ips_interface.setopts(options)
473
+ if options[:dry_run]
474
+ print_dry_run @network_pool_ips_interface.dry.list(network_pool_id, params)
475
+ return
476
+ end
477
+ json_response = @network_pool_ips_interface.list(network_pool_id, params)
478
+ network_pool_ips = json_response["networkPoolIps"]
479
+ if options[:json]
480
+ puts as_json(json_response, options, "networkPoolIps")
481
+ return 0
482
+ elsif options[:yaml]
483
+ puts as_yaml(json_response, options, "networkPoolIps")
484
+ return 0
485
+ elsif options[:csv]
486
+ puts records_as_csv(network_pool_ips, options)
487
+ return 0
488
+ end
489
+ title = "Network Pool IPs"
490
+ subtitles = []
491
+ subtitles += parse_list_subtitles(options)
492
+ print_h1 title, subtitles
493
+ if network_pool_ips.empty?
494
+ print cyan,"No network pool IPs found.",reset,"\n"
495
+ else
496
+ columns = [
497
+ {"ID" => lambda {|it| it['id'] } },
498
+ {"IP ADDRESS" => lambda {|it| it['ipAddress'] } },
499
+ {"HOSTNAME" => lambda {|it| it['hostname'] } },
500
+ {"TYPE" => lambda {|it| it['ipType'] } },
501
+ #{"CREATED BY" => lambda {|it| it['createdBy'] ? it['createdBy']['username'] : '' } },
502
+ {"CREATED" => lambda {|it| format_local_dt(it['dateCreated']) } },
503
+ {"UPDATED" => lambda {|it| format_local_dt(it['lastUpdated']) } },
504
+ ]
505
+ if options[:include_fields]
506
+ columns = options[:include_fields]
507
+ end
508
+ print as_pretty_table(network_pool_ips, columns, options)
509
+ print_results_pagination(json_response)
510
+ end
511
+ print reset,"\n"
512
+ return 0
513
+ rescue RestClient::Exception => e
514
+ print_rest_exception(e, options)
515
+ exit 1
516
+ end
517
+ end
518
+
519
+ def get_ip(args)
520
+ options = {}
521
+ params = {}
522
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
523
+ opts.banner = subcommand_usage("[network-pool] [ip]")
524
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
525
+ opts.footer = "Get details about a network pool IP address.\n" +
526
+ "[network-pool] is required. This is the name or id of a network pool.\n" +
527
+ "[ip] is required. This is the ip address or id of a network pool IP."
528
+ end
529
+ optparse.parse!(args)
530
+ connect(options)
531
+ if args.count != 2
532
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args}\n#{optparse}"
533
+ end
534
+ begin
535
+ network_pool = find_network_pool_by_name_or_id(args[0])
536
+ return 1 if network_pool.nil?
537
+ network_pool_id = network_pool['id']
538
+
539
+ params.merge!(parse_list_options(options))
540
+ @network_pool_ips_interface.setopts(options)
541
+ if options[:dry_run]
542
+ if args[1].to_s =~ /\A\d{1,}\Z/
543
+ print_dry_run @network_pool_ips_interface.dry.get(network_pool_id, args[1].to_i)
544
+ else
545
+ print_dry_run @network_pool_ips_interface.dry.list(network_pool_id, {ipAddress:args[1]})
546
+ end
547
+ return
548
+ end
549
+ network_pool_ip = find_network_pool_ip_by_address_or_id(network_pool_id, args[1])
550
+ return 1 if network_pool_ip.nil?
551
+ json_response = {'networkPoolIp' => network_pool_ip} # skip redundant request
552
+ # json_response = @network_pool_ips_interface.get(network_pool_id, args[1])
553
+ #network_pool_ip = json_response['networkPoolIp']
554
+ if options[:json]
555
+ puts as_json(json_response, options, "networkPoolIp")
556
+ return 0
557
+ elsif options[:yaml]
558
+ puts as_yaml(json_response, options, "networkPoolIp")
559
+ return 0
560
+ elsif options[:csv]
561
+ puts records_as_csv([network_pool_ip], options)
562
+ return 0
563
+ end
564
+ print_h1 "Network Pool IP Details"
565
+ print cyan
566
+ description_cols = {
567
+ "ID" => 'id',
568
+ "IP Address" => lambda {|it| it['ipAddress'] },
569
+ "Hostname" => lambda {|it| it['hostname'] },
570
+ "Type" => lambda {|it| it['ipType'] ? it['ipType'] : '' },
571
+ # "Gateway" => lambda {|it| network_pool['gatewayAddress'] },
572
+ # "Subnet Mask" => lambda {|it| network_pool['subnetMask'] },
573
+ # "DNS Server" => lambda {|it| network_pool['dnsServer'] },
574
+ "Pool" => lambda {|it| network_pool['name'] },
575
+ #"Pool" => lambda {|it| it['networkPool'] ? it['networkPool']['name'] : '' },
576
+ "Interface" => lambda {|it| network_pool['interfaceName'] },
577
+ "Created By" => lambda {|it| it['createdBy'] ? it['createdBy']['username'] : '' },
578
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
579
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
580
+ }
581
+ print_description_list(description_cols, network_pool_ip)
582
+
583
+ print reset,"\n"
584
+ return 0
585
+ rescue RestClient::Exception => e
586
+ print_rest_exception(e, options)
587
+ exit 1
588
+ end
589
+ end
590
+
591
+ def add_ip(args)
592
+ options = {}
593
+ params = {}
594
+ next_free_ip = false
595
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
596
+ opts.banner = subcommand_usage("[network-pool] [ip] [--next]")
597
+ opts.on('--ip-address VALUE', String, "IP Address for this network pool IP") do |val|
598
+ options[:options]['ipAddress'] = val
599
+ end
600
+ opts.on('--next-free-ip', '--next-free-ip', "Use the next available ip address. This can be used instead of specifying an ip address") do
601
+ next_free_ip = true
602
+ end
603
+ opts.on('--hostname VALUE', String, "Hostname for this network pool IP") do |val|
604
+ options[:options]['hostname'] = val
605
+ end
606
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
607
+ opts.footer = "Create a new network pool IP." + "\n" +
608
+ "[network-pool] is required. This is the name or id of a network pool.\n" +
609
+ "[ip] is required or --next-free-ip to use the next available address instead."
610
+ end
611
+ optparse.parse!(args)
612
+ if next_free_ip
613
+ verify_args!(args:args, count:1, optparse:optparse)
614
+ else
615
+ verify_args!(args:args, min:1, max:2, optparse:optparse)
616
+ end
617
+ connect(options)
618
+ begin
619
+ network_pool = find_network_pool_by_name_or_id(args[0])
620
+ return 1 if network_pool.nil?
621
+ network_pool_id = network_pool['id']
622
+
623
+ # support [ip] as first argument
624
+ if args[1]
625
+ options[:options]['ipAddress'] = args[1]
626
+ end
627
+
628
+ # construct payload
629
+ payload = nil
630
+ if options[:payload]
631
+ payload = options[:payload]
632
+ else
633
+ # prompt for network options
634
+ payload = {
635
+ 'networkPoolIp' => {
636
+ }
637
+ }
638
+
639
+ # allow arbitrary -O options
640
+ payload['networkPoolIp'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
641
+
642
+ # IP Address
643
+ unless next_free_ip
644
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ipAddress', 'fieldLabel' => 'IP Address', 'type' => 'text', 'required' => true, 'description' => 'IP Address for this network pool IP.'}], options[:options])
645
+ payload['networkPoolIp']['ipAddress'] = v_prompt['ipAddress'] unless v_prompt['ipAddress'].to_s.empty?
646
+ end
647
+
648
+ # Hostname
649
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'hostname', 'fieldLabel' => 'Hostname', 'type' => 'text', 'required' => true, 'description' => 'Hostname for this network pool IP.'}], options[:options])
650
+ payload['networkPoolIp']['hostname'] = v_prompt['hostname'] unless v_prompt['hostname'].to_s.empty?
651
+
652
+ end
653
+
654
+ @network_pool_ips_interface.setopts(options)
655
+ if options[:dry_run]
656
+ print_dry_run @network_pool_ips_interface.dry.create(network_pool_id, payload)
657
+ return
658
+ end
659
+ json_response = @network_pool_ips_interface.create(network_pool_id, payload)
660
+ if options[:json]
661
+ print JSON.pretty_generate(json_response)
662
+ print "\n"
663
+ elsif !options[:quiet]
664
+ network_pool_ip = json_response['networkPoolIp']
665
+ print_green_success "Added network pool IP #{network_pool_ip['ipAddress']}"
666
+ get_ip([network_pool['id'], network_pool_ip['id']])
667
+ end
668
+ return 0
669
+ rescue RestClient::Exception => e
670
+ print_rest_exception(e, options)
671
+ exit 1
672
+ end
673
+ end
674
+
675
+ def update_ip(args)
676
+ options = {}
677
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
678
+ opts.banner = subcommand_usage("[network-pool] [ip] [options]")
679
+ opts.on('--hostname VALUE', String, "Hostname for this network pool IP") do |val|
680
+ options[:options]['hostname'] = val
681
+ end
682
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
683
+ opts.footer = "Update a network pool IP." + "\n" +
684
+ "[network-pool] is required. This is the name or id of a network pool.\n" +
685
+ "[ip] is required. This is the ip address or id of a network pool IP."
686
+ end
687
+ optparse.parse!(args)
688
+ if args.count != 2
689
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args}\n#{optparse}"
690
+ end
691
+ connect(options)
692
+ begin
693
+ network_pool = find_network_pool_by_name_or_id(args[0])
694
+ return 1 if network_pool.nil?
695
+ network_pool_id = network_pool['id']
696
+
697
+ network_pool_ip = find_network_pool_ip_by_address_or_id(network_pool_id, args[1])
698
+ return 1 if network_pool_ip.nil?
699
+
700
+ # merge -O options into normally parsed options
701
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
702
+
703
+ # construct payload
704
+ payload = nil
705
+ if options[:payload]
706
+ payload = options[:payload]
707
+ else
708
+ # prompt for network options
709
+ payload = {
710
+ 'networkPoolIp' => {
711
+ }
712
+ }
713
+
714
+ # allow arbitrary -O options
715
+ payload['networkPoolIp'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
716
+
717
+ if payload['networkPoolIp'].empty?
718
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
719
+ end
720
+
721
+ end
722
+
723
+ @network_pool_ips_interface.setopts(options)
724
+ if options[:dry_run]
725
+ print_dry_run @network_pool_ips_interface.dry.update(network_pool_id, network_pool_ip['id'], payload)
726
+ return
727
+ end
728
+ json_response = @network_pool_ips_interface.update(network_pool_id, network_pool_ip['id'], payload)
729
+ if options[:json]
730
+ print JSON.pretty_generate(json_response)
731
+ print "\n"
732
+ elsif !options[:quiet]
733
+ network_pool_ip = json_response['networkPoolIp']
734
+ print_green_success "Updated network pool IP #{network_pool_ip['ipAddress']}"
735
+ get_ip([network_pool['id'], network_pool_ip['id']])
736
+ end
737
+ return 0
738
+ rescue RestClient::Exception => e
739
+ print_rest_exception(e, options)
740
+ exit 1
741
+ end
742
+ end
743
+
744
+ def remove_ip(args)
745
+ options = {}
746
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
747
+ opts.banner = subcommand_usage("[network-pool] [ip]")
748
+ build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run, :remote])
749
+ opts.footer = "Delete a network pool IP." + "\n" +
750
+ "[network-pool] is required. This is the name or id of a network pool.\n" +
751
+ "[ip] is required. This is the ip address or id of a network pool IP."
752
+ end
753
+ optparse.parse!(args)
754
+ if args.count != 2
755
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args}\n#{optparse}"
756
+ end
757
+ connect(options)
758
+ begin
759
+ network_pool = find_network_pool_by_name_or_id(args[0])
760
+ return 1 if network_pool.nil?
761
+ network_pool_id = network_pool['id']
762
+
763
+ network_pool_ip = find_network_pool_ip_by_address_or_id(network_pool_id, args[1])
764
+ return 1 if network_pool_ip.nil?
765
+
766
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the network pool IP: #{network_pool_ip['ipAddress']} (#{network_pool_ip['hostname']})?")
767
+ return 9, "aborted command"
768
+ end
769
+ @network_pool_ips_interface.setopts(options)
770
+ if options[:dry_run]
771
+ print_dry_run @network_pool_ips_interface.dry.destroy(network_pool['id'], network_pool_ip['id'])
772
+ return 0
773
+ end
774
+ json_response = @network_pool_ips_interface.destroy(network_pool['id'], network_pool_ip['id'])
775
+ if options[:json]
776
+ print JSON.pretty_generate(json_response)
777
+ print "\n"
778
+ else
779
+ print_green_success "Removed network pool IP #{network_pool_ip['ipAddress']} (#{network_pool_ip['hostname']})"
780
+ # list([])
781
+ end
782
+ return 0
783
+ rescue RestClient::Exception => e
784
+ print_rest_exception(e, options)
785
+ return 1
786
+ end
787
+ end
788
+
789
+ private
790
+
791
+
792
+ def find_network_pool_by_name_or_id(val)
793
+ if val.to_s =~ /\A\d{1,}\Z/
794
+ return find_network_pool_by_id(val)
795
+ else
796
+ return find_network_pool_by_name(val)
797
+ end
798
+ end
799
+
800
+ def find_network_pool_by_id(id)
801
+ begin
802
+ json_response = @network_pools_interface.get(id.to_i)
803
+ return json_response['networkPool']
804
+ rescue RestClient::Exception => e
805
+ if e.response && e.response.code == 404
806
+ print_red_alert "Network Pool not found by id #{id}"
807
+ return nil
808
+ else
809
+ raise e
810
+ end
811
+ end
812
+ end
813
+
814
+ def find_network_pool_by_name(name)
815
+ json_response = @network_pools_interface.list({name: name.to_s})
816
+ network_pools = json_response['networkPools']
817
+ if network_pools.empty?
818
+ print_red_alert "Network Pool not found by name #{name}"
819
+ return nil
820
+ elsif network_pools.size > 1
821
+ print_red_alert "#{network_pools.size} network pools found by name #{name}"
822
+ # print_networks_table(networks, {color: red})
823
+ rows = network_pools.collect do |it|
824
+ {id: it['id'], name: it['name']}
825
+ end
826
+ puts as_pretty_table(rows, [:id, :name], {color:red})
827
+ return nil
828
+ else
829
+ return network_pools[0]
830
+ end
831
+ end
832
+
833
+ def find_network_pool_ip_by_address_or_id(network_pool_id, val)
834
+ if val.to_s =~ /\A\d{1,}\Z/
835
+ return find_network_pool_ip_by_id(network_pool_id, val)
836
+ else
837
+ return find_network_pool_ip_by_address(network_pool_id, val)
838
+ end
839
+ end
840
+
841
+ def find_network_pool_ip_by_id(network_pool_id, id)
842
+ begin
843
+ json_response = @network_pool_ips_interface.get(network_pool_id, id.to_i)
844
+ return json_response['networkPoolIp']
845
+ rescue RestClient::Exception => e
846
+ if e.response && e.response.code == 404
847
+ print_red_alert "Network Pool IP not found by id #{id}"
848
+ return nil
849
+ else
850
+ raise e
851
+ end
852
+ end
853
+ end
854
+
855
+ def find_network_pool_ip_by_address(network_pool_id, address)
856
+ json_response = @network_pool_ips_interface.list(network_pool_id, {ipAddress: address.to_s})
857
+ network_pool_ips = json_response['networkPoolIps']
858
+ if network_pool_ips.empty?
859
+ print_red_alert "Network Pool IP not found by address #{address}"
860
+ return nil
861
+ elsif network_pool_ips.size > 1
862
+ print_red_alert "#{network_pool_ips.size} network pool IPs found by address #{address}"
863
+ columns = [
864
+ {"ID" => lambda {|it| it['id'] } },
865
+ {"IP ADDRESS" => lambda {|it| it['ipAddress'] } },
866
+ {"HOSTNAME" => lambda {|it| it['hostname'] } },
867
+ {"CREATED" => lambda {|it| format_local_dt(it['dateCreated']) } }
868
+ ]
869
+ puts as_pretty_table(network_pool_ips, columns, {color:red})
870
+ return nil
871
+ else
872
+ return network_pool_ips[0]
873
+ end
874
+ end
875
+
876
+ def build_ip_ranges(ip_ranges)
877
+ if ip_ranges.empty?
878
+ return []
879
+ else
880
+ ranges = ip_ranges.collect do |it|
881
+ if !it['cidrIPv6'].nil?
882
+ it['cidrIPv6'].to_s
883
+ else
884
+ it['startAddress'].to_s + " - " + it['endAddress'].to_s
885
+ end
886
+ end
887
+ end
888
+ end
889
+
890
+ def parse_ipv4_and_ipv6_ranges(range_string_list)
891
+ ip_range_list = range_string_list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
892
+ ip_range_list = ip_range_list.collect do |range_string|
893
+ if range_string.include?('-')
894
+ range_parts = range_string.split("-")
895
+ {startAddress: range_parts[0].to_s.strip, endAddress: range_parts[1].to_s.strip}
896
+ elsif range_string.include?(':')
897
+ {cidrIPv6: range_string}
898
+ end
899
+ end
900
+ return ip_range_list
901
+ end
902
+
903
+ end