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,818 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::Groups
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::AccountsHelper
6
+ include MtnCloud::Cli::InfrastructureHelper
7
+ include MtnCloud::Cli::OptionSourceHelper
8
+
9
+ register_subcommands :list, :get, :add, :update, :use, :unuse, :add_cloud, :remove_cloud, :remove, :current => :print_current
10
+ alias_subcommand :details, :get
11
+ register_subcommands :wiki, :update_wiki
12
+ set_default_subcommand :list
13
+
14
+ def initialize()
15
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
16
+ end
17
+
18
+ def connect(opts)
19
+ @api_client = establish_remote_appliance_connection(opts)
20
+ @groups_interface = @api_client.groups
21
+ @clouds_interface = @api_client.clouds
22
+ @options_interface = @api_client.options
23
+ @accounts_interface = @api_client.accounts
24
+ @account_users_interface = @api_client.account_users
25
+ @active_group_id = MtnCloud::Cli::Groups.active_groups[@appliance_name]
26
+ end
27
+
28
+ def handle(args)
29
+ handle_subcommand(args)
30
+ end
31
+
32
+ def list(args)
33
+ options = {}
34
+ params = {}
35
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
36
+ opts.banner = subcommand_usage()
37
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
38
+ add_query_parameter(params, 'labels', parse_labels(val))
39
+ end
40
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
41
+ add_query_parameter(params, 'allLabels', parse_labels(val))
42
+ end
43
+ opts.on('--include-tenants','--include-tenants', "Include sub tenant groups") do
44
+ options[:include_tenants] = true
45
+ params['includeTenants'] = true
46
+ end
47
+ opts.on('--tenant TENANT', String, "Tenant Name or ID" ) do |val|
48
+ options[:tenant] = val
49
+ end
50
+ build_standard_list_options(opts, options)
51
+ opts.footer = "List groups."
52
+ end
53
+ optparse.parse!(args)
54
+ verify_args!(args:args, optparse:optparse, count:0)
55
+ connect(options)
56
+ if options[:tenant]
57
+ if options[:tenant].to_s !~ /\A\d{1,}\Z/
58
+ account = find_account_by_name_or_id(options[:tenant])
59
+ if account.nil?
60
+ return 1, "Tenant not found by name: #{options[:tenant]}"
61
+ else
62
+ params['tenantId'] = account['id']
63
+ end
64
+ else
65
+ params['tenantId'] = options[:tenant]
66
+ end
67
+ end
68
+ params.merge!(parse_list_options(options))
69
+ @groups_interface.setopts(options)
70
+ if options[:dry_run]
71
+ print_dry_run @groups_interface.list(params)
72
+ return 0, nil
73
+ end
74
+ json_response = @groups_interface.list(params)
75
+ exit_code, err = 0, nil
76
+ render_response(json_response, options, "groups") do
77
+ groups = json_response['groups']
78
+ subtitles = []
79
+ subtitles += parse_list_subtitles(options)
80
+ print_h1 "Groups", subtitles, options
81
+ if groups.empty?
82
+ print cyan,"No groups found.",reset,"\n"
83
+ else
84
+ print_groups_table(groups, options)
85
+ print_results_pagination(json_response)
86
+ end
87
+ print reset,"\n"
88
+ end
89
+ return exit_code, err
90
+ end
91
+
92
+ def get(args)
93
+ options = {}
94
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
95
+ opts.banner = subcommand_usage("[name]")
96
+ opts.on('--include-tenants','--include-tenants', "Include sub tenant groups when finding group by name") do
97
+ options[:include_tenants] = true
98
+ end
99
+ build_standard_get_options(opts, options)
100
+ opts.footer = <<-EOT
101
+ Get details about a group.
102
+ [name] is required. This is the name or id of a group. Supports 1-N arguments.
103
+ EOT
104
+ end
105
+ optparse.parse!(args)
106
+ verify_args!(args:args, optparse:optparse, min:1)
107
+ connect(options)
108
+ id_list = parse_id_list(args)
109
+ return run_command_for_each_arg(id_list) do |arg|
110
+ _get(arg, options)
111
+ end
112
+ end
113
+
114
+ def _get(id, options={})
115
+ params = {}
116
+ group = nil
117
+ if id.to_s !~ /\A\d{1,}\Z/
118
+ group = find_group_by_name_or_id(id, options[:include_tenants])
119
+ id = group['id']
120
+ end
121
+ @groups_interface.setopts(options)
122
+ if options[:dry_run]
123
+ print_dry_run @groups_interface.dry.get(id.to_i, params)
124
+ return
125
+ end
126
+ json_response = @groups_interface.get(id.to_i, params)
127
+ render_response(json_response, options, 'group') do
128
+ group = json_response['group']
129
+ group_stats = group['stats']
130
+ # serverCounts moved to zone.stats.serverCounts
131
+ server_counts = nil
132
+ instance_counts = nil
133
+ if group_stats
134
+ instance_counts = group_stats['instanceCounts']
135
+ server_counts = group_stats['serverCounts']
136
+ end
137
+ is_active = @active_group_id && (@active_group_id == group['id'])
138
+ print_h1 "Group Details"
139
+ print cyan
140
+ description_cols = {
141
+ "ID" => 'id',
142
+ "Name" => 'name',
143
+ "Code" => 'code',
144
+ "Location" => 'location',
145
+ "Labels" => lambda {|it| format_list(it['labels'], '') rescue '' },
146
+ "Clouds" => lambda {|it| it['zones'].collect {|z| z['name'] }.join(', ') },
147
+ "Tenant" => lambda {|it| it['account'] ? it['account']['name'] : '' },
148
+ #"Instances" => lambda {|it| it['stats']['instanceCounts']['all'] rescue '' },
149
+ # "Hosts" => lambda {|it| it['stats']['serverCounts']['host'] rescue it['serverCount'] },
150
+ # "VMs" => lambda {|it| it['stats']['serverCounts']['vm'] rescue '' },
151
+ # "Bare Metal" => lambda {|it| it['stats']['serverCounts']['baremetal'] rescue '' },
152
+ }
153
+ print_description_list(description_cols, group)
154
+
155
+ if server_counts
156
+ print_h2 "Group Stats"
157
+ print cyan
158
+ print "Clouds: #{group['zones'].size}".center(20)
159
+ print "Instances: #{instance_counts['all']}".center(20) if instance_counts
160
+ print "Hosts: #{server_counts['host']}".center(20)
161
+ #print "Container Hosts: #{server_counts['containerHost']}".center(20)
162
+ #print "Hypervisors: #{server_counts['hypervisor']}".center(20)
163
+ print "Virtual Machines: #{server_counts['vm']}".center(20)
164
+ print "Bare Metal: #{server_counts['baremetal']}".center(20)
165
+ #print "Unmanaged: #{server_counts['unmanaged']}".center(20)
166
+ print "\n"
167
+ end
168
+ # puts "ID: #{group['id']}"
169
+ # puts "Name: #{group['name']}"
170
+ # puts "Code: #{group['code']}"
171
+ # puts "Location: #{group['location']}"
172
+ # puts "Clouds: #{group['zones'].collect {|it| it['name'] }.join(', ')}"
173
+ # puts "Hosts: #{group['serverCount']}"
174
+ if is_active
175
+ print "\n"
176
+ print cyan, "=> This is the active group", reset, "\n" # remove me...
177
+ end
178
+ print reset,"\n"
179
+ return 0, nil
180
+ rescue RestClient::Exception => e
181
+ print_rest_exception(e, options)
182
+ exit 1
183
+ end
184
+ end
185
+
186
+ def add(args)
187
+ options = {}
188
+ params = {}
189
+ use_it = false
190
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
191
+ opts.banner = subcommand_usage("[name]")
192
+ build_option_type_options(opts, options, add_group_option_types())
193
+ # opts.on( '-l', '--location LOCATION', "Location" ) do |val|
194
+ # params[:location] = val
195
+ # end
196
+ opts.on( '--use', '--use', "Make this the current active group" ) do
197
+ use_it = true
198
+ end
199
+ build_standard_add_options(opts, options)
200
+ opts.footer = "Create a new group."
201
+ end
202
+ optparse.parse!(args)
203
+ verify_args!(args:args, optparse:optparse, max:1)
204
+ connect(options)
205
+ begin
206
+ # group = {name: args[0], location: params[:location]}
207
+ # payload = {group: group}
208
+ group_payload = {}
209
+ if args[0]
210
+ group_payload[:name] = args[0]
211
+ options[:options]['name'] = args[0] # to skip prompt
212
+ end
213
+ if params[:location]
214
+ group_payload[:name] = params[:location]
215
+ options[:options]['location'] = params[:location] # to skip prompt
216
+ end
217
+ all_option_types = add_group_option_types()
218
+ params = MtnCloud::Cli::OptionTypes.prompt(all_option_types, options[:options], @api_client, {})
219
+ group_payload.merge!(params)
220
+ payload = {group: group_payload}
221
+ @groups_interface.setopts(options)
222
+ if options[:dry_run]
223
+ print_dry_run @groups_interface.dry.create(payload)
224
+ return
225
+ end
226
+ json_response = @groups_interface.create(payload)
227
+ group = json_response['group']
228
+ if use_it
229
+ ::MtnCloud::Cli::Groups.set_active_group(@appliance_name, group['id'])
230
+ end
231
+ if options[:json]
232
+ print JSON.pretty_generate(json_response)
233
+ print "\n"
234
+ else
235
+ print_green_success "Added group #{group['name']}"
236
+ list([])
237
+ end
238
+ rescue RestClient::Exception => e
239
+ print_rest_exception(e, options)
240
+ exit 1
241
+ end
242
+ end
243
+
244
+ def update(args)
245
+ options = {}
246
+ params = {}
247
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
248
+ opts.banner = subcommand_usage("[name] [options]")
249
+ build_option_type_options(opts, options, update_group_option_types())
250
+ # opts.on( '-l', '--location LOCATION', "Location" ) do |val|
251
+ # params[:location] = val
252
+ # end
253
+ build_standard_update_options(opts, options)
254
+ opts.footer = "Update a group."
255
+ end
256
+ optparse.parse!(args)
257
+ verify_args!(args:args, optparse:optparse, count:1)
258
+ connect(options)
259
+ begin
260
+ group = find_group_by_name_or_id(args[0])
261
+ group_payload = {}
262
+
263
+ #params = MtnCloud::Cli::OptionTypes.prompt(update_group_option_types, options[:options], @api_client, {})
264
+ params = options[:options] || {}
265
+
266
+ if params.empty?
267
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
268
+ end
269
+
270
+ if params.key?('labels')
271
+ params['labels'] = parse_labels(params['labels'])
272
+ end
273
+ group_payload.merge!(params)
274
+
275
+ payload = {group: group_payload}
276
+ @groups_interface.setopts(options)
277
+ if options[:dry_run]
278
+ print_dry_run @groups_interface.dry.update(group['id'], payload)
279
+ return
280
+ end
281
+ json_response = @groups_interface.update(group['id'], payload)
282
+ if options[:json]
283
+ print JSON.pretty_generate(json_response)
284
+ print "\n"
285
+ else
286
+ #list([])
287
+ get([group["id"]])
288
+ end
289
+ rescue RestClient::Exception => e
290
+ print_rest_exception(e, options)
291
+ exit 1
292
+ end
293
+ end
294
+
295
+ def add_cloud(args)
296
+ options = {}
297
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
298
+ opts.banner = subcommand_usage("[name]", "CLOUD")
299
+ build_standard_update_options(opts, options)
300
+ opts.footer = "Add a cloud to a group."
301
+ end
302
+ optparse.parse!(args)
303
+ verify_args!(args:args, optparse:optparse, count:2)
304
+ connect(options)
305
+ begin
306
+ group = find_group_by_name_or_id(args[0])
307
+ cloud = find_cloud_by_name_or_id(args[1])
308
+ current_zones = group['zones']
309
+ found_zone = current_zones.find {|it| it["id"] == cloud["id"] }
310
+ if found_zone
311
+ print_red_alert "Cloud #{cloud['name']} is already in group #{group['name']}."
312
+ exit 1
313
+ end
314
+ new_zones = current_zones + [{'id' => cloud['id']}]
315
+ payload = {group: {id: group["id"], zones: new_zones}}
316
+ @groups_interface.setopts(options)
317
+ if options[:dry_run]
318
+ print_dry_run @groups_interface.dry.update_zones(group["id"], payload)
319
+ return
320
+ end
321
+ json_response = @groups_interface.update_zones(group["id"], payload)
322
+ if options[:json]
323
+ print JSON.pretty_generate(json_response)
324
+ print "\n"
325
+ else
326
+ print_green_success "Added cloud #{cloud["name"]} to group #{group['name']}"
327
+ #list([])
328
+ get([group["id"]])
329
+ end
330
+ rescue RestClient::Exception => e
331
+ print_rest_exception(e, options)
332
+ exit 1
333
+ end
334
+ end
335
+
336
+ def remove_cloud(args)
337
+ options = {}
338
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
339
+ opts.banner = subcommand_usage("[name] [cloud]")
340
+ build_standard_update_options(opts, options)
341
+ opts.footer = "Remove a cloud from a group."
342
+ end
343
+ optparse.parse!(args)
344
+ verify_args!(args:args, optparse:optparse, count:2)
345
+ connect(options)
346
+ begin
347
+ group = find_group_by_name_or_id(args[0])
348
+ cloud = find_cloud_by_name_or_id(args[1])
349
+ current_zones = group['zones']
350
+ found_zone = current_zones.find {|it| it["id"] == cloud["id"] }
351
+ if !found_zone
352
+ print_red_alert "Cloud #{cloud['name']} is not in group #{group['name']}."
353
+ exit 1
354
+ end
355
+ new_zones = current_zones.reject {|it| it["id"] == cloud["id"] }
356
+ payload = {group: {id: group["id"], zones: new_zones}}
357
+ @groups_interface.setopts(options)
358
+ if options[:dry_run]
359
+ print_dry_run @groups_interface.dry.update_zones(group["id"], payload)
360
+ return
361
+ end
362
+ json_response = @groups_interface.update_zones(group["id"], payload)
363
+ if options[:json]
364
+ print JSON.pretty_generate(json_response)
365
+ print "\n"
366
+ else
367
+ print_green_success "Removed cloud #{cloud['name']} from group #{group['name']}"
368
+ # list([])
369
+ get([group["id"]])
370
+ end
371
+ rescue RestClient::Exception => e
372
+ print_rest_exception(e, options)
373
+ exit 1
374
+ end
375
+ end
376
+
377
+ def remove(args)
378
+ options = {}
379
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
380
+ opts.banner = subcommand_usage("[name]")
381
+ build_standard_remove_options(opts, options)
382
+ opts.footer = "Delete a group."
383
+ end
384
+ optparse.parse!(args)
385
+ verify_args!(args:args, optparse:optparse, count:1)
386
+ connect(options)
387
+
388
+ begin
389
+ group = find_group_by_name_or_id(args[0])
390
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the group #{group['name']}?")
391
+ exit
392
+ end
393
+ @groups_interface.setopts(options)
394
+ if options[:dry_run]
395
+ print_dry_run @groups_interface.dry.destroy(group['id'])
396
+ return
397
+ end
398
+ json_response = @groups_interface.destroy(group['id'])
399
+ if options[:json]
400
+ print JSON.pretty_generate(json_response)
401
+ print "\n"
402
+ elsif !options[:quiet]
403
+ print_green_success "Removed group #{group['name']}"
404
+ #list([])
405
+ end
406
+ rescue RestClient::Exception => e
407
+ print_rest_exception(e, options)
408
+ exit 1
409
+ end
410
+ end
411
+
412
+ def use(args)
413
+ options = {}
414
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
415
+ opts.banner = subcommand_usage("[name]")
416
+ opts.footer = <<-EOT
417
+ This sets the active group.
418
+ The active group will be auto-selected for use during provisioning.
419
+ [name] is required. This is the name or id of a group.
420
+ EOT
421
+ build_common_options(opts, options, [:quiet, :remote])
422
+ end
423
+ optparse.parse!(args)
424
+ verify_args!(args:args, optparse:optparse, count:1)
425
+ connect(options)
426
+
427
+ group = find_group_option(args[0]) #uses /api/options
428
+ if !group
429
+ raise_command_error "Group not found by name #{args[0]}"
430
+ end
431
+ exit_code, err = 0, nil
432
+ is_already_active = @active_group_id == group['id']
433
+ if is_already_active
434
+ unless options[:quiet]
435
+ print reset,"Already using the group #{group['name']}","\n",reset
436
+ end
437
+ else
438
+ ::MtnCloud::Cli::Groups.set_active_group(@appliance_name, group['id'])
439
+ # ::MtnCloud::Cli::Groups.save_groups(@active_groups)
440
+ unless options[:quiet]
441
+ print cyan,"Switched active group to #{group['name']}","\n",reset
442
+ end
443
+ #list([])
444
+ end
445
+ if is_already_active
446
+ print_green_success "Group #{group['name']} is still active"
447
+ else
448
+ print_green_success "Group #{group['name']} is now active"
449
+ end
450
+ return 0
451
+
452
+
453
+ end
454
+
455
+ def unuse(args)
456
+ options = {}
457
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
458
+ opts.banner = subcommand_usage()
459
+ opts.footer = "" +
460
+ "This will clear the current active group.\n" +
461
+ "You will be prompted for a Group during provisioning."
462
+ build_common_options(opts, options, [:quiet, :remote])
463
+ end
464
+ optparse.parse!(args)
465
+ verify_args!(args:args, optparse:optparse, count:0)
466
+ connect(options.merge({:skip_verify_access_token => true, :skip_login => true}))
467
+ exit_code, err = 0, nil
468
+ if @active_group_id
469
+ ::MtnCloud::Cli::Groups.clear_active_group(@appliance_name)
470
+ # print_green_success "Group #{@active_group_id} is no longer active."
471
+ print_green_success "Group is no longer active."
472
+ return 0, nil
473
+ else
474
+ # print reset,"You are not using any group for appliance #{@appliance_name}",reset,"\n"
475
+ print reset,"You are not using any group",reset,"\n"
476
+ # exit_code = 1
477
+ end
478
+ return exit_code, err
479
+ end
480
+
481
+ def print_current(args)
482
+ options = {}
483
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
484
+ opts.banner = subcommand_usage()
485
+ build_common_options(opts, options, [:remote])
486
+ opts.footer = "Print the name of the current active group"
487
+ end
488
+ optparse.parse!(args)
489
+ connect(options)
490
+
491
+ group = @active_group_id ? find_group_by_name_or_id(@active_group_id) : nil
492
+ if group
493
+ print cyan,group['name'].to_s,"\n",reset
494
+ else
495
+ print yellow,"No active group. See `groups use`","\n",reset
496
+ return false
497
+ end
498
+ end
499
+
500
+ def wiki(args)
501
+ options = {}
502
+ params = {}
503
+ open_wiki_link = false
504
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
505
+ opts.banner = subcommand_usage("[group]")
506
+ opts.on('--view', '--view', "View wiki page in web browser.") do
507
+ open_wiki_link = true
508
+ end
509
+ build_common_options(opts, options, [:json, :dry_run, :remote])
510
+ opts.footer = "View wiki page details for an group." + "\n" +
511
+ "[group] is required. This is the name or id of an group."
512
+ end
513
+ optparse.parse!(args)
514
+ if args.count != 1
515
+ puts_error "#{MtnCloud::Terminal.angry_prompt}wrong number of arguments. Expected 1 and received #{args.count} #{args.inspect}\n#{optparse}"
516
+ return 1
517
+ end
518
+ connect(options)
519
+
520
+ begin
521
+ group = find_group_by_name_or_id(args[0])
522
+ return 1 if group.nil?
523
+
524
+
525
+ @groups_interface.setopts(options)
526
+ if options[:dry_run]
527
+ print_dry_run @groups_interface.dry.wiki(group["id"], params)
528
+ return
529
+ end
530
+ json_response = @groups_interface.wiki(group["id"], params)
531
+ page = json_response['page']
532
+
533
+ render_result = render_with_format(json_response, options, 'page')
534
+ return 0 if render_result
535
+
536
+ if page
537
+
538
+ # my_terminal.exec("wiki get #{page['id']}")
539
+
540
+ print_h1 "Group Wiki Page: #{group['name']}"
541
+ # print_h1 "Wiki Page Details"
542
+ print cyan
543
+
544
+ print_description_list({
545
+ "Page ID" => 'id',
546
+ "Name" => 'name',
547
+ #"Category" => 'category',
548
+ #"Ref Type" => 'refType',
549
+ #"Ref ID" => 'refId',
550
+ #"Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
551
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
552
+ "Created By" => lambda {|it| it['createdBy'] ? it['createdBy']['username'] : '' },
553
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
554
+ "Updated By" => lambda {|it| it['updatedBy'] ? it['updatedBy']['username'] : '' }
555
+ }, page)
556
+ print reset,"\n"
557
+
558
+ print_h2 "Page Content"
559
+ print cyan, page['content'], reset, "\n"
560
+
561
+ else
562
+ print "\n"
563
+ print cyan, "No wiki page found.", reset, "\n"
564
+ end
565
+ print reset,"\n"
566
+
567
+ if open_wiki_link
568
+ return view_wiki([args[0]])
569
+ end
570
+
571
+ return 0
572
+ rescue RestClient::Exception => e
573
+ print_rest_exception(e, options)
574
+ exit 1
575
+ end
576
+ end
577
+
578
+ def view_wiki(args)
579
+ params = {}
580
+ options = {}
581
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
582
+ opts.banner = subcommand_usage("[id]")
583
+ build_common_options(opts, options, [:dry_run, :remote])
584
+ opts.footer = "View group wiki page in a web browser" + "\n" +
585
+ "[group] is required. This is the name or id of an group."
586
+ end
587
+ optparse.parse!(args)
588
+ if args.count != 1
589
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
590
+ end
591
+ connect(options)
592
+ begin
593
+ group = find_group_by_name_or_id(args[0])
594
+ return 1 if group.nil?
595
+
596
+ link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/infrastructure/groups/#{group['id']}#!wiki"
597
+
598
+ if options[:dry_run]
599
+ puts MtnCloud::Util.open_url_command(link)
600
+ return 0
601
+ end
602
+ return MtnCloud::Util.open_url(link)
603
+ rescue RestClient::Exception => e
604
+ print_rest_exception(e, options)
605
+ exit 1
606
+ end
607
+ end
608
+
609
+ def update_wiki(args)
610
+ options = {}
611
+ params = {}
612
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
613
+ opts.banner = subcommand_usage("[group] [options]")
614
+ build_option_type_options(opts, options, update_wiki_page_option_types)
615
+ opts.on('--file FILE', "File containing the wiki content. This can be used instead of --content") do |filename|
616
+ full_filename = File.expand_path(filename)
617
+ if File.exist?(full_filename)
618
+ params['content'] = File.read(full_filename)
619
+ else
620
+ print_red_alert "File not found: #{full_filename}"
621
+ return 1
622
+ end
623
+ # use the filename as the name by default.
624
+ if !params['name']
625
+ params['name'] = File.basename(full_filename)
626
+ end
627
+ end
628
+ opts.on(nil, '--clear', "Clear current page content") do |val|
629
+ params['content'] = ""
630
+ end
631
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
632
+ end
633
+ optparse.parse!(args)
634
+ if args.count != 1
635
+ puts_error "#{MtnCloud::Terminal.angry_prompt}wrong number of arguments. Expected 1 and received #{args.count} #{args.inspect}\n#{optparse}"
636
+ return 1
637
+ end
638
+ connect(options)
639
+
640
+ begin
641
+ group = find_group_by_name_or_id(args[0])
642
+ return 1 if group.nil?
643
+ # construct payload
644
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
645
+ payload = nil
646
+ if options[:payload]
647
+ payload = options[:payload]
648
+ payload.deep_merge!({'page' => passed_options}) unless passed_options.empty?
649
+ else
650
+ payload = {
651
+ 'page' => {
652
+ }
653
+ }
654
+ # allow arbitrary -O options
655
+ payload.deep_merge!({'page' => passed_options}) unless passed_options.empty?
656
+ # prompt for options
657
+ #params = MtnCloud::Cli::OptionTypes.prompt(update_wiki_page_option_types, options[:options], @api_client, options[:params])
658
+ #params = passed_options
659
+ params.deep_merge!(passed_options)
660
+
661
+ if params.empty?
662
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
663
+ end
664
+
665
+ payload.deep_merge!({'page' => params}) unless params.empty?
666
+ end
667
+ @groups_interface.setopts(options)
668
+ if options[:dry_run]
669
+ print_dry_run @groups_interface.dry.update_wiki(group["id"], payload)
670
+ return
671
+ end
672
+ json_response = @groups_interface.update_wiki(group["id"], payload)
673
+
674
+ if options[:json]
675
+ puts as_json(json_response, options)
676
+ else
677
+ print_green_success "Updated wiki page for group #{group['name']}"
678
+ wiki([group['id']])
679
+ end
680
+ return 0
681
+ rescue RestClient::Exception => e
682
+ print_rest_exception(e, options)
683
+ exit 1
684
+ end
685
+ end
686
+
687
+ protected
688
+
689
+ def print_groups_table(groups, options={})
690
+ table_color = options[:color] || cyan
691
+ active_group = @active_group_id ? groups.find {|group| group['id'] == @active_group_id } : nil
692
+ rows = groups.collect do |group|
693
+ {
694
+ id: active_group ? (((@active_group_id && (@active_group_id == group['id'])) ? "=> " : " ") + group['id'].to_s) : group['id'],
695
+ name: group['name'],
696
+ tenant: group['account'] ? group['account']['name'] : '',
697
+ labels: group['labels'],
698
+ location: group['location'],
699
+ cloud_count: group['zones'] ? group['zones'].size : 0,
700
+ instance_count: (group['stats']['instanceCounts']['all'] rescue ''),
701
+ host_count: (group['stats']['serverCounts']['host'] rescue group['serverCount']),
702
+ vm_count: (group['stats']['serverCounts']['vm'] rescue ''),
703
+ baremetal_count: (group['stats']['serverCounts']['baremetal'] rescue '')
704
+ }
705
+ end
706
+ columns = [
707
+ #{:active => {:display_name => ""}},
708
+ {:id => {:display_name => (active_group ? " ID" : "ID")}},
709
+ {:name => {:width => 64}},
710
+ options[:include_tenants] || options[:tenant] ? {:tenant => {:width => 32}} : nil,
711
+ {:location => {:width => 32}},
712
+ {:labels => {:display_method => lambda {|it| format_list(it[:labels], '', 3) rescue '' }}},
713
+ {:cloud_count => {:display_name => "CLOUDS"}},
714
+ {:instance_count => {:display_name => "INSTANCES"}},
715
+ {:host_count => {:display_name => "HOSTS"}},
716
+ {:vm_count => {:display_name => "VMS"}},
717
+ {:baremetal_count => {:display_name => "BARE METAL"}},
718
+ ].compact
719
+ print as_pretty_table(rows, columns, options)
720
+ end
721
+
722
+ def add_group_option_types()
723
+ tmp_option_types = [
724
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
725
+ {'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
726
+ {'shorthand' => '-l', 'optionalValue' => true, 'fieldName' => 'labels', 'fieldLabel' => 'Labels', 'type' => 'text', 'required' => false, 'processValue' => lambda {|val| parse_labels(val) }, 'displayOrder' => 3},
727
+ {'fieldName' => 'location', 'fieldLabel' => 'Location', 'type' => 'text', 'required' => false, 'displayOrder' => 4},
728
+ ]
729
+
730
+ # Advanced Options
731
+ # TODO: Service Registry
732
+
733
+ return tmp_option_types
734
+ end
735
+
736
+ def update_group_option_types()
737
+ add_group_option_types().collect {|it| it['required'] = false; it }
738
+ end
739
+
740
+ # todo: This belongs elsewhere, like module MtnCloud::Cli::ActiveGroups
741
+
742
+ public
743
+
744
+ @@groups = nil
745
+
746
+ class << self
747
+ include Term::ANSIColor
748
+ # Provides the current active group information
749
+ def active_groups_map
750
+ @@groups ||= load_group_file || {}
751
+ end
752
+
753
+ def active_groups
754
+ active_groups_map
755
+ end
756
+
757
+ # Provides the current active group information (just the ID right now)
758
+ def active_group(appliance_name=nil)
759
+ if appliance_name == nil
760
+ appliance_name, appliance_url = MtnCloud::Cli::Remote.active_appliance
761
+ end
762
+ if !appliance_name
763
+ return nil
764
+ end
765
+ return active_groups_map[appliance_name.to_sym]
766
+ end
767
+
768
+ # alias (unused)
769
+ def active_group_id(appliance_name=nil)
770
+ active_group(appliance_name)
771
+ end
772
+
773
+ def set_active_group(appliance_name, group_id)
774
+ the_groups = active_groups_map
775
+ the_groups[appliance_name.to_sym] = group_id
776
+ save_groups(the_groups)
777
+ end
778
+
779
+ def clear_active_group(appliance_name)
780
+ the_groups = active_groups_map
781
+ the_groups.delete(appliance_name.to_sym)
782
+ save_groups(the_groups)
783
+ end
784
+
785
+ def load_group_file
786
+ fn = groups_file_path
787
+ if File.exist? fn
788
+ #MtnCloud::Logging::DarkPrinter.puts "loading groups file #{fn}" if MtnCloud::Logging.debug?
789
+ return YAML.load_file(fn)
790
+ else
791
+ {}
792
+ end
793
+ end
794
+
795
+ def groups_file_path
796
+ return File.join(MtnCloud::Cli.home_directory, "groups")
797
+ end
798
+
799
+ def save_groups(groups_map)
800
+ fn = groups_file_path
801
+ if !Dir.exist?(File.dirname(fn))
802
+ FileUtils.mkdir_p(File.dirname(fn))
803
+ end
804
+ File.open(fn, 'w') {|f| f.write groups_map.to_yaml } #Store
805
+ FileUtils.chmod(0600, fn)
806
+ @@groups = groups_map
807
+ end
808
+
809
+ end
810
+
811
+ def update_wiki_page_option_types
812
+ [
813
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => false, 'displayOrder' => 1, 'description' => 'The name of the wiki page for this instance. Default is the instance name.'},
814
+ #{'fieldName' => 'category', 'fieldLabel' => 'Category', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
815
+ {'fieldName' => 'content', 'fieldLabel' => 'Content', 'type' => 'textarea', 'required' => false, 'displayOrder' => 3, 'description' => 'The content (markdown) of the wiki page.'}
816
+ ]
817
+ end
818
+ end