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,901 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::LibraryClusterLayoutsCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::LibraryHelper
6
+
7
+ set_command_name :'library-cluster-layouts'
8
+
9
+ register_subcommands :list, :get, :add, :update, :remove, :clone
10
+
11
+ def initialize()
12
+ end
13
+
14
+ def connect(opts)
15
+ @api_client = establish_remote_appliance_connection(opts)
16
+ @library_cluster_layouts_interface = @api_client.library_cluster_layouts
17
+ @library_container_types_interface = @api_client.library_container_types
18
+ @clusters_interface = @api_client.clusters
19
+ @provision_types_interface = @api_client.provision_types
20
+ @options_types_interface = @api_client.option_types
21
+ @task_sets_interface = @api_client.task_sets
22
+ end
23
+
24
+ def handle(args)
25
+ handle_subcommand(args)
26
+ end
27
+
28
+ def list(args)
29
+ options = {}
30
+ params = {}
31
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
32
+ opts.banner = subcommand_usage()
33
+ opts.on('--technology VALUE', String, "Filter by technology") do |val|
34
+ params['provisionType'] = val
35
+ end
36
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
37
+ add_query_parameter(params, 'labels', parse_labels(val))
38
+ end
39
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
40
+ add_query_parameter(params, 'allLabels', parse_labels(val))
41
+ end
42
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
43
+ opts.footer = "List cluster layouts."
44
+ end
45
+ optparse.parse!(args)
46
+ # verify_args!(args:args, optparse:optparse, count:0)
47
+ if args.count > 0
48
+ options[:phrase] = args.join(" ")
49
+ end
50
+ connect(options)
51
+ begin
52
+ # construct payload
53
+ params.merge!(parse_list_options(options))
54
+ @library_cluster_layouts_interface.setopts(options)
55
+ if options[:dry_run]
56
+ print_dry_run @library_cluster_layouts_interface.dry.list(params)
57
+ return
58
+ end
59
+ # do it
60
+ json_response = @library_cluster_layouts_interface.list(params)
61
+ # print and/or return result
62
+ # return 0 if options[:quiet]
63
+ if options[:json]
64
+ puts as_json(json_response, options, "layouts")
65
+ return 0
66
+ elsif options[:csv]
67
+ puts records_as_csv(json_response['layouts'], options)
68
+ return 0
69
+ elsif options[:yaml]
70
+ puts as_yaml(json_response, options, "layouts")
71
+ return 0
72
+ end
73
+ layouts = json_response['layouts']
74
+ title = "Library - Cluster Layout"
75
+ subtitles = parse_list_subtitles(options)
76
+ print_h1 title, subtitles
77
+ if layouts.empty?
78
+ print cyan,"No cluster layouts found.",reset,"\n"
79
+ else
80
+ rows = layouts.collect do |layout|
81
+ {
82
+ id: layout['id'],
83
+ name: layout['name'],
84
+ cloud_type: layout_cloud_type(layout),
85
+ version: layout['computeVersion'],
86
+ description: layout['description'],
87
+ labels: format_list(layout['labels'], '', 3)
88
+ }
89
+ end
90
+ print as_pretty_table(rows, [:id, :name, :cloud_type, :version, :description, :labels], options)
91
+ print_results_pagination(json_response, {:label => "node type", :n_label => "node types"})
92
+ end
93
+ print reset,"\n"
94
+ rescue RestClient::Exception => e
95
+ print_rest_exception(e, options)
96
+ return 1
97
+ end
98
+ end
99
+
100
+ def get(args)
101
+ options = {}
102
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
103
+ opts.banner = subcommand_usage("[layout]")
104
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
105
+ opts.footer = "Display cluster layout details." + "\n" +
106
+ "[layout] is required. This is the name or id of a cluster layout."
107
+ end
108
+ optparse.parse!(args)
109
+ if args.count < 1
110
+ puts optparse
111
+ return 1
112
+ end
113
+ connect(options)
114
+ id_list = parse_id_list(args)
115
+ id_list.each do |id|
116
+
117
+ end
118
+ return run_command_for_each_arg(id_list) do |arg|
119
+ _get(arg, options)
120
+ end
121
+ end
122
+
123
+ def _get(id, options)
124
+ begin
125
+ @library_cluster_layouts_interface.setopts(options)
126
+ if options[:dry_run]
127
+ if arg.to_s =~ /\A\d{1,}\Z/
128
+ print_dry_run @library_cluster_layouts_interface.dry.get(arg.to_i)
129
+ else
130
+ print_dry_run @library_container_types_interface.dry.list({name:arg})
131
+ end
132
+ return
133
+ end
134
+ layout = find_layout_by_name_or_id(id)
135
+ if layout.nil?
136
+ return 1
137
+ end
138
+
139
+ json_response = {'layout' => layout}
140
+
141
+ if options[:json]
142
+ puts as_json(json_response, options, "layout")
143
+ return 0
144
+ elsif options[:yaml]
145
+ puts as_yaml(json_response, options, "layout")
146
+ return 0
147
+ elsif options[:csv]
148
+ puts records_as_csv([json_response['layout']], options)
149
+ return 0
150
+ end
151
+
152
+ print_h1 "Cluster Layout Details"
153
+ print cyan
154
+ description_cols = {
155
+ "ID" => lambda {|it| it['id'] },
156
+ "Name" => lambda {|it| it['name'] },
157
+ "Version" => lambda {|it| it['computeVersion']},
158
+ # "Type" => lambda {|it| it['type'] ? it['type']['name'] : nil},
159
+ "Creatable" => lambda {|it| format_boolean(it['creatable'])},
160
+ "Cloud Type" => lambda {|it| layout_cloud_type(it)},
161
+ "Cluster Type" => lambda {|it| it['groupType'] ? it['groupType']['name'] : nil},
162
+ "Technology" => lambda {|it| it['provisionType'] ? it['provisionType']['code'] : nil},
163
+ "Labels" => lambda {|it| format_list(it['labels'], '') },
164
+ "Minimum Memory" => lambda {|it| printable_byte_size(it['memoryRequirement'])},
165
+ "Workflow" => lambda {|it| it['taskSets'] && it['taskSets'].count > 0 ? it['taskSets'][0]['name'] : nil},
166
+ "Description" => lambda {|it| it['description']},
167
+ "Horizontal Scaling" => lambda {|it| format_boolean(it['hasAutoScale'])},
168
+ "Install Docker" => lambda {|it| it['installContainerRuntime'].nil? ? nil : format_boolean(it['installContainerRuntime'])},
169
+ }
170
+
171
+ print_description_list(description_cols, layout)
172
+
173
+ if (layout['environmentVariables'] || []).count > 0
174
+ rows = layout['environmentVariables'].collect do |evar|
175
+ {
176
+ name: evar['name'],
177
+ value: evar['defaultValue'],
178
+ masked: format_boolean(evar['masked']),
179
+ label: format_boolean(evar['export'])
180
+ }
181
+ end
182
+ print_h2 "Environment Variables"
183
+ puts as_pretty_table(rows, [:name, :value, :masked, :label])
184
+ end
185
+
186
+ if (layout['optionTypes'] || []).count > 0
187
+ rows = layout['optionTypes'].collect do |opt|
188
+ {
189
+ label: opt['fieldLabel'],
190
+ type: opt['type']
191
+ }
192
+ end
193
+ print_h2 "Option Types"
194
+ puts as_pretty_table(rows, [:label, :type])
195
+ end
196
+
197
+ ['master', 'worker'].each do |node_type|
198
+ nodes = layout['computeServers'].reject {|it| it['nodeType'] != node_type}.collect do |server|
199
+ container = server['containerType']
200
+ {
201
+ id: container['id'],
202
+ name: container['name'],
203
+ short_name: container['shortName'],
204
+ version: container['containerVersion'],
205
+ category: container['category'],
206
+ count: server['nodeCount'],
207
+ priority: server['priorityOrder']
208
+ }
209
+ end
210
+
211
+ if nodes.count > 0
212
+ print_h2 "#{node_type.capitalize} Nodes"
213
+ puts as_pretty_table(nodes, [:id, :name, :short_name, :version, :category, :count, :priority])
214
+ end
215
+ end
216
+ print reset,"\n"
217
+ rescue RestClient::Exception => e
218
+ print_rest_exception(e, options)
219
+ return 1
220
+ end
221
+ end
222
+
223
+ def add(args)
224
+ options = {}
225
+ params = {}
226
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
227
+ opts.banner = subcommand_usage("[name] [options]")
228
+ opts.on('-n', '--name VALUE', String, "Name for this cluster layout") do |val|
229
+ params['name'] = val
230
+ end
231
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
232
+ params['labels'] = parse_labels(val)
233
+ end
234
+ opts.on('-D', '--description VALUE', String, "Description") do |val|
235
+ params['description'] = val
236
+ end
237
+ opts.on('-v', '--version VALUE', String, "Version") do |val|
238
+ params['computeVersion'] = val
239
+ end
240
+ opts.on('-c', '--creatable [on|off]', String, "Can be used to enable / disable creatable layout. Default is on") do |val|
241
+ params['creatable'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
242
+ end
243
+ opts.on('-g', '--cluster-type CODE', String, "Cluster type. This is the cluster type code.") do |val|
244
+ options[:clusterTypeCode] = val
245
+ end
246
+ opts.on('-t', '--technology CODE', String, "Technology. This is the provision type code.") do |val|
247
+ options[:provisionTypeCode] = val
248
+ end
249
+ opts.on('-m', '--min-memory NUMBER', String, "Min memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
250
+ bytes = parse_bytes_param(val, '--min-memory', 'MB')
251
+ params['memoryRequirement'] = bytes[:bytes]
252
+ end
253
+ opts.on('-w', '--workflow ID', String, "Workflow") do |val|
254
+ options[:taskSetId] = val.to_i
255
+ end
256
+ opts.on('-s', '--auto-scale [on|off]', String, "Can be used to enable / disable horizontal scaling. Default is on") do |val|
257
+ params['hasAutoScale'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
258
+ end
259
+ opts.on('--install-docker [on|off]', String, "Install Docker container runtime. Default is off.") do |val|
260
+ params['installContainerRuntime'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
261
+ end
262
+ opts.on('--install-container-runtime [on|off]', String, "Install Docker container runtime. Default is off.") do |val|
263
+ params['installContainerRuntime'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
264
+ end
265
+ opts.add_hidden_option('--install-container-runtime')
266
+ opts.on('--evars-json JSON', String, 'Environment variables JSON: {"name":"Foo", "value":"Bar", "masked":true, "export":true}' ) do |val|
267
+ begin
268
+ evars = JSON.parse(val.to_s)
269
+ params['environmentVariables'] = evars.kind_of?(Array) ? evars : [evars]
270
+ rescue JSON::ParserError => e
271
+ print_red_alert "Unable to parse evars JSON"
272
+ exit 1
273
+ end
274
+ end
275
+ opts.on('-e', '--evars LIST', Array, "Environment variables list. Comma delimited list of name=value pairs") do |val|
276
+ params['environmentVariables'] = val.collect do |nv|
277
+ parts = nv.split('=')
278
+ {'name' => parts[0].strip, 'value' => (parts.count > 1 ? parts[1].strip : '')}
279
+ end
280
+ end
281
+ opts.on('-o', '--option-types LIST', Array, "Option types, comma separated list of option type IDs") do |val|
282
+ options[:optionTypes] = val
283
+ end
284
+ opts.on('--masters LIST', Array, "List of master. Comma separated container types IDs in format id[/count/priority], ex: 100,101/3/0") do |val|
285
+ options[:masters] = val
286
+ end
287
+ opts.on('--workers LIST', Array, "List of workers. Comma separated container types IDs in format id[/count/priority], ex: 100,101/3/1") do |val|
288
+ options[:workers] = val
289
+ end
290
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
291
+ opts.footer = "Create a cluster layout."
292
+ end
293
+ optparse.parse!(args)
294
+ connect(options)
295
+ if args.count > 1
296
+ print_error MtnCloud::Terminal.angry_prompt
297
+ puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
298
+ return 1
299
+ end
300
+ if args[0]
301
+ params['name'] = args[0]
302
+ end
303
+ begin
304
+ if options[:payload]
305
+ payload = options[:payload]
306
+ else
307
+ # support the old -O OPTION switch
308
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
309
+
310
+ # prompt for options
311
+ if params['name'].nil?
312
+ params['name'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true}], options[:options], @api_client,{})['name']
313
+ end
314
+
315
+ # version
316
+ if params['computeVersion'].nil?
317
+ params['computeVersion'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'computeVersion', 'type' => 'text', 'fieldLabel' => 'Version', 'required' => true}], options[:options], @api_client,{})['computeVersion']
318
+ end
319
+
320
+ # description
321
+ if params['description'].nil?
322
+ params['description'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false}], options[:options], @api_client,{})['description']
323
+ end
324
+
325
+ # creatable
326
+ if params['creatable'].nil?
327
+ params['creatable'] = MtnCloud::Cli::OptionTypes.confirm("Creatable?", {:default => true}) == true
328
+ end
329
+
330
+ # cluster type
331
+ if options[:clusterTypeCode]
332
+ cluster_type = find_cluster_type_by_code(options[:clusterTypeCode])
333
+ if cluster_type.nil?
334
+ print_red_alert "Cluster type #{options[:clusterTypeCode]} not found"
335
+ exit 1
336
+ end
337
+ else
338
+ cluster_type_options = cluster_types.collect {|type| {'name' => type['name'], 'value' => type['code']}}
339
+ cluster_type_code = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'groupType', 'type' => 'select', 'fieldLabel' => 'Cluster Type', 'required' => true, 'selectOptions' => cluster_type_options}], options[:options], @api_client,{}, nil, true)['groupType']
340
+ cluster_type = cluster_types.find {|type| type['code'] == cluster_type_code}
341
+ end
342
+
343
+ params['groupType'] = {'id' => cluster_type['id']}
344
+
345
+ # technology customSupported, createServer
346
+ if options[:provisionTypeCode]
347
+ provision_type = find_provision_type_by_code(options[:provisionTypeCode])
348
+ if provision_type.nil?
349
+ print_red_alert "Technology #{options[:provisionTypeCode]} not found"
350
+ exit 1
351
+ end
352
+ else
353
+ provision_type_options = provision_types.collect {|type| {'name' => type['name'], 'value' => type['code']}}
354
+ provision_type_code = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'provisionType', 'type' => 'select', 'fieldLabel' => 'Technology', 'required' => true, 'selectOptions' => provision_type_options}], options[:options], @api_client,{}, nil, true)['provisionType']
355
+ provision_type = provision_types.find {|type| type['code'] == provision_type_code}
356
+ end
357
+
358
+ params['provisionType'] = {'id' => provision_type['id']}
359
+
360
+ # min memory
361
+ if params['memoryRequirement'].nil?
362
+ memory = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'memoryRequirement', 'type' => 'text', 'fieldLabel' => 'Minimum Memory (MB) [can use GB modifier]', 'required' => false, 'description' => 'Memory (MB)'}], options[:options], @api_client,{}, options[:no_prompt])['memoryRequirement']
363
+
364
+ if memory
365
+ bytes = parse_bytes_param(memory, 'minimum memory', 'MB')
366
+ params['memoryRequirement'] = bytes[:bytes]
367
+ end
368
+ end
369
+
370
+ # workflow
371
+ if options[:taskSetId]
372
+ task_set = @task_sets_interface.get(options[:taskSetId])['taskSet']
373
+
374
+ if !task_set
375
+ print_red_alert "Workflow #{options[:taskSetId]} not found"
376
+ exit 1
377
+ end
378
+ params['taskSets'] = [{'id' => task_set['id']}]
379
+ else
380
+ task_set_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'taskSets', 'fieldLabel' => 'Workflow', 'type' => 'select', 'required' => false, 'optionSource' => 'taskSets'}], options[:options], @api_client, {})['taskSets']
381
+
382
+ if task_set_id
383
+ params['taskSets'] = [{'id' => task_set_id.to_i}]
384
+ end
385
+ end
386
+
387
+ # auto scale
388
+ if params['hasAutoScale'].nil?
389
+ params['hasAutoScale'] = MtnCloud::Cli::OptionTypes.confirm("Enable scaling?", {:default => false}) == true
390
+ end
391
+
392
+ # install docker
393
+ if params['installContainerRuntime'].nil?
394
+ params['installContainerRuntime'] = MtnCloud::Cli::OptionTypes.confirm("Install Docker?", {:default => false}) == true
395
+ end
396
+
397
+ # evars?
398
+ if params['environmentVariables'].nil?
399
+ evars = []
400
+ while MtnCloud::Cli::OptionTypes.confirm("Add #{evars.empty? ? '' : 'another '}environment variable?", {:default => false}) do
401
+ evars << prompt_evar(options)
402
+ end
403
+ params['environmentVariables'] = evars
404
+ end
405
+
406
+ # option types
407
+ if options[:optionTypes]
408
+ option_types = []
409
+ options[:optionTypes].each do |option_type_id|
410
+ if @options_types_interface.get(option_type_id.to_i).nil?
411
+ print_red_alert "Option type #{option_type_id} not found"
412
+ exit 1
413
+ else
414
+ option_types << {'id' => option_type_id.to_i}
415
+ end
416
+ end
417
+ elsif !options[:no_prompt]
418
+ avail_type_options = @options_types_interface.list({'max' => 1000})['optionTypes'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
419
+ option_types = []
420
+ while !avail_type_options.empty? && MtnCloud::Cli::OptionTypes.confirm("Add #{option_types.empty? ? '' : 'another '}option type?", {:default => false}) do
421
+ option_type_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'optionType', 'type' => 'select', 'fieldLabel' => 'Option Type', 'selectOptions' => avail_type_options, 'required' => false}],options[:options],@api_client,{}, options[:no_prompt], true)['optionType']
422
+
423
+ if option_type_id
424
+ option_types << {'id' => option_type_id.to_i}
425
+ avail_type_options.reject! {|it| it['value'] == option_type_id}
426
+ else
427
+ break
428
+ end
429
+ end
430
+ end
431
+
432
+ params['optionTypes'] = option_types if option_types
433
+
434
+ # nodes
435
+ priority = 0
436
+ ['master', 'worker'].each do |node_type|
437
+ nodes = []
438
+ if cluster_type["has#{node_type.capitalize}s"]
439
+ if options["#{node_type}s".to_sym]
440
+ options["#{node_type}s".to_sym].each do |container_type_id|
441
+ node_count = 1
442
+ if container_type_id.include?('/')
443
+ parts = container_type_id.split('/')
444
+ container_type_id = parts[0]
445
+ node_count = parts[1].to_i if parts.count > 1
446
+ priority = parts[2].to_i if parts.count > 2
447
+ end
448
+
449
+ if @library_container_types_interface.get(nil, container_type_id.to_i).nil?
450
+ print_red_alert "Container type #{container_type_id} not found"
451
+ exit 1
452
+ else
453
+ nodes << {'nodeCount' => node_count, 'priorityOrder' => priority, 'containerType' => {'id' => container_type_id.to_i}}
454
+ end
455
+ end
456
+ else
457
+ avail_container_types = @library_container_types_interface.list(nil, {'technology' => provision_type['code'], 'max' => 1000})['containerTypes'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
458
+ while !avail_container_types.empty? && MtnCloud::Cli::OptionTypes.confirm("Add #{nodes.empty? ? '' : 'another '}#{node_type} node?", {:default => false}) do
459
+ container_type_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}ContainerType", 'type' => 'select', 'fieldLabel' => "#{node_type.capitalize} Node", 'selectOptions' => avail_container_types, 'required' => true}],options[:options],@api_client,{}, options[:no_prompt], true)["#{node_type}ContainerType"]
460
+ node_count = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}NodeCount", 'type' => 'number', 'fieldLabel' => "#{node_type.capitalize} Node Count", 'required' => true, 'defaultValue' => 1}], options[:options], @api_client, {}, options[:no_prompt])["#{node_type}NodeCount"]
461
+ priority = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => "#{node_type}Priority", 'type' => 'number', 'fieldLabel' => "#{node_type.capitalize} Priority", 'required' => true, 'defaultValue' => priority}], options[:options], @api_client, {}, options[:no_prompt])["#{node_type}Priority"]
462
+ nodes << {'nodeCount' => node_count, 'priorityOrder' => priority, 'containerType' => {'id' => container_type_id.to_i}}
463
+ avail_container_types.reject! {|it| it['value'] == container_type_id}
464
+ end
465
+ end
466
+ priority += 1
467
+ end
468
+ params["#{node_type}s"] = nodes
469
+ end
470
+ payload = {'layout' => params}
471
+ end
472
+
473
+ @library_cluster_layouts_interface.setopts(options)
474
+ if options[:dry_run]
475
+ print_dry_run @library_cluster_layouts_interface.dry.create(payload)
476
+ return
477
+ end
478
+
479
+ json_response = @library_cluster_layouts_interface.create(payload)
480
+
481
+ if options[:json]
482
+ print JSON.pretty_generate(json_response), "\n"
483
+ return
484
+ end
485
+ print_green_success "Added Cluster Layout #{params['name']}"
486
+ get([json_response['id']])
487
+ rescue RestClient::Exception => e
488
+ print_rest_exception(e, options)
489
+ exit 1
490
+ end
491
+ end
492
+
493
+ def update(args)
494
+ options = {}
495
+ params = {}
496
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
497
+ opts.banner = subcommand_usage("[name] [options]")
498
+ opts.on('-n', '--name VALUE', String, "Name for this cluster layout") do |val|
499
+ params['name'] = val
500
+ end
501
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
502
+ params['labels'] = parse_labels(val)
503
+ end
504
+ opts.on('-D', '--description VALUE', String, "Description") do |val|
505
+ params['description'] = val
506
+ end
507
+ opts.on('-v', '--version VALUE', String, "Version") do |val|
508
+ params['computeVersion'] = val
509
+ end
510
+ opts.on('-c', '--creatable [on|off]', String, "Can be used to enable / disable creatable layout. Default is on") do |val|
511
+ params['creatable'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
512
+ end
513
+ opts.on('-g', '--cluster-type CODE', String, "Cluster type. This is the cluster type code.") do |val|
514
+ options[:clusterTypeCode] = val
515
+ end
516
+ opts.on('-t', '--technology CODE', String, "Technology. This is the provision type code.") do |val|
517
+ options[:provisionTypeCode] = val
518
+ end
519
+ opts.on('-m', '--min-memory NUMBER', String, "Min memory. Assumes MB unless optional modifier specified, ex: 1GB") do |val|
520
+ bytes = parse_bytes_param(val, '--min-memory', 'MB')
521
+ params['memoryRequirement'] = bytes[:bytes]
522
+ end
523
+ opts.on('-w', '--workflow ID', String, "Workflow") do |val|
524
+ options[:taskSetId] = val.to_i
525
+ end
526
+ opts.on(nil, '--clear-workflow', "Removes workflow from cluster layout") do
527
+ params['taskSets'] = []
528
+ end
529
+ opts.on('-s', '--auto-scale [on|off]', String, "Can be used to enable / disable horizontal scaling. Default is on") do |val|
530
+ params['hasAutoScale'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
531
+ end
532
+ opts.on('--install-docker [on|off]', String, "Install Docker container runtime. Default is off.") do |val|
533
+ params['installContainerRuntime'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
534
+ end
535
+ opts.on('--install-container-runtime [on|off]', String, "Install Docker container runtime. Default is off.") do |val|
536
+ params['installContainerRuntime'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == '1' || val.to_s == ''
537
+ end
538
+ opts.add_hidden_option('--install-container-runtime')
539
+ opts.on('--evars-json JSON', String, 'Environment variables JSON: {"name":"Foo", "value":"Bar", "masked":true, "export":true}' ) do |val|
540
+ begin
541
+ evars = JSON.parse(val.to_s)
542
+ params['environmentVariables'] = evars.kind_of?(Array) ? evars : [evars]
543
+ rescue JSON::ParserError => e
544
+ print_red_alert "Unable to parse evars JSON"
545
+ exit 1
546
+ end
547
+ end
548
+ opts.on('-e', '--evars LIST', Array, "Environment variables list. Comma delimited list of name=value pairs") do |val|
549
+ params['environmentVariables'] = val.collect do |nv|
550
+ parts = nv.split('=')
551
+ {'name' => parts[0].strip, 'value' => (parts.count > 1 ? parts[1].strip : '')}
552
+ end
553
+ end
554
+ opts.on(nil, '--clear-evars', "Removes all environment variables") do
555
+ params['environmentVariables'] = []
556
+ end
557
+ opts.on('-o', '--opt-types LIST', Array, "Option types, comma separated list of option type IDs") do |val|
558
+ options[:optionTypes] = val
559
+ end
560
+ opts.on(nil, '--clear-opt-types', "Removes all options") do
561
+ params['optionTypes'] = []
562
+ end
563
+ opts.on('--masters LIST', Array, "List of master. Comma separated container types IDs in format id[/count/priority], ex: 100,101/3/0") do |val|
564
+ options[:masters] = val
565
+ end
566
+ opts.on('--clear-masters', Array, "Removes all master nodes") do
567
+ params['masters'] = []
568
+ end
569
+ opts.on('--workers LIST', Array, "List of workers. Comma separated container types IDs in format id[/count/priority], ex: 100,101/3/1") do |val|
570
+ options[:workers] = val
571
+ end
572
+ opts.on('--clear-workers', Array, "Removes all worker nodes") do
573
+ params['workers'] = []
574
+ end
575
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
576
+ opts.footer = "Update a cluster layout." + "\n" +
577
+ "[layout] is required. This is the name or id of a cluster layout."
578
+ end
579
+ optparse.parse!(args)
580
+ connect(options)
581
+ if args.count != 1
582
+ print_error MtnCloud::Terminal.angry_prompt
583
+ puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
584
+ return 1
585
+ end
586
+
587
+ begin
588
+ layout = find_layout_by_name_or_id(args[0])
589
+ if layout.nil?
590
+ return 1
591
+ end
592
+
593
+ if options[:payload]
594
+ payload = options[:payload]
595
+ else
596
+ # support the old -O OPTION switch
597
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
598
+
599
+ # cluster type
600
+ cluster_type = nil
601
+ if options[:clusterTypeCode]
602
+ cluster_type = find_cluster_type_by_code(options[:clusterTypeCode])
603
+ if cluster_type.nil?
604
+ print_red_alert "Cluster type #{options[:clusterTypeCode]} not found"
605
+ exit 1
606
+ end
607
+ params['groupType'] = {'id' => cluster_type['id']}
608
+ end
609
+
610
+ # technology customSupported, createServer
611
+ if options[:provisionTypeCode]
612
+ provision_type = find_provision_type_by_code(options[:provisionTypeCode])
613
+ if provision_type.nil?
614
+ print_red_alert "Technology #{options[:provisionTypeCode]} not found"
615
+ exit 1
616
+ end
617
+ params['provisionType'] = {'id' => provision_type['id']}
618
+ end
619
+
620
+ # workflow
621
+ if options[:taskSetId]
622
+ task_set = @task_sets_interface.get(options[:taskSetId])['taskSet']
623
+
624
+ if !task_set
625
+ print_red_alert "Workflow #{options[:taskSetId]} not found"
626
+ exit 1
627
+ end
628
+ params['taskSets'] = [{'id' => task_set['id']}]
629
+ end
630
+
631
+ # option types
632
+ if options[:optionTypes]
633
+ option_types = []
634
+ options[:optionTypes].each do |option_type_id|
635
+ if @options_types_interface.get(option_type_id.to_i).nil?
636
+ print_red_alert "Option type #{option_type_id} not found"
637
+ exit 1
638
+ else
639
+ option_types << {'id' => option_type_id.to_i}
640
+ end
641
+ end
642
+ params['optionTypes'] = option_types if option_types
643
+ end
644
+
645
+ # nodes
646
+ ['master', 'worker'].each do |node_type|
647
+ nodes = []
648
+ if options["#{node_type}s".to_sym]
649
+ cluster_type ||= find_cluster_type_by_code(layout['groupType']['code'])
650
+
651
+ if !cluster_type["has#{node_type.capitalize}s"]
652
+ print_red_alert "#{node_type.capitalize}s not support for a #{cluster_type['name']}"
653
+ exit 1
654
+ else
655
+ options["#{node_type}s".to_sym].each do |container_type_id|
656
+ node_count = 1
657
+ priority = nil
658
+ if container_type_id.include?('/')
659
+ parts = container_type_id.split('/')
660
+ container_type_id = parts[0]
661
+ node_count = parts[1].to_i if parts.count > 1
662
+ priority = parts[2].to_i if parts.count > 2
663
+ end
664
+
665
+ if @library_container_types_interface.get(nil, container_type_id.to_i).nil?
666
+ print_red_alert "Container type #{container_type_id} not found"
667
+ exit 1
668
+ else
669
+ node = {'nodeCount' => node_count, 'containerType' => {'id' => container_type_id.to_i}}
670
+ node['priorityOrder'] = priority if !priority.nil?
671
+ nodes << node
672
+ end
673
+ end
674
+ end
675
+ params["#{node_type}s"] = nodes
676
+ end
677
+ end
678
+
679
+ if params.empty?
680
+ print_green_success "Nothing to update"
681
+ exit 1
682
+ end
683
+ payload = {'layout' => params}
684
+ end
685
+
686
+ @library_cluster_layouts_interface.setopts(options)
687
+ if options[:dry_run]
688
+ print_dry_run @library_cluster_layouts_interface.dry.update(layout['id'], payload)
689
+ return
690
+ end
691
+
692
+ json_response = @library_cluster_layouts_interface.update(layout['id'], payload)
693
+
694
+ if options[:json]
695
+ print JSON.pretty_generate(json_response), "\n"
696
+ return
697
+ elsif !options[:quiet]
698
+ if json_response['success']
699
+ print_green_success "Updated cluster Layout #{params['name']}"
700
+ get([layout['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
701
+ else
702
+ print_red_alert "Error updating cluster layout: #{json_response['msg'] || json_response['errors']}"
703
+ end
704
+ end
705
+ rescue RestClient::Exception => e
706
+ print_rest_exception(e, options)
707
+ exit 1
708
+ end
709
+ end
710
+
711
+ def clone(args)
712
+ options = {}
713
+ params = {}
714
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
715
+ opts.banner = subcommand_usage("[layout]")
716
+ opts.on('-n', '--name VALUE', String, "Name for new cluster layout. Defaults to 'Copy of...'") do |val|
717
+ params['name'] = val
718
+ end
719
+ opts.on('-D', '--description VALUE', String, "Description") do |val|
720
+ params['description'] = val
721
+ end
722
+ opts.on('-v', '--version VALUE', String, "Version") do |val|
723
+ params['computeVersion'] = val
724
+ end
725
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
726
+ opts.footer = "Clone a cluster layout." + "\n" +
727
+ "[layout] is required. This is the name or id of a cluster layout being cloned."
728
+ end
729
+ optparse.parse!(args)
730
+
731
+ if args.count != 1
732
+ print_error MtnCloud::Terminal.angry_prompt
733
+ puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
734
+ return 1
735
+ end
736
+
737
+ connect(options)
738
+
739
+ begin
740
+ layout = find_layout_by_name_or_id(args[0])
741
+ if layout.nil?
742
+ return 1
743
+ end
744
+
745
+ if options[:payload]
746
+ params = options[:payload]
747
+ else
748
+ # support the old -O OPTION switch
749
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
750
+ end
751
+
752
+ @library_cluster_layouts_interface.setopts(options)
753
+ if options[:dry_run]
754
+ print_dry_run @library_cluster_layouts_interface.dry.clone(layout['id'], params)
755
+ return
756
+ end
757
+
758
+ json_response = @library_cluster_layouts_interface.clone(layout['id'], params)
759
+
760
+ if options[:json]
761
+ print JSON.pretty_generate(json_response), "\n"
762
+ return
763
+ end
764
+ print_green_success "Added Cluster Layout #{params['name']}"
765
+ get([json_response['id']])
766
+ rescue RestClient::Exception => e
767
+ print_rest_exception(e, options)
768
+ exit 1
769
+ end
770
+ end
771
+
772
+ def remove(args)
773
+ options = {}
774
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
775
+ opts.banner = subcommand_usage("[layout]")
776
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
777
+ opts.footer = "Delete a cluster layout." + "\n" +
778
+ "[layout] is required. This is the name or id of a cluster layout."
779
+ end
780
+ optparse.parse!(args)
781
+
782
+ if args.count != 1
783
+ print_error MtnCloud::Terminal.angry_prompt
784
+ puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
785
+ return 1
786
+ end
787
+
788
+ connect(options)
789
+
790
+ begin
791
+ layout = find_layout_by_name_or_id(args[0])
792
+ if layout.nil?
793
+ return 1
794
+ end
795
+
796
+ unless MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the cluster layout #{layout['name']}?", options)
797
+ exit
798
+ end
799
+
800
+ @library_cluster_layouts_interface.setopts(options)
801
+ if options[:dry_run]
802
+ print_dry_run @library_cluster_layouts_interface.dry.destroy(layout['id'])
803
+ return
804
+ end
805
+ json_response = @library_cluster_layouts_interface.destroy(layout['id'])
806
+
807
+ if options[:json]
808
+ print JSON.pretty_generate(json_response)
809
+ print "\n"
810
+ elsif !options[:quiet]
811
+ if json_response['success']
812
+ print_green_success "Removed Cluster Layout #{layout['name']}"
813
+ else
814
+ print_red_alert "Error removing cluster layout: #{json_response['msg'] || json_response['errors']}"
815
+ end
816
+ end
817
+ return 0
818
+ rescue RestClient::Exception => e
819
+ print_rest_exception(e, options)
820
+ exit 1
821
+ end
822
+ end
823
+
824
+ private
825
+
826
+ def find_layout_by_name_or_id(val)
827
+ if val.to_s =~ /\A\d{1,}\Z/
828
+ return find_layout_by_id(val)
829
+ else
830
+ return find_layout_by_name(val)
831
+ end
832
+ end
833
+
834
+ def find_layout_by_id(id)
835
+ begin
836
+ json_response = @library_cluster_layouts_interface.get(id.to_i)
837
+ return json_response['layout']
838
+ rescue RestClient::Exception => e
839
+ if e.response && e.response.code == 404
840
+ print_red_alert "Cluster layout not found by id #{id}"
841
+ else
842
+ raise e
843
+ end
844
+ end
845
+ end
846
+
847
+ def find_layout_by_name(name)
848
+ layouts = @library_cluster_layouts_interface.list({name: name.to_s})['layouts']
849
+ if layouts.empty?
850
+ print_red_alert "Cluster layout not found by name #{name}"
851
+ return nil
852
+ elsif layouts.size > 1
853
+ print_red_alert "#{layouts.size} cluster layouts found by name #{name}"
854
+ print_layouts_table(layouts, {color: red})
855
+ print_red_alert "Try using ID instead"
856
+ print reset,"\n"
857
+ return nil
858
+ else
859
+ return layouts[0]
860
+ end
861
+ end
862
+
863
+ def cluster_types
864
+ @cluster_types ||= @clusters_interface.cluster_types['clusterTypes']
865
+ end
866
+
867
+ def find_cluster_type_by_code(code)
868
+ cluster_types.find {|ct| ct['code'] == code}
869
+ end
870
+
871
+ def provision_types
872
+ @provision_types ||= @provision_types_interface.list({customSupported: true, createServer: true})['provisionTypes']
873
+ end
874
+
875
+ def find_provision_type_by_code(code)
876
+ provision_types.find {|it| it['code'] == code}
877
+ end
878
+
879
+ def printable_byte_size(val)
880
+ val = val.to_i / 1024 / 1024
881
+ label = 'MB'
882
+
883
+ if val > 1024
884
+ val = val / 1024
885
+ label = 'GB'
886
+ end
887
+ "#{val} #{label}"
888
+ end
889
+
890
+ def layout_cloud_type(layout)
891
+ layout['provisionType'] ? layout['provisionType']['name'] : (layout['groupType'] ? layout['groupType']['name'] : 'Standard')
892
+ end
893
+
894
+ def prompt_evar(options)
895
+ name = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Variable Name', 'required' => true}], options[:options], @api_client,{})['name']
896
+ value = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'value', 'type' => 'text', 'fieldLabel' => 'Variable Value', 'required' => false}], options[:options], @api_client,{})['value']
897
+ masked = MtnCloud::Cli::OptionTypes.confirm("Variable Masked?", {:default => false}) == true
898
+ export = MtnCloud::Cli::OptionTypes.confirm("Variable Label?", {:default => false}) == true
899
+ {'name' => name, 'value' => value, 'masked' => masked, 'export' => export}
900
+ end
901
+ end