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,337 @@
1
+ require 'term/ansicolor'
2
+ require 'shellwords'
3
+ require 'mtncloud/logging'
4
+ require 'mtncloud/cli/errors'
5
+ require 'mtncloud/cli/error_handler'
6
+ require 'mtncloud/cli/expression_parser'
7
+ require 'mtncloud/ext/string'
8
+
9
+ module MtnCloud
10
+ module Cli
11
+ class CliRegistry
12
+
13
+ class BadCommandDefinition < StandardError
14
+ end
15
+
16
+ class BadAlias < StandardError
17
+ end
18
+
19
+ def initialize
20
+ @commands = {} # this is command => Class that includes ::CliCommand
21
+ @aliases = {} # this is alias => String full input string
22
+ end
23
+
24
+ def flush
25
+ @commands = {}
26
+ @aliases = {}
27
+ end
28
+
29
+ def all
30
+ @commands.reject {|cmd, klass| klass.hidden_command }
31
+ end
32
+
33
+ def get(cmd_name)
34
+ @commands[cmd_name.to_sym]
35
+ end
36
+
37
+ def add(cmd_name, klass)
38
+ @commands[cmd_name.to_sym] = klass
39
+ end
40
+
41
+ def remove(cmd_name)
42
+ @commands.delete(cmd_name.to_sym)
43
+ end
44
+
45
+ def all_aliases
46
+ @aliases
47
+ end
48
+
49
+ def get_alias(alias_name)
50
+ @aliases[alias_name.to_sym]
51
+ end
52
+
53
+ def add_alias(alias_name, command_string)
54
+ #return @commands[alias_name.to_sym]
55
+ if self.class.has_command?(alias_name)
56
+ raise BadAlias.new "alias name '#{alias_name}' is invalid. That is the name of an existing command."
57
+ elsif alias_name.to_s.downcase.strip == command_string.to_s.downcase.strip
58
+ raise BadAlias.new "alias #{alias_name}=#{command_string} is invalid..."
59
+ end
60
+ @aliases[alias_name.to_sym] = command_string
61
+ end
62
+
63
+ def remove_alias(alias_name)
64
+ @aliases.delete(alias_name.to_sym)
65
+ end
66
+
67
+ class << self
68
+ include Term::ANSIColor
69
+
70
+ def instance
71
+ @instance ||= CliRegistry.new
72
+ end
73
+
74
+ #todo: move execution out of the CliRegistry
75
+ def exec(command_name, args)
76
+ exec_command(command_name, args)
77
+ end
78
+
79
+ def exec_command(command_name, args)
80
+ #puts "exec_command(#{command_name}, #{args})"
81
+ result = nil
82
+ if has_alias?(command_name)
83
+ result = exec_alias(command_name, args)
84
+ elsif has_command?(command_name)
85
+ begin
86
+ result = instance.get(command_name).new.handle(args)
87
+ rescue SystemExit => e
88
+ result = MtnCloud::Cli::ErrorHandler.new(MtnCloud::Terminal.instance.stderr).handle_error(e) # lol
89
+ rescue => e
90
+ result = MtnCloud::Cli::ErrorHandler.new(MtnCloud::Terminal.instance.stderr).handle_error(e) # lol
91
+ end
92
+ else
93
+ # todo: need to just return error instead of raise
94
+ msg = "'#{command_name}' is not a known command. See '#{MtnCloud::Cli.prog_name} --help'."
95
+ suggestions = find_command_suggestions(command_name)
96
+ if suggestions && suggestions.size == 1
97
+ msg += "\nThe most similar command is:\n"
98
+ msg += "\t" + suggestions.first + "\n"
99
+ elsif suggestions && suggestions.size > 1
100
+ msg += "\nThe most similar commands are:\n"
101
+ suggestions.first(50).each do |suggestion|
102
+ msg += "\t" + suggestion + "\n"
103
+ end
104
+ end
105
+ #raise CommandNotFoundError.new(msg)
106
+ result = MtnCloud::Cli::ErrorHandler.new(MtnCloud::Terminal.instance.stderr).handle_error(CommandNotFoundError.new(msg)) # lol
107
+ end
108
+ return result
109
+ end
110
+
111
+ def exec_alias(alias_name, args)
112
+ found_alias_command = instance.get_alias(alias_name)
113
+ if !found_alias_command
114
+ raise MtnCloud::Cli::CommandError.new("'#{alias_name}' is not a defined alias.")
115
+ end
116
+ # if !is_valid_expression(found_alias_command)
117
+ # raise MtnCloud::Cli::CommandError.new("alias '#{alias_name}' is not a valid expression: #{found_alias_command}")
118
+ # end
119
+ input = found_alias_command
120
+ if args && !args.empty?
121
+ input = "#{found_alias_command} " + args.collect {|arg| arg.include?(" ") ? "\"#{arg}\"" : "#{arg}" }.join(" ")
122
+ end
123
+ exec_expression(input)
124
+ end
125
+
126
+ def exec_expression(input)
127
+ # puts "exec_expression(#{input})"
128
+ flow = input
129
+ if input.is_a?(String)
130
+ begin
131
+ flow = MtnCloud::Cli::ExpressionParser.parse(input)
132
+ rescue MtnCloud::Cli::ExpressionParser::InvalidExpression => e
133
+ raise e
134
+ end
135
+ end
136
+ # puts "executing flow: #{flow.inspect}"
137
+ final_command_result = nil
138
+ if flow.size == 0
139
+ # no input eh?
140
+ else
141
+ last_command_result = nil
142
+ if ['&&','||', '|'].include?(flow.first)
143
+ raise MtnCloud::Cli::ExpressionParser::InvalidExpression.new "#{MtnCloud::Terminal.angry_prompt}invalid command format, begins with an operator: #{input}"
144
+ elsif ['&&','||', '|'].include?(flow.last)
145
+ raise MtnCloud::Cli::ExpressionParser::InvalidExpression.new "#{MtnCloud::Terminal.angry_prompt}invalid command format, ends with an operator: #{input}"
146
+ # elsif ['&&','||', '|'].include?(flow.last)
147
+ # raise MtnCloud::Cli::ExpressionParser::InvalidExpression.new "invalid command format, consecutive operators: #{cmd}"
148
+ else
149
+ #MtnCloud::Logging::DarkPrinter.puts "Executing command flow: #{flow.inspect}" if MtnCloud::Logging.debug?
150
+ previous_command = nil
151
+ previous_command_result = nil
152
+ current_operator = nil
153
+ still_executing = true
154
+ # need to error before executing anything, could be dangerous otherwise!
155
+ # also maybe only pass flow commands if they have a space on either side..
156
+ if flow.include?("|")
157
+ raise MtnCloud::Cli::ExpressionParser::InvalidExpression.new "The PIPE (|) operator is not yet supported. You can wrap your arguments in quotations."
158
+ end
159
+ flow.each do |flow_cmd|
160
+ if still_executing
161
+ if flow_cmd == '&&'
162
+ # AND operator
163
+ current_operator = flow_cmd
164
+ exit_code, cmd_err = parse_command_result(previous_command_result)
165
+ if exit_code != 0
166
+ still_executing = false
167
+ end
168
+ elsif flow_cmd == '||' # or with previous command
169
+ current_operator = flow_cmd
170
+ exit_code, err = parse_command_result(previous_command_result)
171
+ if exit_code == 0
172
+ still_executing = false
173
+ end
174
+ elsif flow_cmd == '|' # or with previous command
175
+ # todo, handle pipe!
176
+ raise MtnCloud::Cli::ExpressionParser::InvalidExpression.new "The PIPE (|) operator is not yet supported. You can wrap your arguments in quotations."
177
+ previous_command_result = nil
178
+ still_executing = false
179
+ # or just continue?
180
+ elsif flow_cmd.is_a?(Array)
181
+ # this is a subexpression, execute it as such
182
+ current_operator = nil
183
+ previous_command_result = exec_expression(flow_cmd)
184
+ else # it's a command, not an operator
185
+ current_operator = nil
186
+ flow_argv = Shellwords.shellsplit(flow_cmd)
187
+ previous_command_result = exec_command(flow_argv[0], flow_argv[1..-1])
188
+ end
189
+ previous_command = flow_cmd
190
+ else
191
+ #MtnCloud::Logging::DarkPrinter.puts "operator skipped command: #{flow_cmd}" if MtnCloud::Logging.debug?
192
+ end
193
+ # previous_command = flow_cmd
194
+ end
195
+ final_command_result = previous_command_result
196
+ end
197
+ end
198
+ return final_command_result
199
+ end
200
+
201
+ def add(klass, command_name=nil)
202
+ klass_command_name = cli_ize(klass.name.split('::')[-1])
203
+ if has_command?(klass_command_name)
204
+ instance.remove(klass_command_name)
205
+ end
206
+ command_name ||= klass_command_name
207
+ instance.add(command_name, klass)
208
+ end
209
+
210
+ def has_command?(command_name)
211
+ if command_name.nil? || command_name == ''
212
+ false
213
+ else
214
+ !instance.get(command_name).nil?
215
+ end
216
+ end
217
+
218
+ def has_alias?(alias_name)
219
+ if alias_name.nil? || alias_name == ''
220
+ false
221
+ else
222
+ !instance.get_alias(alias_name).nil?
223
+ end
224
+ end
225
+
226
+ def all
227
+ instance.all
228
+ end
229
+
230
+ def all_aliases
231
+ instance.all_aliases
232
+ end
233
+
234
+ def cli_ize(klass_name)
235
+ # borrowed from ActiveSupport
236
+ return klass_name unless klass_name =~ /[A-Z-]|::/
237
+ word = klass_name.to_s.gsub(/::/, '/')
238
+ word.gsub!(/(?:(?<=([A-Za-z\d]))|\b)(?=\b|[^a-z])/) { "#{$1 && '_'}" }
239
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
240
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
241
+ word.tr!("-", "_")
242
+ word.downcase!
243
+ word.chop.tr('_', '-')
244
+ end
245
+
246
+ def parse_alias_definition(input)
247
+ # todo: one multi group regex would work
248
+ alias_name, command_string = nil, nil
249
+ chunks = input.to_s.sub(/^alias\s+/, "").split('=')
250
+ alias_name = chunks.shift
251
+ command_string = chunks.compact.reject {|it| it.empty? }.join('=')
252
+ command_string = command_string.strip.sub(/^'/, "").sub(/'\Z/, "").strip
253
+ return alias_name, command_string
254
+ end
255
+
256
+ # parse any object into a command result [exit_code, error]
257
+ # 0 means success.
258
+ # This treats nil, true, or an object as success ie. [0, nil]
259
+ # and false is treated as an error [1, error]
260
+ # @return [Array] [exit_code, error]. Success returns [0, nil].
261
+ def parse_command_result(cmd_result)
262
+ exit_code, error = nil, nil
263
+ if cmd_result.is_a?(Array)
264
+ exit_code = cmd_result[0] || 0
265
+ error = cmd_result[1]
266
+ elsif cmd_result.is_a?(Hash)
267
+ exit_code = cmd_result[:exit_code] || 0
268
+ error = cmd_result[:error] || cmd_result[:err]
269
+ elsif cmd_result == nil || cmd_result == true
270
+ exit_code = 0
271
+ elsif cmd_result == false
272
+ exit_code = 1
273
+ elsif cmd_result.is_a?(Integer)
274
+ exit_code = cmd_result
275
+ elsif cmd_result.is_a?(Float)
276
+ exit_code = cmd_result.to_i
277
+ elsif cmd_result.is_a?(String)
278
+ exit_code = cmd_result.to_i
279
+ else
280
+ if cmd_result.respond_to?(:to_i)
281
+ exit_code = cmd_result.to_i
282
+ else
283
+ # happens for aliases right now.. and execution flow probably, need to handle Array
284
+ # uncomment to track them down, proceed with exit 0 for now
285
+ #MtnCloud::Logging::DarkPrinter.puts "debug: command #{command_name} produced an unexpected result: (#{cmd_result.class}) #{cmd_result}" if MtnCloud::Logging.debug?
286
+ exit_code = 0
287
+ end
288
+ end
289
+ return exit_code, error
290
+ end
291
+
292
+ def cached_command_list
293
+ @cached_command_list ||= (all.keys + all_aliases.keys).collect { |it| it.to_s }.sort
294
+ end
295
+
296
+ def clear_cached_command_list
297
+ @cached_command_list = nil
298
+ end
299
+
300
+ # find suggested commands (or aliases) for a name that was not found
301
+ # First this looks for the plural of the original guess
302
+ # Then pop characters off the end looking for partial matches
303
+ # as long as the guess is at least 3 characters
304
+ def find_command_suggestions(command_name)
305
+ every_command = cached_command_list
306
+ guess = command_name
307
+ suggestions = []
308
+ while suggestions.empty? && guess.size >= 3
309
+ plural_guess = guess.pluralize
310
+ if every_command.include?(guess)
311
+ suggestions << guess
312
+ end
313
+ if every_command.include?(plural_guess)
314
+ suggestions << plural_guess
315
+ end
316
+ # if every_command.include?(guess)
317
+ # suggestions << plural_guess
318
+ # else
319
+ guess_regexp = /^#{Regexp.escape(guess)}/i
320
+ every_command.each do |it|
321
+ if it =~ guess_regexp
322
+ suggestions << it
323
+ end
324
+ end
325
+ # end
326
+ guess = guess[0..-2]
327
+ end
328
+ suggestions.uniq!
329
+ suggestions.sort! { |x,y| [x.split('-').size, x] <=> [y.split('-').size, y] }
330
+ return suggestions
331
+ end
332
+
333
+ end
334
+
335
+ end
336
+ end
337
+ end
@@ -0,0 +1,201 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ # This provides commands for authentication
4
+ # This also includes credential management.
5
+ class MtnCloud::Cli::AccessTokenCommand
6
+ include MtnCloud::Cli::CliCommand
7
+
8
+ set_command_name :'access-token'
9
+ #set_command_name :'access'
10
+ register_subcommands :get => :print_access_token
11
+ register_subcommands :details => :details
12
+ register_subcommands :refresh => :use_refresh_token
13
+
14
+ def initialize()
15
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
16
+ end
17
+
18
+ # connect overridden to skip login and return an exit_code
19
+ def connect(options)
20
+ @api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true, :skip_login => true}))
21
+ # automatically get @appliance_name, @appliance_url, @wallet
22
+ if !@appliance_name
23
+ raise_command_error "#{command_name} requires a remote to be specified, use -r [remote] or set the active remote with `remote use`"
24
+ end
25
+ if !@appliance_url
26
+ unless options[:quiet]
27
+ print red,"Unable to determine remote appliance url. Review your remote configuration.#{reset}\n"
28
+ end
29
+ return 1
30
+ end
31
+ #@wallet = MtnCloud::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials()
32
+ if @wallet.nil? || @wallet['access_token'].nil?
33
+ unless options[:quiet]
34
+ print_error yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
35
+ print_error yellow,"Use `login` to authenticate or try passing the --username option.",reset,"\n"
36
+ end
37
+ return 1
38
+ end
39
+ return 0
40
+ end
41
+
42
+ def handle(args)
43
+ # access-token get by default, except access-token -h should list the subcommands.
44
+ if args.empty? || (args[0] && args[0] =~ /^\-/ && !['-h', '--help'].include?(args[0]))
45
+ print_access_token(args)
46
+ else
47
+ handle_subcommand(args)
48
+ end
49
+ end
50
+
51
+ def details(args)
52
+ options = {}
53
+ params = {}
54
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
55
+ opts.banner = subcommand_usage()
56
+ build_common_options(opts, options, [:remote, :quiet])
57
+ opts.footer = "Print your current authentication credentials.\n" +
58
+ "This contains tokens that should be kept secret. Be careful."
59
+ end
60
+ optparse.parse!(args)
61
+ if args.count != 0
62
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
63
+ end
64
+ connect_result = connect(options)
65
+ return connect_result if (connect_result.is_a?(Numeric) && connect_result != 0)
66
+
67
+ # could fetch and show whoami info as well eh?
68
+ # extra api call though..
69
+
70
+ #print_h1 "MTN Cloud Credentials", [display_appliance(@appliance_name, @appliance_url)], options
71
+ print_h1 "Credentials", options
72
+ description_cols = {
73
+ "Username" => lambda {|wallet| wallet['username'] },
74
+ "Access Token" => lambda {|wallet| wallet['access_token'] },
75
+ "Refresh Token" => lambda {|wallet| wallet['refresh_token'] },
76
+ "Login Date" => lambda {|wallet| format_local_dt(wallet['login_date']) },
77
+ "Expire Date" => lambda {|wallet| wallet['expire_date'] ? format_local_dt(wallet['expire_date']) : "" },
78
+ "Remote" => lambda {|wallet| display_appliance(@appliance_name, @appliance_url) },
79
+ }
80
+ print cyan
81
+ puts as_description_list(@wallet, description_cols)
82
+ print reset
83
+ return 0
84
+ end
85
+
86
+ def print_access_token(args)
87
+ options = {}
88
+ params = {}
89
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
90
+ opts.banner = subcommand_usage()
91
+ build_common_options(opts, options, [:remote, :quiet])
92
+ opts.footer = "Print your current access token.\n" +
93
+ "This token should be kept secret. Be careful."
94
+ end
95
+ optparse.parse!(args)
96
+ if args.count != 0
97
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
98
+ end
99
+ connect_result = connect(options)
100
+ return connect_result if (connect_result.is_a?(Numeric) && connect_result != 0)
101
+ unless options[:quiet]
102
+ print cyan
103
+ puts @wallet['access_token']
104
+ print reset
105
+ end
106
+ return @wallet['access_token'] ? 0 : 1
107
+ end
108
+
109
+ def use_refresh_token(args)
110
+ options = {}
111
+ params = {}
112
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
113
+ opts.banner = subcommand_usage()
114
+ opts.on( '-T', '--token TOKEN', "Refresh Token to use. The saved credentials are used by default." ) do |val|
115
+ options[:refresh_token] = val
116
+ end
117
+ opts.on( '--token-file FILE', String, "Refresh Token File, read a file containing the refresh token." ) do |val|
118
+ token_file = File.expand_path(val)
119
+ if !File.exist?(token_file) || !File.file?(token_file)
120
+ raise ::OptionParser::InvalidOption.new("File not found: #{token_file}")
121
+ end
122
+ options[:refresh_token] = File.read(token_file).to_s.split("\n").first.strip
123
+ end
124
+ build_common_options(opts, options, [:auto_confirm, :remote, :dry_run, :json, :quiet], [:remote_username, :remote_password, :remote_token])
125
+ opts.footer = "Use the refresh token in your saved credentials, or a provided token.\n" +
126
+ "This will replace your current access and refresh tokens with a new values.\n" +
127
+ "Your current access token will be invalidated\n" +
128
+ "All other users or applications with access to your token will need to update to the new token."
129
+ end
130
+ optparse.parse!(args)
131
+ if args.count != 0
132
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
133
+ end
134
+
135
+ connect_result = connect(options)
136
+ return connect_result if (connect_result.is_a?(Numeric) && connect_result != 0)
137
+ # if @wallet.nil? || @wallet['access_token'].nil?
138
+ # unless options[:quiet]
139
+ # print_error yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
140
+ # print_error yellow,"Use `login` to authenticate or try passing the --username option.",reset,"\n"
141
+ # end
142
+ # return 1
143
+ # end
144
+ refresh_token_value = nil
145
+ if options[:refresh_token]
146
+ refresh_token_value = options[:refresh_token]
147
+ else
148
+ if @wallet['refresh_token']
149
+ refresh_token_value = @wallet['refresh_token']
150
+ else
151
+ unless options[:quiet]
152
+ print_error yellow,"No refresh token found for appliance #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
153
+ print_error yellow,"Use the 'login' command.",reset,"\n"
154
+ end
155
+ return 1
156
+ end
157
+ end
158
+ if options[:dry_run]
159
+ print_dry_run @api_client.auth.dry.use_refresh_token(refresh_token_value)
160
+ return 0
161
+ end
162
+ unless options[:quiet]
163
+ access_token = @wallet['access_token'].to_s
164
+ visible_part = access_token[0..7]
165
+ if visible_part
166
+ masked_access_token = visible_part + access_token[8..-1].gsub(/[^-]/, '*')
167
+ else
168
+ masked_access_token = access_token.gsub(/[^-]/, '*')
169
+ end
170
+ print cyan,"#{bold}WARNING!#{reset}#{cyan} You are about to invalidate your current access token '#{masked_access_token}'.",reset,"\n"
171
+ print cyan, "You will need to update everywhere this token is used.",reset, "\n"
172
+ end
173
+
174
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to refresh your access token?")
175
+ return 9, "aborted command"
176
+ end
177
+
178
+ # ok, let's use our refresh token
179
+ # this regenerates the current access token.
180
+ refresh_result = MtnCloud::Cli::Credentials.new(@appliance_name, @appliance_url).use_refresh_token(refresh_token_value, options)
181
+ new_wallet = refresh_result
182
+ if options[:json]
183
+ puts as_json(refresh_result, options)
184
+ return new_wallet ? 0 : 1
185
+ end
186
+ if new_wallet
187
+ unless options[:quiet]
188
+ print_green_success "Access token refreshed: #{new_wallet['access_token']}"
189
+ #print_green_success "Access token refreshed"
190
+ details([])
191
+ end
192
+ return 0
193
+ else
194
+ print_red_alert "Failed to use refresh token."
195
+ return 1
196
+ end
197
+ end
198
+
199
+ protected
200
+
201
+ end