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
data/test/test_case.rb ADDED
@@ -0,0 +1,342 @@
1
+ require 'test/unit'
2
+ # use a different default home directory when running tests
3
+ ENV['MTNCLOUD_CLI_HOME'] = ENV['TEST_CLI_HOME'] || File.join(Dir.home, ".mtncloud_test")
4
+ require 'mtncloud'
5
+ require 'test_config'
6
+ #require 'securerandom'
7
+
8
+ # hack needed for unit tests right now
9
+ MtnCloud::Cli.enable_test_mode()
10
+
11
+ module MtnCloudTest
12
+
13
+ # TestCase is the base class for all unit tests to provide standard behavior
14
+ # for testing CLI commands and API interfaces.
15
+ #
16
+ # +assert_execute+ is available to execute a CLI command or expression and assert the result is a success (exit:0) by default.
17
+ #
18
+ # +terminal+ is available to execute any commands eg. +terminal.execute("source foo")+
19
+ #
20
+ # +client+ is available for executing API requests
21
+ #
22
+ class TestCase < Test::Unit::TestCase
23
+ include MtnCloud::Cli::PrintHelper # printhelper for print_red_alert and what not.. should probably not be included in MtnCloudTest
24
+
25
+ # execute test cases in the order they are defined.
26
+ self.test_order = :defined
27
+
28
+ # indicates the test requires the user to have a current remote
29
+ # override this to return false if your tests do not require `remote use` as part of its setup
30
+ def requires_remote
31
+ true
32
+ end
33
+
34
+ # indicates the test requires the user to be logged in and authenticated
35
+ # override this to return false if your tests do not require `login` as part of its setup
36
+ def requires_authentication
37
+ true
38
+ end
39
+
40
+ # hook at the beginning of each test
41
+ def setup()
42
+ #puts "TestCase #{self} setup()"
43
+ # @config is provided for accessing test environment settings in our tests
44
+ @config = get_config()
45
+ # use the remote and login if needed
46
+ use_remote() if requires_remote
47
+ login_if_needed() if requires_authentication
48
+ end
49
+
50
+ # hook at the end of each test
51
+ def teardown()
52
+ #puts "TestCase #{self} teardown()"
53
+ #logout_if_needed() if requires_authentication
54
+ end
55
+
56
+ # def initialize(*args)
57
+ # obj = super(*args)
58
+ # @client = establish_test_terminal()
59
+ # end
60
+
61
+ protected
62
+
63
+ # @return [MtnCloud::APIClient] client for executing api requests in our tests and examining the results
64
+ def client
65
+ # todo: return terminal.get_api_client()
66
+ #@api_client ||= MtnCloud::APIClient.new(url: @config.url, username: @config.username, password: @config.password_decrypted, verify_ssl: false, client_id: 'morph-api')
67
+ #@api_client.login() unless @api_client.logged_in?
68
+ # this only works while logged in, fine for now...
69
+ @client ||= MtnCloud::APIClient.new(url: @config.url, username: @config.username, password: @config.password, access_token: get_access_token(), verify_ssl: false, client_id: 'morph-cli')
70
+ end
71
+
72
+
73
+
74
+ # Execute the command in the CLI terminal and assert the result
75
+ # By default, the result should be a success with exit code: 0 and error: nil
76
+ # @param [String] cmd the command or expression to be executed by the CLI terminal
77
+ # @param [Hash,String] opts. See +assert_command_result+ If passed as a String, then treated as failure message.
78
+ # @param [String] failure_message Optional message to use on failure used instead of the default "Expected command..."
79
+ #
80
+ # @example Assert a command succeeds with a 0 exit status
81
+ # assert_execute("whoami")
82
+ #
83
+ # @example Assert that a command fails with any non zero exit status
84
+ # assert_execute("foobar", success:false, "Expected unknown command to fail")
85
+ #
86
+ # @example Assert a specific exit status code
87
+ # assert_execute("foobar", exit:1, "Expected unknown command to fail")
88
+ #
89
+ def assert_execute(cmd, opts = {}, failure_message = nil)
90
+ #MtnCloud::Logging::DarkPrinter.puts(cmd)
91
+ opts = opts.is_a?(String) ? {failure_message:opts} : (opts || {})
92
+ result = terminal.execute(cmd)
93
+ assert_command_result(result, opts, failure_message)
94
+ end
95
+
96
+ # +assert_success()+ is an alias for +assert_execute()+
97
+ alias :assert_success :assert_execute
98
+
99
+ # Execute the command in the CLI terminal and assert that the result is in an error (exit non-0)
100
+ # @param [String] cmd the command or expression to be executed by the CLI terminal
101
+ # @param [Hash,String] opts. See +assert_command_result+ If passed as a String, then treated as failure message.
102
+ # @param [String] failure_message Optional message to use on failure used instead of the default "Expected command to succeed|fail..."
103
+ #
104
+ # @example Assert a command fails with an error
105
+ # assert_error("apps list --unknown-option", "Expected unknown option error")
106
+ #
107
+ def assert_error(cmd, opts = {}, failure_message = nil)
108
+ opts = opts.is_a?(String) ? {failure_message:opts} : (opts || {})
109
+ assert_execute(cmd, opts.merge(success:false), failure_message)
110
+ end
111
+
112
+
113
+ # Assert that a command is has the expected exit status and message
114
+ # The default behavior is to assert the result is successful, exit: 0, error: nil
115
+ # use {success:false} to assert non-zero
116
+ # or use {exit:1, error: "something bad happened"} to assert a specific error exit and/or message
117
+ # @param [Array] Result containing: [exit_code, error].
118
+ # @param [Hash,String] opts. Hash of options for assertion. If passed as a String, then treated as failure message.
119
+ # @option opts [true,false] :success Expect success (true) or failure (false). Default is +true+, set to +false+ to assert that an error occurs instead.
120
+ # @option opts [Integer] :exit Expect a specific exit status code. The default is 0 on success or anything but 0 for failure.
121
+ # @option opts [String] :failure Optional message to use on failure used instead of the default "Expected command to succe..."
122
+ # @param [String] failure_message Optional message to use on failure used instead of the default "Expected command to succeed|fail..."
123
+ def assert_command_result(result, opts = {}, failure_message = nil)
124
+ # determine what to assert
125
+ success = opts.key?(:success) ? opts[:success] : true
126
+ expected_code = opts[:exit] ? opts[:exit] : (success ? 0 : nil)
127
+ if expected_code && expected_code != 0
128
+ success = false
129
+ end
130
+ expected_message = opts[:error]
131
+ failure_message = failure_message || opts[:failure_message] || opts[:failure]
132
+ # parse command result
133
+ exit_code, err = MtnCloud::Cli::CliRegistry.parse_command_result(result)
134
+ # result assertions
135
+ if success
136
+ assert_equal([0, nil], [exit_code, err], failure_message || "Expected command to succeed with exit code: 0 and instead got exit code: #{exit_code.inspect}, error: #{err.inspect}")
137
+ else
138
+ if expected_code
139
+ assert_equal(expected_code, exit_code, failure_message || "Expected command to fail with exit code: #{expected_code.inspect} and instead got exit code: #{exit_code.inspect}, error: #{err.inspect}")
140
+ else
141
+ assert_not_equal(0, exit_code, failure_message || "Expected command to fail with exit code: (non-zero) and instead got exit code: #{exit_code.inspect}, error: #{err.inspect}")
142
+ end
143
+ if expected_message
144
+ assert_equal(expected_message, err, "Expected command to fail with error message: #{expected_message.inspect} and instead got error message: #{err.inspect}")
145
+ end
146
+ end
147
+ end
148
+
149
+ # Get the shared CLI terminal
150
+ # @return [MtnCloud::Terminal]
151
+ def terminal
152
+ # return MtnCloud::Terminal.instance
153
+ establish_test_terminal()
154
+ Thread.current[:terminal]
155
+ end
156
+
157
+ # Get the shared test configuration settings
158
+ # parses environment variables and config file to establish CLI environment
159
+ # @return [Map] containing :url, :username, etc., including :password!
160
+ def get_config(refresh=false)
161
+ Thread.current[:config] ||= TestConfig.new
162
+ end
163
+
164
+ # todo: make this work IOError unitialized stream right now
165
+ QUIET = ENV['QUIET'] ? true : false unless defined?(QUIET)
166
+
167
+ # Creates a remote for executing unit tests
168
+ # This requires the user to set environment variables: TEST_URL, TEST_USERNAME and TEST_PASSWORD or TEST_CONFIG
169
+ # By default, test_config.yaml in the current directory can be used.
170
+ # The home directory can be specified with TEST_HOME, and the default TEST_CONFIG filename is ~/.mtncloud_test
171
+ # returns the MtnCloud::Terminal instance for executing CLI commands
172
+ def establish_test_terminal()
173
+ if Thread.current[:terminal].nil?
174
+ config = get_config()
175
+
176
+ # create the terminal scoped to our test environment
177
+ terminal_opts = {homedir: config.homedir}
178
+ Thread.current[:terminal] = MtnCloud::Terminal.new(terminal_opts)
179
+
180
+ # debug is not a terminal option right now, set it this way instead...
181
+ if config.debug # || MtnCloud::Logging.debug?
182
+ # MtnCloud::Logging.set_log_level(MtnCloud::Logging::Logger::DEBUG)
183
+ terminal.execute("debug")
184
+ else
185
+ if QUIET
186
+ #blackhole = MtnCloud::Terminal::Blackhole.new('blackhole')
187
+ blackhole = File.open(MtnCloud::Cli.windows? ? 'NUL:' : '/dev/null', 'w')
188
+ terminal.set_stdout(blackhole)
189
+ terminal.set_stderr(blackhole)
190
+ end
191
+ end
192
+
193
+ #terminal.execute("remote get \"#{config.remote_name}\" -q || remote add \"#{config.remote_name}\" \"#{config.url}\" --insecure --use -N")
194
+ appliance = MtnCloud::Cli::Remote.load_remote(config.remote_name)
195
+ if appliance
196
+ # appliance already exists, update it if needed
197
+ if appliance[:url] != config.url
198
+ terminal.execute("remote update \"#{config.remote_name}\" --url \"#{escape_arg config.url}\" --insecure")
199
+ end
200
+ else
201
+ # create appliance
202
+ terminal.execute("remote add \"#{config.remote_name}\" \"#{escape_arg config.url}\" --insecure --use -N")
203
+ end
204
+ sleep 1
205
+ # use the remote
206
+ terminal.execute("remote use \"#{config.remote_name}\"")
207
+
208
+ # could skip this and just let the tests fail that require authentication...
209
+ # login right away to make sure credentials work before attempting to run test suite
210
+ # abort if bad credentials
211
+ #login_status_code, login_error = login()
212
+ login_results = terminal.execute(%(login "#{escape_arg config.username}" "#{escape_arg config.password_decrypted}"))
213
+ if login_results[0] == 0
214
+ #print_green_success "Established terminal to #{config.username}@#{config.url}\nStarting the test run now"
215
+ else
216
+ print_red_alert "Failed to login as #{config.username}@#{config.url}"
217
+ abort("Test run aborted")
218
+ exit 1
219
+ end
220
+ end
221
+ return Thread.current[:terminal]
222
+ end
223
+
224
+ # use the test remote quietly
225
+ def use_remote()
226
+ config = get_config()
227
+ terminal.execute %(remote use #{config.remote_name} --quiet)
228
+ end
229
+
230
+ alias :remote_use :use_remote
231
+
232
+ # @return [true|false]
233
+ def is_logged_in()
234
+ return get_access_token() != nil
235
+ end
236
+
237
+ # Fetch the access token for the current remote.
238
+ # @return [String,nil]
239
+ def get_access_token()
240
+ config = get_config()
241
+ appliance = MtnCloud::Cli::Remote.load_remote(config.remote_name)
242
+ if appliance.nil?
243
+ #abort("test appliance not found #{config.remote_name}")
244
+ return nil
245
+ end
246
+ wallet = ::MtnCloud::Cli::Credentials.new(appliance[:name], nil).load_saved_credentials()
247
+ if wallet.nil?
248
+ return nil
249
+ end
250
+ return wallet['access_token']
251
+ end
252
+
253
+ def login_if_needed()
254
+ if !is_logged_in()
255
+ login()
256
+ end
257
+ end
258
+
259
+ def logout_if_needed()
260
+ if is_logged_in()
261
+ logout()
262
+ end
263
+ end
264
+
265
+ # def login()
266
+ # config = get_config()
267
+ # result = terminal.execute(%(login "#{escape_arg config.username}" "#{escape_arg config.password_decrypted}" --quiet))
268
+ # exit_code, err = MtnCloud::Cli::CliRegistry.parse_command_result(result)
269
+ # if exit_code != 0
270
+ # abort("Failed to login as #{config.username}@#{config.url}")
271
+ # else
272
+ # # hooray
273
+ # end
274
+ # end
275
+
276
+ def login()
277
+ config = get_config()
278
+ terminal.execute(%(login "#{escape_arg config.username}" "#{escape_arg config.password_decrypted}" --quiet))
279
+ end
280
+
281
+ def logout()
282
+ terminal.execute("logout --quiet")
283
+ end
284
+
285
+ # login to execute block and return to previous logged in/out state
286
+ def with_authentication(&block)
287
+ was_logged_out = !is_logged_in()
288
+ login_if_needed()
289
+ result = block.call()
290
+ logout_if_needed() if was_logged_out
291
+ return result
292
+ end
293
+
294
+ # logout to execute block and return to previous logged in/out state
295
+ def without_authentication(&block)
296
+ was_logged_in = is_logged_in()
297
+ logout_if_needed()
298
+ result = block.call()
299
+ login_if_needed() if was_logged_in
300
+ return result
301
+ end
302
+
303
+ # send input to CLI terminal stdin to handle interactive prompting
304
+ def with_input(*messages, &block)
305
+ with_tmpfile_input(*messages, &block)
306
+ end
307
+
308
+ # send input to CLI shell stdin to handle interactive prompting
309
+ # def with_shell_input(*messages, &block)
310
+ # with_tmpfile_input(*messages, &block)
311
+ # end
312
+
313
+ # Set stdin to a File (Readline requires a File object for input=)
314
+ # this way works for all testing purposes
315
+ def with_tmpfile_input(*messages, &block)
316
+ messages = messages.flatten #.compact
317
+ original_stdin = $stdin
318
+ #todo: use temp directory...
319
+ tmpfilename = ".cli_unit_test_shell_input_#{SecureRandom.hex(10)}.mtncloud"
320
+ file = nil
321
+ begin
322
+ File.open(tmpfilename, 'w+') {|f| f.write(messages.join("\n") + "\n") }
323
+ file = File.new(tmpfilename, 'r')
324
+ Readline.input = file
325
+ $stdin = file
326
+ yield
327
+ ensure
328
+ Readline.input = original_stdin
329
+ $stdin = original_stdin
330
+ file.close if file && !file.closed?
331
+ File.delete(tmpfilename) if File.exist?(tmpfilename)
332
+ end
333
+ end
334
+
335
+ # escape double quotes for interpolating values between double quotes in your terminal command arguments
336
+ def escape_arg(value)
337
+ # escape double quotes
338
+ value.to_s.gsub("\"", "\\\"")
339
+ end
340
+
341
+ end
342
+ end
@@ -0,0 +1,137 @@
1
+ # use a different default home directory when running tests
2
+ ENV['MTNCLOUD_CLI_HOME'] = ENV['TEST_CLI_HOME'] || File.join(Dir.home, ".mtncloud_test") unless ENV['MTNCLOUD_CLI_HOME']
3
+ require 'mtncloud'
4
+
5
+ module MtnCloudTest
6
+
7
+ # TestConfig handles parsing of the MTN Cloud test config settings
8
+ # This parses environment variables or a config file, the latter takes priority
9
+ # The default config file named +test_config.yaml+
10
+ class TestConfig
11
+ include MtnCloud::Cli::PrintHelper # for parse_json_or_yaml() todo: remove this include and use a class method
12
+
13
+ # The default filename for the test config
14
+ DEFAULT_FILENAME = 'test_config.yaml'
15
+
16
+ # The environment variables that are parsed and the corresponding config property name
17
+ ENVIRONMENT_VARIABLES = {
18
+ # "TEST_CLI_HOME" => :homedir,
19
+ "TEST_REMOTE_NAME" => :remote_name,
20
+ "TEST_REMOTE_URL" => :url,
21
+ "TEST_URL" => :url,
22
+ "TEST_USERNAME" => :username,
23
+ "TEST_PASSWORD" => :password,
24
+ "TEST_DEBUG" => :debug,
25
+ "DEBUG" => :debug,
26
+ }.freeze
27
+
28
+ # The default name of the remote to create and do our unit testing in
29
+ DEFAULT_REMOTE_NAME = 'unit_test'
30
+
31
+ # use a different default home directory when running tests
32
+ # load settings from environment variables and config file
33
+ # unless ENV['MTNCLOUD_CLI_HOME']
34
+ # ENV['MTNCLOUD_CLI_HOME'] = File.join(Dir.home, ".mtncloud_test")
35
+ # end
36
+ # The default name of the remote to create and use for unit testing
37
+ DEFAULT_HOMEDIR = MtnCloud::Cli.home_directory
38
+
39
+ # raised if the config cannot be parsed or is missing required settings
40
+ class BadConfigError < StandardError
41
+ end
42
+
43
+ attr_accessor :homedir, :remote_name, :url, :username
44
+ attr_writer :password
45
+ attr_reader :debug
46
+
47
+ def initialize
48
+ # set defaults
49
+ @remote_name = DEFAULT_REMOTE_NAME # 'unit_test'
50
+ @homedir = DEFAULT_HOMEDIR # MtnCloud::Cli.home_directory
51
+
52
+ # load settings from environment variable and set instance variables
53
+ #ENVIRONMENT_VARIABLES.each { |name, value| instance_variable_set("@#{name}", ENV[name]) if ENV[name] }
54
+ ENVIRONMENT_VARIABLES.each { |name, value| send("#{value}=", ENV[name]) if ENV[name] }
55
+
56
+ # load settings from config file
57
+ config_filename = nil
58
+ if ENV['TEST_CONFIG']
59
+ config_filename = ENV['TEST_CONFIG']
60
+ elsif File.exist?(DEFAULT_FILENAME)
61
+ config_filename = DEFAULT_FILENAME
62
+ elsif File.exist?(File.join(homedir, DEFAULT_FILENAME))
63
+ config_filename = File.join(@homedir, DEFAULT_FILENAME)
64
+ end
65
+ if config_filename
66
+ full_filename = File.expand_path(config_filename)
67
+ file_content = nil
68
+ if File.exist?(full_filename)
69
+ file_content = File.read(full_filename)
70
+ else
71
+ raise "Test config file not found: #{full_filename}"
72
+ end
73
+ parse_result = parse_json_or_yaml(file_content)
74
+ config_map = parse_result[:data]
75
+ if config_map.nil?
76
+ bad_config "Failed to parse test config file '#{config_filename}' as YAML or JSON. Error: #{parse_result[:error]}"
77
+ end
78
+ @homedir = config_map['homedir'] if config_map['homedir']
79
+ @remote_name = config_map['remote_name'] if config_map['remote_name']
80
+ @url = (config_map['url'] || config_map['remote_url']) if (config_map['url'] || config_map['remote_url'])
81
+ @username = config_map['username'] if config_map['username']
82
+ @password = config_map['password'] if config_map['password']
83
+ @debug = config_map['debug'].to_s.strip.downcase == "true" if config_map.key?('debug')
84
+ end
85
+
86
+ # print_h1 "Test Config"
87
+ # print cyan
88
+ # puts "homedir: #{homedir}"
89
+ # puts "remote_name: #{remote_name}"
90
+ # puts "url: #{url}"
91
+ # puts "username: #{username}"
92
+ # puts "password: #{password}"
93
+ # print reset
94
+
95
+ # validate now
96
+ # For now force user to create a test_config.yaml or use environment variables
97
+ if remote_name.to_s.empty?
98
+ bad_config "Unable to execute unit tests without specifying a remote name.\nYou must specify the environment variable TEST_REMOTE_NAME=unit_test\nor in a config file named #{config_filename || 'test_config.yaml'} like this:\n\nremote_name: unit_test\n"
99
+ end
100
+ if url.to_s.empty?
101
+ bad_config "Unable to execute unit tests without specifying a url.\nThis can be specified with the environment variable TEST_URL=https://test-appliance\nor in a config file named #{config_filename || 'test_config.yaml'} like this:\n\nurl: https://test-appliance\n"
102
+ end
103
+ if username.to_s.empty?
104
+ bad_config "Unable to execute unit tests without specifying a username.\nThis can be specified with the environment variable TEST_USERNAME=testrunner\nor in a config file named #{config_filename || 'test_config.yaml'} like this:\n\nusername: testrunner\n"
105
+ end
106
+ if password.to_s.empty?
107
+ bad_config "Unable to execute unit tests without specifying a password.\nThis can be specified with the environment variable TEST_PASSWORD='SecretPassword123$'\nor in a config file named #{config_filename || 'test_config.yaml'} like this:\n\npassword: 'SecretPassword123$'\n"
108
+ end
109
+ # debug is not a terminal method right now, set it this way to enable mtncloud debugging right away
110
+ if debug
111
+ MtnCloud::Logging.set_log_level(MtnCloud::Logging::Logger::DEBUG)
112
+ end
113
+
114
+ # todo: test authentication now...
115
+ # config looks good
116
+ end
117
+
118
+ def password
119
+ @password ? ('*' * 12) : nil
120
+ end
121
+
122
+ def password_decrypted
123
+ @password
124
+ end
125
+
126
+ def debug=(v)
127
+ @debug = v.to_s.strip.downcase == "true"
128
+ end
129
+
130
+ def bad_config(msg)
131
+ #todo: make this work with raise but also don't run every test so just abort for now
132
+ #raise BadConfigError.new(msg)
133
+ print_red_alert msg
134
+ abort("Aborting tests...")
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,97 @@
1
+ module MtnCloudTest
2
+
3
+ # Mixin to provide loading test data / fixtures for tests
4
+ module TestDataHelper
5
+
6
+ def self.included(base)
7
+ #base.extend ClassMethods
8
+ #todo: load test/fixtures/*yaml
9
+ end
10
+
11
+ protected
12
+
13
+ ## Instances
14
+
15
+ def find_first_instance_id()
16
+ instance_id = client.instances.list({})['instances'].collect {|it| it['id'] }.first
17
+ assert_not_nil instance_id, "Failed to find an instance to test with"
18
+ return instance_id
19
+ end
20
+
21
+ def find_many_instance_ids()
22
+ instance_ids = client.instances.list({})['instances'].collect {|it| it['id'] }.first(5)
23
+ assert instance_ids.size > 1, "Failed to find many instances to test with"
24
+ return instance_ids
25
+ end
26
+
27
+ # populates test with the following data as instance variables
28
+ # @container - Container
29
+ # @id - Container id
30
+ #todo: create a container instead...
31
+ # maybe just warn and omit the test, but it asserts and fails now...
32
+ # instead of env, have a test/fixtures/test-instance-payload.json or
33
+ # or maybe put it in the test_config.yaml under fixtures.
34
+ def load_instance_test_data()
35
+ # todo: cache this , maybe Thread.current for now...
36
+ @id = nil
37
+
38
+ test_instance_id = ENV['TEST_INSTANCE_ID']
39
+ if test_instance_id
40
+ # use the first container in our test instance
41
+ @instance = client.instances.get(test_instance_id.to_i)['instance']
42
+ # rescue ::RestClient::Exception => e on 404
43
+ assert_not_nil @instance, "Test instance #{test_instance_id} was not found!"
44
+ @container = client.containers.get(@instance['containers'].first)['container']
45
+ @id = @instance['id']
46
+ end
47
+ assert_not_nil @id, "A test instance must be specified to run this test.\nTry setting environment variable TEST_CONTAINER_ID=42 or TEST_INSTANCE_ID=99"
48
+ end
49
+
50
+ ## Containers
51
+
52
+ def find_first_container_id()
53
+ container_id = client.instances.list({})['instances'].collect {|it| it['containers'] }.flatten.uniq.first
54
+ assert_not_nil container_id, "Failed to find a container to test with"
55
+ return container_id
56
+ end
57
+
58
+ def find_many_container_ids()
59
+ container_ids = client.instances.list({})['instances'].collect {|it| it['containers'] }.flatten.uniq.first(5)
60
+ assert container_ids.size > 1, "Failed to find many containers to test with"
61
+ return container_ids
62
+ end
63
+
64
+ # populates test with the following data as instance variables
65
+ # @container - Container
66
+ # @id - Container id
67
+ #todo: create a container instead...
68
+ # maybe just warn and omit the test, but it asserts and fails now...
69
+ # instead of env, have a test/fixtures/test-instance-payload.json or
70
+ # or maybe put it in the test_config.yaml under fixtures.
71
+ def load_container_test_data()
72
+ # todo: cache this , maybe Thread.current for now...
73
+ @id = nil
74
+ test_container_id = ENV['TEST_CONTAINER_ID']
75
+ test_instance_id = ENV['TEST_INSTANCE_ID']
76
+ if test_container_id
77
+ # use our test container
78
+ @container = client.containers.get(test_container_id)['container']
79
+ # rescue ::RestClient::Exception => e on 404
80
+ assert_not_nil @container, "Container #{test_container_id} was not found"
81
+ @id = @container['id']
82
+ elsif test_instance_id
83
+ # use the first container in our test instance
84
+ @instance = client.instances.get(test_instance_id.to_i)['instance']
85
+ # rescue ::RestClient::Exception => e on 404
86
+ assert_not_nil @instance, "Test instance #{test_instance_id} was not found!"
87
+ assert_not_nil @instance['containers'].first, "Instance #{@instance['id']} does not have any containers\nTry setting environment variable TEST_CONTAINER_ID=42"
88
+ @container = client.containers.get(@instance['containers'].first)['container']
89
+ assert_not_nil @container, "Container #{@instance['containers'].first} was not found"
90
+ @id = @container['id']
91
+ end
92
+ assert_not_nil @id, "A test container must be specified to run this test.\nTry setting environment variable TEST_CONTAINER_ID=42 or TEST_INSTANCE_ID=99"
93
+ end
94
+
95
+ end
96
+
97
+ end