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,966 @@
1
+ require 'mtncloud/cli/mixins/print_helper'
2
+ require 'mtncloud/cli/option_types'
3
+ require 'mtncloud/rest_client'
4
+ # Mixin for MtnCloud::Cli command classes
5
+ # Provides common methods for infrastructure management
6
+ module MtnCloud::Cli::InfrastructureHelper
7
+
8
+ def self.included(klass)
9
+ klass.send :include, MtnCloud::Cli::PrintHelper
10
+ end
11
+
12
+ def groups_interface
13
+ # @api_client.groups
14
+ raise "#{self.class} has not defined @groups_interface" if @groups_interface.nil?
15
+ @groups_interface
16
+ end
17
+
18
+ def clouds_interface
19
+ # @api_client.clouds
20
+ raise "#{self.class} has not defined @clouds_interface" if @clouds_interface.nil?
21
+ @clouds_interface
22
+ end
23
+
24
+ def clusters_interface
25
+ raise "#{self.class} has not defined @clusters_interface" if @clusters_interface.nil?
26
+ @clusters_interface
27
+ end
28
+
29
+ def networks_interface
30
+ # @api_client.networks
31
+ raise "#{self.class} has not defined @networks_interface" if @networks_interface.nil?
32
+ @networks_interface
33
+ end
34
+
35
+ def subnets_interface
36
+ # @api_client.subnets
37
+ raise "#{self.class} has not defined @subnets_interface" if @subnets_interface.nil?
38
+ @subnets_interface
39
+ end
40
+
41
+ def network_groups_interface
42
+ # @api_client.network_groups
43
+ raise "#{self.class} has not defined @network_groups_interface" if @network_groups_interface.nil?
44
+ @network_groups_interface
45
+ end
46
+
47
+ def resource_pool_groups_interface
48
+ # @api_client.resource_pool_groups
49
+ raise "#{self.class} has not defined @resource_pool_groups_interface" if @resource_pool_groups_interface.nil?
50
+ @resource_pool_groups_interface
51
+ end
52
+
53
+ def resource_pools_interface
54
+ # @api_client.resource_pool_groups
55
+ raise "#{self.class} has not defined @cloud_resource_pools_interface" if @cloud_resource_pools_interface.nil?
56
+ @cloud_resource_pools_interface
57
+ end
58
+
59
+ def network_types_interface
60
+ # @api_client.network_types
61
+ raise "#{self.class} has not defined @network_types_interface" if @network_types_interface.nil?
62
+ @network_types_interface
63
+ end
64
+
65
+ def subnet_types_interface
66
+ # @api_client.subnet_types
67
+ raise "#{self.class} has not defined @subnet_types_interface" if @subnet_types_interface.nil?
68
+ @subnet_types_interface
69
+ end
70
+
71
+ def find_group_by_name_or_id(val, include_tenants=true)
72
+ if val.to_s =~ /\A\d{1,}\Z/
73
+ return find_group_by_id(val)
74
+ else
75
+ return find_group_by_name(val, include_tenants)
76
+ end
77
+ end
78
+
79
+ def find_group_by_id(id)
80
+ begin
81
+ json_response = groups_interface.get(id.to_i)
82
+ return json_response['group']
83
+ rescue RestClient::Exception => e
84
+ if e.response && e.response.code == 404
85
+ print_red_alert "Group not found by id #{id}"
86
+ exit 1
87
+ else
88
+ raise e
89
+ end
90
+ end
91
+ end
92
+
93
+ def find_group_by_name(name, include_tenants=false)
94
+ params = {name: name}
95
+ params['includeTenants'] = true if include_tenants
96
+ groups = groups_interface.list(params)['groups']
97
+ if groups.empty?
98
+ print_red_alert "Group not found by name #{name}"
99
+ exit 1
100
+ elsif groups.size > 1
101
+ print_red_alert "Multiple groups exist with the name '#{name}'"
102
+ print_error "\n"
103
+ puts_error as_pretty_table(groups, [:id, :name], {color:red})
104
+ print_red_alert "Try using ID instead"
105
+ print_error reset,"\n"
106
+ exit 1
107
+ end
108
+ return groups[0]
109
+ end
110
+
111
+ def find_cloud_by_name_or_id(val, include_tenants=false)
112
+ if val.to_s =~ /\A\d{1,}\Z/
113
+ return find_cloud_by_id(val)
114
+ else
115
+ return find_cloud_by_name(val, include_tenants)
116
+ end
117
+ end
118
+
119
+ def find_cloud_by_id(id)
120
+ json_results = clouds_interface.get(id.to_i)
121
+ if json_results['zone'].empty?
122
+ print_red_alert "Cloud not found by id #{id}"
123
+ exit 1
124
+ end
125
+ cloud = json_results['zone']
126
+ return cloud
127
+ end
128
+
129
+ def find_cloud_by_name(name, include_tenants=false)
130
+ params = {name: name}
131
+ params['includeTenants'] = true if include_tenants
132
+ clouds = clouds_interface.list(params)['zones']
133
+ if clouds.empty?
134
+ print_red_alert "Cloud not found by name #{name}"
135
+ exit 1
136
+ elsif clouds.size > 1
137
+ print_red_alert "Multiple clouds exist with the name '#{name}'"
138
+ print_error "\n"
139
+ puts_error as_pretty_table(clouds, [:id, :name], {color:red})
140
+ print_red_alert "Try using ID instead"
141
+ print_error reset,"\n"
142
+ exit 1
143
+ end
144
+ return clouds[0]
145
+ end
146
+
147
+ def get_available_cloud_types(refresh=false, params = {})
148
+ if !@available_cloud_types || refresh
149
+ @available_cloud_types = clouds_interface.cloud_types({max:1000}.deep_merge(params))['zoneTypes']
150
+ end
151
+ return @available_cloud_types
152
+ end
153
+
154
+ def cloud_type_for_name_or_id(val)
155
+ if val.to_s =~ /\A\d{1,}\Z/
156
+ return cloud_type_for_id(val)
157
+ else
158
+ return cloud_type_for_name(val)
159
+ end
160
+ end
161
+
162
+ def cloud_type_for_id(id)
163
+ return get_available_cloud_types().find { |z| z['id'].to_i == id.to_i}
164
+ end
165
+
166
+ def cloud_type_for_name(name)
167
+ types = get_available_cloud_types(true, {'name' => name})
168
+ return types.find { |z| z['code'].downcase == name.downcase} || types.find { |z| z['name'].downcase == name.downcase}
169
+ end
170
+
171
+
172
+ # Networks
173
+
174
+ def find_network_by_name_or_id(val, include_tenants=false)
175
+ if val.to_s =~ /\A\d{1,}\Z/
176
+ return find_network_by_id(val)
177
+ else
178
+ return find_network_by_name(val, include_tenants)
179
+ end
180
+ end
181
+
182
+ def find_network_by_id(id)
183
+ begin
184
+ json_response = networks_interface.get(id.to_i)
185
+ return json_response['network']
186
+ rescue RestClient::Exception => e
187
+ if e.response && e.response.code == 404
188
+ print_red_alert "Network not found by id #{id}"
189
+ return nil
190
+ else
191
+ raise e
192
+ end
193
+ end
194
+ end
195
+
196
+ def find_network_by_name(name, include_tenants=false)
197
+ params = {name: name.to_s}
198
+ params['includeTenants'] = true if include_tenants
199
+ json_response = networks_interface.list(params)
200
+ networks = json_response['networks']
201
+ if networks.empty?
202
+ print_red_alert "Network not found by name #{name}"
203
+ return nil
204
+ elsif networks.size > 1
205
+ print_red_alert "#{networks.size} networks found by name #{name}"
206
+ rows = networks.collect do |it|
207
+ {id: it['id'], name: it['name']}
208
+ end
209
+ puts as_pretty_table(rows, [:id, :name], {color:red})
210
+ return nil
211
+ else
212
+ network = networks[0]
213
+ # merge in tenants map
214
+ if json_response['tenants'] && json_response['tenants'][network['id']]
215
+ network['tenants'] = json_response['tenants'][network['id']]
216
+ end
217
+ return network
218
+ end
219
+ end
220
+
221
+ def find_network_type_by_name_or_id(val)
222
+ if val.to_s =~ /\A\d{1,}\Z/
223
+ return find_network_type_by_id(val)
224
+ else
225
+ return find_network_type_by_name(val)
226
+ end
227
+ end
228
+
229
+ def find_network_type_by_id(id)
230
+ begin
231
+ json_response = network_types_interface.get(id.to_i)
232
+ return json_response['networkType']
233
+ rescue RestClient::Exception => e
234
+ if e.response && e.response.code == 404
235
+ print_red_alert "Network Type not found by id #{id}"
236
+ return nil
237
+ else
238
+ raise e
239
+ end
240
+ end
241
+ end
242
+
243
+ def find_network_type_by_name(name)
244
+ json_response = network_types_interface.list({name: name.to_s})
245
+ network_types = json_response['networkTypes']
246
+ if network_types.empty?
247
+ print_red_alert "Network Type not found by name #{name}"
248
+ return network_types
249
+ elsif network_types.size > 1
250
+ print_red_alert "#{network_types.size} network types found by name #{name}"
251
+ rows = network_types.collect do |it|
252
+ {id: it['id'], name: it['name']}
253
+ end
254
+ puts as_pretty_table(rows, [:id, :name], {color:red})
255
+ return nil
256
+ else
257
+ return network_types[0]
258
+ end
259
+ end
260
+
261
+ def find_subnet_by_name_or_id(val)
262
+ if val.to_s =~ /\A\d{1,}\Z/
263
+ return find_subnet_by_id(val)
264
+ else
265
+ return find_subnet_by_name(val)
266
+ end
267
+ end
268
+
269
+ def find_subnet_by_id(id)
270
+ begin
271
+ json_response = subnets_interface.get(id.to_i)
272
+ return json_response['subnet']
273
+ rescue RestClient::Exception => e
274
+ if e.response && e.response.code == 404
275
+ print_red_alert "Subnet not found by id #{id}"
276
+ return nil
277
+ else
278
+ raise e
279
+ end
280
+ end
281
+ end
282
+
283
+ def find_subnet_by_name(name)
284
+ json_response = subnets_interface.list({name: name.to_s})
285
+ subnets = json_response['subnets']
286
+ if subnets.empty?
287
+ print_red_alert "Subnet not found by name #{name}"
288
+ return nil
289
+ elsif subnets.size > 1
290
+ print_red_alert "#{subnets.size} subnets found by name #{name}"
291
+ rows = subnets.collect do |it|
292
+ {id: it['id'], name: it['name']}
293
+ end
294
+ puts as_pretty_table(rows, [:id, :name], {color:red})
295
+ return nil
296
+ else
297
+ return subnets[0]
298
+ end
299
+ end
300
+
301
+ def find_subnet_type_by_name_or_id(val)
302
+ if val.to_s =~ /\A\d{1,}\Z/
303
+ return find_subnet_type_by_id(val)
304
+ else
305
+ return find_subnet_type_by_name(val)
306
+ end
307
+ end
308
+
309
+ def find_subnet_type_by_id(id)
310
+ begin
311
+ json_response = subnet_types_interface.get(id.to_i)
312
+ return json_response['subnetType']
313
+ rescue RestClient::Exception => e
314
+ if e.response && e.response.code == 404
315
+ print_red_alert "Subnet Type not found by id #{id}"
316
+ return nil
317
+ else
318
+ raise e
319
+ end
320
+ end
321
+ end
322
+
323
+ def find_subnet_type_by_name(name)
324
+ json_response = subnet_types_interface.list({name: name.to_s})
325
+ subnet_types = json_response['subnetTypes']
326
+ if subnet_types.empty?
327
+ print_red_alert "Subnet Type not found by name #{name}"
328
+ return subnet_types
329
+ elsif subnet_types.size > 1
330
+ print_red_alert "#{subnet_types.size} subnet types found by name #{name}"
331
+ rows = subnet_types.collect do |it|
332
+ {id: it['id'], name: it['name']}
333
+ end
334
+ puts as_pretty_table(rows, [:id, :name], {color:red})
335
+ return nil
336
+ else
337
+ return subnet_types[0]
338
+ end
339
+ end
340
+
341
+ def find_network_group_by_name_or_id(val)
342
+ if val.to_s =~ /\A\d{1,}\Z/
343
+ return find_network_group_by_id(val)
344
+ else
345
+ return find_network_group_by_name(val)
346
+ end
347
+ end
348
+
349
+ def find_network_group_by_id(id)
350
+ begin
351
+ json_response = network_groups_interface.get(id.to_i)
352
+ return json_response['networkGroup']
353
+ rescue RestClient::Exception => e
354
+ if e.response && e.response.code == 404
355
+ print_red_alert "Network Group not found by id #{id}"
356
+ return nil
357
+ else
358
+ raise e
359
+ end
360
+ end
361
+ end
362
+
363
+ def find_network_group_by_name(name)
364
+ json_response = network_groups_interface.list({name: name.to_s})
365
+ network_groups = json_response['networkGroups']
366
+ if network_groups.empty?
367
+ print_red_alert "Network Group not found by name #{name}"
368
+ return nil
369
+ elsif network_groups.size > 1
370
+ print_red_alert "#{network_groups.size} network groups found by name #{name}"
371
+ # print_networks_table(networks, {color: red})
372
+ rows = network_groups.collect do |it|
373
+ {id: it['id'], name: it['name']}
374
+ end
375
+ puts as_pretty_table(rows, [:id, :name], {color:red})
376
+ return nil
377
+ else
378
+ return network_groups[0]
379
+ end
380
+ end
381
+
382
+ def find_resource_pool_by_name_or_id(val)
383
+ if val.to_s =~ /\A\d{1,}\Z/
384
+ return find_resource_pool_by_id(val)
385
+ else
386
+ return find_resource_pool_by_name(val)
387
+ end
388
+ end
389
+
390
+ def find_resource_pool_by_id(id)
391
+ begin
392
+ json_response = resource_pools_interface.get_without_cloud(id.to_i)
393
+ return json_response['resourcePool']
394
+ rescue RestClient::Exception => e
395
+ if e.response && e.response.code == 404
396
+ print_red_alert "Resource Pool not found by id #{id}"
397
+ return nil
398
+ else
399
+ raise e
400
+ end
401
+ end
402
+ end
403
+
404
+ def find_resource_pool_by_name(name)
405
+ json_response = resource_pools_interface.list_without_cloud({name: name.to_s})
406
+ resource_pools = json_response['resourcePools']
407
+ if resource_pools.empty?
408
+ print_red_alert "Resource Pool not found by name #{name}"
409
+ return nil
410
+ elsif resource_pools.size > 1
411
+ print_red_alert "#{resource_pools.size} resource pools found by name #{name}"
412
+ rows = resource_pools.collect do |it|
413
+ {id: it['id'], name: it['name']}
414
+ end
415
+ puts as_pretty_table(rows, [:id, :name], {color:red})
416
+ return nil
417
+ else
418
+ return resource_pools[0]
419
+ end
420
+ end
421
+
422
+ # Resolve a cloud-owned vSphere cluster: a ComputeZonePool with type='Cluster'
423
+ # that belongs to the given cloud. This is distinct from a MTN Cloud managed
424
+ # cluster (ComputeServerGroup, resolved via ClustersInterface / /api/clusters).
425
+ #
426
+ # MORPH-17279: --cloud CLOUD --cluster CLUSTER must resolve CLUSTER within
427
+ # CLOUD's own resource pools, not the top-level managed-cluster namespace.
428
+ # `cloud` is the already-resolved cloud Hash (from find_cloud_by_name_or_id).
429
+ def find_resource_pool_cluster_by_name_or_id(cloud, val)
430
+ if val.to_s =~ /\A\d{1,}\Z/
431
+ return find_resource_pool_cluster_by_id(cloud, val)
432
+ else
433
+ return find_resource_pool_cluster_by_name(cloud, val)
434
+ end
435
+ end
436
+
437
+ def find_resource_pool_cluster_by_id(cloud, id)
438
+ begin
439
+ # Scoped to the cloud so the server itself verifies pool ownership --
440
+ # ZoneResourcePoolsController#show 404s when the pool's zone does not
441
+ # match the requested cloud.
442
+ json_response = resource_pools_interface.get(cloud['id'], id.to_i)
443
+ rescue RestClient::Exception => e
444
+ if e.response && e.response.code == 404
445
+ print_red_alert "Cluster not found by id #{id} in cloud '#{cloud['name']}'"
446
+ return nil
447
+ else
448
+ raise e
449
+ end
450
+ end
451
+ resource_pool = json_response['resourcePool']
452
+ if resource_pool.nil?
453
+ print_red_alert "Cluster not found by id #{id} in cloud '#{cloud['name']}'"
454
+ return nil
455
+ end
456
+ if resource_pool['type'].to_s != 'Cluster'
457
+ print_red_alert "Resource pool #{id} in cloud '#{cloud['name']}' is a '#{resource_pool['type'] || 'unknown'}' resource pool, not a Cluster"
458
+ return nil
459
+ end
460
+ return resource_pool
461
+ end
462
+
463
+ def find_resource_pool_cluster_by_name(cloud, name)
464
+ json_response = resource_pools_interface.list(cloud['id'], {name: name.to_s, type: 'Cluster'})
465
+ # The cloud-scoped resource-pools endpoint returns a pool *tree*, backfilling
466
+ # ancestor folder pools so the hierarchy renders correctly. Ancestors do not
467
+ # satisfy our name/type filter, so re-filter here rather than trusting the
468
+ # raw result size for ambiguity detection.
469
+ resource_pools = (json_response['resourcePools'] || []).select do |it|
470
+ it['type'].to_s == 'Cluster' && (it['name'].to_s == name.to_s || it['displayName'].to_s == name.to_s)
471
+ end
472
+ if resource_pools.empty?
473
+ print_red_alert "Cluster not found by name '#{name}' in cloud '#{cloud['name']}'.\n" \
474
+ "To look up an MTN Cloud managed cluster instead, use --cluster '#{name}' without --cloud."
475
+ return nil
476
+ elsif resource_pools.size > 1
477
+ print_red_alert "#{resource_pools.size} clusters found by name '#{name}' in cloud '#{cloud['name']}'. Use a numeric cluster id instead."
478
+ rows = resource_pools.collect do |it|
479
+ {id: it['id'], name: it['name']}
480
+ end
481
+ puts as_pretty_table(rows, [:id, :name], {color:red})
482
+ return nil
483
+ else
484
+ return resource_pools[0]
485
+ end
486
+ end
487
+
488
+ def find_managed_cluster_by_name_or_id(val, report_not_found=true)
489
+ cluster = nil
490
+ if val.to_s =~ /\A\d{1,}\Z/
491
+ begin
492
+ cluster = clusters_interface.get(val.to_i)['cluster']
493
+ rescue RestClient::Exception => e
494
+ raise e unless e.response && e.response.code == 404
495
+ end
496
+ else
497
+ clusters = clusters_interface.list({name: val})['clusters'] || []
498
+ if clusters.size > 1
499
+ print_red_alert "#{clusters.size} managed clusters found by name '#{val}'. Use a numeric cluster id instead."
500
+ rows = clusters.collect {|it| {id: it['id'], name: it['name']} }
501
+ puts as_pretty_table(rows, [:id, :name], {color:red})
502
+ return nil
503
+ end
504
+ cluster = clusters[0]
505
+ end
506
+ if cluster.nil? && report_not_found
507
+ print_red_alert "Managed cluster not found by name or id '#{val}'.\n" \
508
+ "If '#{val}' is a vSphere cluster owned by a cloud, use --cloud CLOUD --cluster #{val} instead."
509
+ end
510
+ cluster
511
+ end
512
+
513
+ def find_cluster_list_scope_by_name_or_id(val)
514
+ if val.to_s =~ /\A\d{1,}\Z/
515
+ cluster = find_managed_cluster_by_name_or_id(val)
516
+ return cluster ? {type: :managed_cluster, cluster: cluster} : nil
517
+ end
518
+
519
+ managed_clusters = clusters_interface.list({name: val})['clusters'] || []
520
+ if managed_clusters.size > 1
521
+ print_red_alert "#{managed_clusters.size} managed clusters found by name '#{val}'. Use a numeric cluster id instead."
522
+ rows = managed_clusters.collect {|it| {id: it['id'], name: it['name']} }
523
+ puts as_pretty_table(rows, [:id, :name], {color:red})
524
+ return nil
525
+ elsif managed_clusters.size == 1
526
+ return {type: :managed_cluster, cluster: managed_clusters[0]}
527
+ end
528
+
529
+ json_response = resource_pools_interface.list_without_cloud({name: val.to_s, type: 'Cluster', max: 1000})
530
+ resource_pools = (json_response['resourcePools'] || []).select do |it|
531
+ it['type'].to_s == 'Cluster' && (it['name'].to_s == val.to_s || it['displayName'].to_s == val.to_s)
532
+ end
533
+ if resource_pools.empty?
534
+ print_red_alert "No managed or vSphere cluster found by name '#{val}'."
535
+ return nil
536
+ elsif resource_pools.size > 1
537
+ print_red_alert "#{resource_pools.size} vSphere clusters found by name '#{val}'. Use --cloud CLOUD --cluster #{val} to disambiguate."
538
+ rows = resource_pools.collect do |it|
539
+ {id: it['id'], name: it['name'], cloud: it['zone'] && it['zone']['name']}
540
+ end
541
+ puts as_pretty_table(rows, [:id, :name, :cloud], {color:red})
542
+ return nil
543
+ end
544
+
545
+ resource_pool = resource_pools[0]
546
+ cloud = resource_pool['zone']
547
+ if cloud.nil? || cloud['id'].nil?
548
+ print_red_alert "vSphere cluster '#{val}' does not include its owning cloud."
549
+ return nil
550
+ end
551
+ {type: :cloud_pool, cloud: cloud, pool: resource_pool}
552
+ end
553
+
554
+ def find_resource_pool_group_by_name_or_id(val)
555
+ if val.to_s =~ /\A\d{1,}\Z/
556
+ return find_resource_pool_group_by_id(val)
557
+ else
558
+ return find_resource_pool_group_by_name(val)
559
+ end
560
+ end
561
+
562
+ def find_resource_pool_group_by_id(id)
563
+ begin
564
+ json_response = resource_pool_groups_interface.get(id.to_i)
565
+ return json_response['resourcePoolGroup']
566
+ rescue RestClient::Exception => e
567
+ if e.response && e.response.code == 404
568
+ print_red_alert "Resource Pool Group not found by id #{id}"
569
+ return nil
570
+ else
571
+ raise e
572
+ end
573
+ end
574
+ end
575
+
576
+ def find_resource_pool_group_by_name(name)
577
+ json_response = resource_pool_groups_interface.list({name: name.to_s})
578
+ resource_pool_groups = json_response['resourcePoolGroups']
579
+ if resource_pool_groups.empty?
580
+ print_red_alert "Resource Pool Group not found by name #{name}"
581
+ return nil
582
+ elsif resource_pool_groups.size > 1
583
+ print_red_alert "#{resource_pool_groups.size} resource pool groups found by name #{name}"
584
+ rows = resource_pool_groups.collect do |it|
585
+ {id: it['id'], name: it['name']}
586
+ end
587
+ puts as_pretty_table(rows, [:id, :name], {color:red})
588
+ return nil
589
+ else
590
+ return resource_pool_groups[0]
591
+ end
592
+ end
593
+
594
+ def prompt_for_network(network_id, options={}, required=true, field_name='network', field_label='Network')
595
+ # Prompt for a Network, text input that searches by name or id
596
+ network = nil
597
+ still_prompting = true
598
+ while still_prompting do
599
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => field_name, 'type' => 'text', 'fieldLabel' => field_label, 'required' => required, 'description' => 'Network name or ID.'}], network_id ? {(field_name) => network_id} : {})
600
+ network_id = v_prompt['network']
601
+ begin
602
+ network = find_network_by_name_or_id(network_id)
603
+ rescue SystemExit => cmdexit
604
+ end
605
+ if options[:no_prompt]
606
+ still_prompting = false
607
+ else
608
+ still_prompting = network ? false : true
609
+ end
610
+ if still_prompting
611
+ network_id = nil
612
+ end
613
+ end
614
+ return {success:!!network, network: network}
615
+ end
616
+
617
+ def prompt_for_networks(params, options={}, api_client=nil, api_params={})
618
+ # Networks
619
+ network_list = nil
620
+ network_ids = nil
621
+ still_prompting = true
622
+ if params['networks'].nil?
623
+ still_prompting = true
624
+ while still_prompting do
625
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'networks', 'type' => 'text', 'fieldLabel' => 'Networks', 'required' => false, 'description' => 'Networks to include, comma separated list of names or IDs.'}], options[:options])
626
+ unless v_prompt['networks'].to_s.empty?
627
+ network_list = v_prompt['networks'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
628
+ end
629
+ network_ids = []
630
+ bad_ids = []
631
+ if network_list && network_list.size > 0
632
+ network_list.each do |it|
633
+ found_network = nil
634
+ begin
635
+ found_network = find_network_by_name_or_id(it)
636
+ rescue SystemExit => cmdexit
637
+ end
638
+ if found_network
639
+ network_ids << found_network['id']
640
+ else
641
+ bad_ids << it
642
+ end
643
+ end
644
+ end
645
+ still_prompting = bad_ids.empty? ? false : true
646
+ end
647
+ else
648
+ network_list = params['networks']
649
+ still_prompting = false
650
+ network_ids = []
651
+ bad_ids = []
652
+ if network_list && network_list.size > 0
653
+ network_list.each do |it|
654
+ found_network = nil
655
+ begin
656
+ found_network = find_network_by_name_or_id(it)
657
+ rescue SystemExit => cmdexit
658
+ end
659
+ if found_network
660
+ network_ids << found_network['id']
661
+ else
662
+ bad_ids << it
663
+ end
664
+ end
665
+ end
666
+ if !bad_ids.empty?
667
+ return {success:false, msg:"Networks not found: #{bad_ids}"}
668
+ end
669
+ end
670
+ return {success:true, data: network_ids}
671
+ end
672
+
673
+ def prompt_for_subnets(params, options={}, api_client=nil, api_params={})
674
+ # todo: make this a generic method now please.
675
+ # Subnets
676
+ record_list = nil
677
+ record_ids = nil
678
+ still_prompting = true
679
+ if params['subnets'].nil?
680
+ still_prompting = true
681
+ while still_prompting do
682
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'subnets', 'type' => 'text', 'fieldLabel' => 'Subnets', 'required' => false, 'description' => 'Subnets to include, comma separated list of names or IDs.'}], options[:options])
683
+ unless v_prompt['subnets'].to_s.empty?
684
+ record_list = v_prompt['subnets'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
685
+ end
686
+ record_ids = []
687
+ bad_ids = []
688
+ if record_list && record_list.size > 0
689
+ record_list.each do |it|
690
+ found_record = nil
691
+ begin
692
+ found_record = find_subnet_by_name_or_id(it)
693
+ rescue SystemExit => cmdexit
694
+ end
695
+ if found_record
696
+ record_ids << found_record['id']
697
+ else
698
+ bad_ids << it
699
+ end
700
+ end
701
+ end
702
+ still_prompting = bad_ids.empty? ? false : true
703
+ end
704
+ else
705
+ record_list = params['subnets']
706
+ still_prompting = false
707
+ record_ids = []
708
+ bad_ids = []
709
+ if record_list && record_list.size > 0
710
+ record_list.each do |it|
711
+ found_subnet = nil
712
+ begin
713
+ found_subnet = find_subnet_by_name_or_id(it)
714
+ rescue SystemExit => cmdexit
715
+ end
716
+ if found_subnet
717
+ record_ids << found_subnet['id']
718
+ else
719
+ bad_ids << it
720
+ end
721
+ end
722
+ end
723
+ if !bad_ids.empty?
724
+ return {success:false, msg:"Subnets not found: #{bad_ids}"}
725
+ end
726
+ end
727
+ return {success:true, data: record_ids}
728
+ end
729
+
730
+ def prompt_for_pools(params, options={}, api_client=nil, api_params={})
731
+ # Pools
732
+ pool_list = nil
733
+ pool_ids = nil
734
+ still_prompting = true
735
+ if params['pools'].nil?
736
+ still_prompting = true
737
+ while still_prompting do
738
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'pools', 'type' => 'text', 'fieldLabel' => 'Pools', 'required' => false, 'description' => 'Pools to include, comma separated list of names or IDs.'}], options[:options])
739
+ unless v_prompt['pools'].to_s.empty?
740
+ pool_list = v_prompt['pools'].split(",").collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
741
+ end
742
+ pool_ids = []
743
+ bad_ids = []
744
+ if pool_list && pool_list.size > 0
745
+ pool_list.each do |it|
746
+ found_pool = nil
747
+ begin
748
+ found_pool = find_resource_pool_by_name_or_id(it)
749
+ rescue SystemExit => cmdexit
750
+ end
751
+ if found_pool
752
+ pool_ids << found_pool['id']
753
+ else
754
+ bad_ids << it
755
+ end
756
+ end
757
+ end
758
+ still_prompting = bad_ids.empty? ? false : true
759
+ end
760
+ else
761
+ pool_list = params['pools']
762
+ still_prompting = false
763
+ pool_ids = []
764
+ bad_ids = []
765
+ if pool_list && pool_list.size > 0
766
+ pool_list.each do |it|
767
+ found_pool = nil
768
+ begin
769
+ found_pool = find_resource_pool_by_name_or_id(it)
770
+ rescue SystemExit => cmdexit
771
+ end
772
+ if found_pool
773
+ pool_ids << found_pool['id']
774
+ else
775
+ bad_ids << it
776
+ end
777
+ end
778
+ end
779
+ if !bad_ids.empty?
780
+ return {success:false, msg:"Pools not found: #{bad_ids}"}
781
+ end
782
+ end
783
+ return {success:true, data: pool_ids}
784
+ end
785
+
786
+ def network_pool_server_list_column_definitions(options)
787
+ {
788
+ "ID" => 'id',
789
+ "Name" => lambda {|it| it['name'] },
790
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
791
+ "URL" => lambda {|it| it['serviceUrl'] },
792
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
793
+ "Status" => lambda {|it| format_network_pool_server_status(it) },
794
+ "Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
795
+ "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
796
+ }
797
+ end
798
+
799
+ def network_pool_server_column_definitions(options)
800
+ {
801
+ "ID" => 'id',
802
+ "Name" => lambda {|it| it['name'] },
803
+ "Type" => lambda {|it| it['type'] ? it['type']['name'] : '' },
804
+ "URL" => lambda {|it| it['serviceUrl'] },
805
+ "App ID" => lambda {|it| it['config'] ? it['config']['appId'] : nil },
806
+ "Credentials" => lambda {|it| it['credential'] ? (it['credential']['type'] == 'local' ? '(Local)' : it['credential']['name']) : nil },
807
+ "Username" => lambda {|it| it['serviceUsername'] },
808
+ "Password" => lambda {|it| it['servicePassword'] },
809
+ "Throttle Rate" => lambda {|it| it['serviceThrottleRate'] },
810
+ "Disable SSL SNI" => lambda {|it| format_boolean it['ignoreSsl'] },
811
+ "Inventory Existing" => lambda {|it| format_boolean(it['config'] ? it['config']['inventoryExisting'] : nil) },
812
+ "IP Mode" => lambda {|it| it['serviceMode'] },
813
+ "Network Filter" => lambda {|it| it['networkFilter'] },
814
+ "Zone Filter" => lambda {|it| it['zoneFilter'] },
815
+ "Tenant Match" => lambda {|it| it['tenantMatch'] },
816
+ "Extra Attributes" => lambda {|it| it['config'] ? it['config']['extraAttributes'] : nil },
817
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
818
+ "Status" => lambda {|it| format_network_pool_server_status(it) },
819
+ "Date Created" => lambda {|it| format_local_dt(it['dateCreated']) },
820
+ "Last Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
821
+ }
822
+ end
823
+
824
+ def format_network_pool_server_status(network_pool_server, return_color=cyan)
825
+ out = ""
826
+ status_string = network_pool_server['status']
827
+ if status_string.nil? || status_string.empty? || status_string == "unknown"
828
+ out << "#{white}UNKNOWN#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
829
+ # elsif network_pool_server['enabled'] == false
830
+ # out << "#{red}DISABLED#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
831
+ elsif status_string == 'ok'
832
+ out << "#{green}#{status_string.upcase}#{return_color}"
833
+ elsif status_string == 'error' || status_string == 'offline'
834
+ out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{network_pool_server['statusMessage'] ? "#{return_color} - #{network_pool_server['statusMessage']}" : ''}#{return_color}"
835
+ else
836
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
837
+ end
838
+ out
839
+ end
840
+
841
+ def network_pool_server_type_list_column_definitions(options)
842
+ {
843
+ "ID" => 'id',
844
+ "Name" => 'name',
845
+ "Code" => 'code',
846
+ }
847
+ end
848
+
849
+ def network_pool_server_type_column_definitions(options)
850
+ {
851
+ "ID" => 'id',
852
+ "Name" => 'name',
853
+ "Code" => 'code',
854
+ # "Integration Code" => 'integrationCode',
855
+ "Description" => 'description',
856
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
857
+ "Selectable" => lambda {|it| format_boolean(it['selectable']) },
858
+ "Plugin" => lambda {|it| format_boolean(it['isPlugin']) },
859
+ "Embedded" => lambda {|it| format_boolean(it['isEmbedded']) },
860
+ }
861
+ end
862
+
863
+ def find_network_server_type_by_name_or_id(val)
864
+ if val.to_s =~ /\A\d{1,}\Z/
865
+ return find_network_server_type_by_id(val)
866
+ else
867
+ # always find by code too
868
+ #return find_network_server_type_by_name(val)
869
+ return find_network_server_type_by_name_or_code(val)
870
+ end
871
+ end
872
+
873
+ def find_network_server_type_by_id(id)
874
+ begin
875
+ json_response = @network_server_types_interface.get(id.to_i)
876
+ return json_response['networkServerType']
877
+ rescue RestClient::Exception => e
878
+ if e.response && e.response.code == 404
879
+ print_red_alert "Network Server Type not found by id #{id}"
880
+ return nil
881
+ else
882
+ raise e
883
+ end
884
+ end
885
+ end
886
+
887
+ def find_network_server_type_by_name(name)
888
+ json_response = @network_server_types_interface.list({name: name.to_s})
889
+ network_server_types = json_response['networkServerTypes']
890
+ if network_server_types.empty?
891
+ print_red_alert "Network Server Type not found by name #{name}"
892
+ return nil
893
+ elsif network_server_types.size > 1
894
+ print_red_alert "#{network_server_types.size} network server types found by name #{name}"
895
+ # print_networks_table(networks, {color: red})
896
+ rows = network_server_types.collect do |it|
897
+ {id: it['id'], name: it['name']}
898
+ end
899
+ puts as_pretty_table(rows, [:id, :code, :name], {color:red})
900
+ return nil
901
+ else
902
+ return network_server_types[0]
903
+ end
904
+ end
905
+
906
+ def find_network_server_type_by_name_or_code(name)
907
+ json_response = @network_server_types_interface.list({phrase: name.to_s, max: 100})
908
+ downcase_name = name.to_s.downcase
909
+ network_server_types = json_response['networkServerTypes'].select { |it|
910
+ it['code'].to_s.downcase == downcase_name || it['name'].to_s.downcase == downcase_name
911
+ }
912
+ if network_server_types.empty?
913
+ print_red_alert "Network Server Type not found by name or code '#{name}'"
914
+ return nil
915
+ elsif network_server_types.size > 1
916
+ print_red_alert "#{network_server_types.size} network server types found with name or code '#{name}'"
917
+ # print_networks_table(networks, {color: red})
918
+ rows = network_server_types.collect do |it|
919
+ {id: it['id'], name: it['name']}
920
+ end
921
+ puts as_pretty_table(rows, [:id, :code, :name], {color:red})
922
+ return nil
923
+ else
924
+ return network_server_types[0]
925
+ end
926
+ end
927
+
928
+ def network_server_type_list_column_definitions(options)
929
+ {
930
+ "ID" => 'id',
931
+ "Name" => 'name',
932
+ "Code" => 'code',
933
+ "Description" => 'description',
934
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) }
935
+ }
936
+ end
937
+
938
+ def network_server_type_column_definitions(options)
939
+ {
940
+ "ID" => 'id',
941
+ "Name" => 'name',
942
+ "Code" => 'code',
943
+ "Description" => 'description',
944
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
945
+ "Selectable" => lambda {|it| format_boolean(it['selectable']) },
946
+ "Creatable" => lambda {|it| format_boolean(it['creatable']) },
947
+ "Plugin" => lambda {|it| format_boolean(it['isPlugin']) },
948
+ "Embedded" => lambda {|it| format_boolean(it['isEmbedded']) },
949
+ #"Integration Code" => lambda {|it| it['integrationCode'] },
950
+ "Networks" => lambda {|it| format_boolean(it['hasNetworks']) },
951
+ "Gateways" => lambda {|it| format_boolean(it['hasGateways']) },
952
+ "DHCP Servers" => lambda {|it| format_boolean(it['hasDhcpServers']) },
953
+ "DHCP Relays" => lambda {|it| format_boolean(it['hasDhcpRelays']) },
954
+ # "Route Tables" => lambda {|it| format_boolean(it['hasRouteTables']) },
955
+ "Routers" => lambda {|it| format_boolean(it['hasRouters']) },
956
+ "Switches" => lambda {|it| format_boolean(it['hasSwitches']) },
957
+ "Firewall" => lambda {|it| format_boolean(it['hasFirewall']) },
958
+ "Security Groups" => lambda {|it| format_boolean(it['hasSecurityGroups']) },
959
+ "Load Balancers" => lambda {|it| format_boolean(it['hasLoadBalancers']) },
960
+ "Floating Ips" => lambda {|it| format_boolean it['hasFloatingIps']},
961
+ # "Security Code" => lambda {|it| it['securityCode'] },
962
+ # "User Visible" => lambda {|it| format_boolean(it['userVisible']) },
963
+ }
964
+ end
965
+
966
+ end