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,724 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::ReportsCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ set_command_name :reports
6
+
7
+ def initialize()
8
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
9
+ end
10
+
11
+ def connect(opts)
12
+ @api_client = establish_remote_appliance_connection(opts)
13
+ @reports_interface = @api_client.reports
14
+ end
15
+
16
+ register_subcommands :list, :get, :run, :view, :export, :remove
17
+ register_subcommands :'list-types' => :list_types
18
+ register_subcommands :'get-type' => :get_type
19
+ alias_subcommand :types, :'list-types'
20
+
21
+ def default_refresh_interval
22
+ 5
23
+ end
24
+
25
+ def handle(args)
26
+ handle_subcommand(args)
27
+ end
28
+
29
+ def list(args)
30
+ options = {}
31
+ params = {}
32
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
33
+ opts.banner = subcommand_usage()
34
+ opts.on( '--type CODE', String, "Report Type code(s)" ) do |val|
35
+ params['reportType'] = val.to_s.split(",").compact.collect {|it| it.strip }
36
+ end
37
+ build_common_options(opts, options, [:list, :query, :json, :dry_run, :remote])
38
+ opts.footer = "List report history."
39
+ end
40
+ optparse.parse!(args)
41
+ connect(options)
42
+ begin
43
+ params.merge!(parse_list_options(options))
44
+ @reports_interface.setopts(options)
45
+ if options[:dry_run]
46
+ print_dry_run @reports_interface.dry.list(params)
47
+ return
48
+ end
49
+
50
+ json_response = @reports_interface.list(params)
51
+ if options[:json]
52
+ puts as_json(json_response, options)
53
+ return 0
54
+ end
55
+ report_results = json_response['reportResults']
56
+
57
+ title = "Report History"
58
+ subtitles = []
59
+ if params['type']
60
+ subtitles << "Type: #{params[:type]}".strip
61
+ end
62
+ subtitles += parse_list_subtitles(options)
63
+ print_h1 title, subtitles
64
+
65
+ if report_results.empty?
66
+ print cyan, "No report results found", reset, "\n"
67
+ else
68
+ columns = {
69
+ "ID" => 'id',
70
+ "TITLE" => lambda {|it| truncate_string(it['reportTitle'], 50) },
71
+ "FILTERS" => lambda {|it| truncate_string(it['filterTitle'], 30) },
72
+ "REPORT TYPE" => lambda {|it| it['type'].is_a?(Hash) ? it['type']['name'] : it['type'] },
73
+ "DATE RUN" => lambda {|it| format_local_dt(it['dateCreated']) },
74
+ "CREATED BY" => lambda {|it| it['createdBy'].is_a?(Hash) ? it['createdBy']['username'] : it['createdBy'] },
75
+ "STATUS" => lambda {|it| format_report_status(it) }
76
+ }
77
+ # custom pretty table columns ...
78
+ if options[:include_fields]
79
+ columns = options[:include_fields]
80
+ end
81
+ print as_pretty_table(report_results, columns, options)
82
+ print reset
83
+ print_results_pagination(json_response)
84
+ end
85
+
86
+ print reset,"\n"
87
+ return 0
88
+ rescue RestClient::Exception => e
89
+ print_rest_exception(e, options)
90
+ exit 1
91
+ end
92
+ end
93
+
94
+ def get(args)
95
+ original_args = args.dup
96
+ options = {}
97
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
98
+ opts.banner = subcommand_usage("[id]")
99
+ opts.on('--refresh [SECONDS]', String, "Refresh until status is ready,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
100
+ options[:refresh_until_status] ||= "ready,failed"
101
+ if !val.to_s.empty?
102
+ options[:refresh_interval] = val.to_f
103
+ end
104
+ end
105
+ opts.on('--refresh-until STATUS', String, "Refresh until a specified status is reached.") do |val|
106
+ options[:refresh_until_status] = val.to_s.downcase
107
+ end
108
+ opts.on('--rows', '--rows', "Print Report Data rows too.") do
109
+ options[:show_data_rows] = true
110
+ end
111
+ opts.on('--view', '--view', "View report result in web browser too.") do
112
+ options[:view_report] = true
113
+ end
114
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :outfile, :dry_run, :remote])
115
+ opts.footer = "Get details about a report result." + "\n"
116
+ + "[id] is required. This is the id of the report result."
117
+ end
118
+ optparse.parse!(args)
119
+ if args.count != 1
120
+ print_error MtnCloud::Terminal.angry_prompt
121
+ puts_error "#{command_name} missing argument: [id]\n#{optparse}"
122
+ return 1
123
+ end
124
+ connect(options)
125
+ begin
126
+ @reports_interface.setopts(options)
127
+ if options[:dry_run]
128
+ print_dry_run @reports_interface.dry.get(args[0].to_i)
129
+ return 0
130
+ end
131
+
132
+ report_result = find_report_result_by_id(args[0])
133
+ return 1 if report_result.nil?
134
+ json_response = {'reportResult' => report_result} # skip redundant request
135
+ # json_response = @reports_interface.get(report['id'])
136
+ #report_result = json_response['reportResult']
137
+
138
+ # if options[:json]
139
+ # puts as_json(json_response, options)
140
+ # return 0
141
+ # end
142
+ # render_with_format() handles json,yaml,csv,outfile,etc
143
+ render_result = render_with_format(json_response, options, 'reportResult')
144
+ if render_result
145
+ #return render_result
146
+ else
147
+ print_h1 "Report Details"
148
+ print cyan
149
+
150
+ description_cols = {
151
+ "ID" => 'id',
152
+ "Title" => lambda {|it| it['reportTitle'] },
153
+ "Filters" => lambda {|it| it['filterTitle'] },
154
+ "Report Type" => lambda {|it| it['type'].is_a?(Hash) ? it['type']['name'] : it['type'] },
155
+ "Date Run" => lambda {|it| format_local_dt(it['dateCreated']) },
156
+ "Created By" => lambda {|it| it['createdBy'].is_a?(Hash) ? it['createdBy']['username'] : it['createdBy'] },
157
+ "Status" => lambda {|it| format_report_status(it) }
158
+ }
159
+ print_description_list(description_cols, report_result)
160
+
161
+ # todo:
162
+ # 1. format raw output better.
163
+ # 2. write rendering methods for all the various types...
164
+ if options[:show_data_rows]
165
+ print_h2 "Report Data Rows"
166
+ print cyan
167
+ if report_result['rows']
168
+ # report_result['rows'].each_with_index do |row, index|
169
+ # print "#{index}: ", row, "\n"
170
+ # end
171
+ term_width = current_terminal_width()
172
+ data_width = term_width.to_i - 30
173
+ if data_width < 0
174
+ data_wdith = 10
175
+ end
176
+ puts as_pretty_table(report_result['rows'], options[:include_fields] || {
177
+ "ID" => lambda {|it| it['id'] },
178
+ "SECTION" => lambda {|it| it['section'] },
179
+ "DATA" => lambda {|it| truncate_string(it['data'], data_width) }
180
+ }, options.merge({:wrap => true}))
181
+
182
+ else
183
+ print yellow, "No report data found.", reset, "\n"
184
+ end
185
+ end
186
+
187
+ print reset,"\n"
188
+ end
189
+
190
+ # refresh until a status is reached
191
+ if options[:refresh_until_status]
192
+ if options[:refresh_interval].nil? || options[:refresh_interval].to_f < 0
193
+ options[:refresh_interval] = default_refresh_interval
194
+ end
195
+ statuses = options[:refresh_until_status].to_s.downcase.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
196
+ if !statuses.include?(report_result['status'])
197
+ print cyan, "Refreshing in #{options[:refresh_interval] > 1 ? options[:refresh_interval].to_i : options[:refresh_interval]} seconds"
198
+ sleep_with_dots(options[:refresh_interval])
199
+ print "\n"
200
+ get(original_args)
201
+ end
202
+ end
203
+ if options[:view_report]
204
+ view([report_result['id']])
205
+ end
206
+ return 0
207
+ rescue RestClient::Exception => e
208
+ print_rest_exception(e, options)
209
+ return 1
210
+ end
211
+ end
212
+
213
+ def run(args)
214
+ params = {}
215
+ do_refresh = true
216
+ options = {:options => {}}
217
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
218
+ opts.banner = subcommand_usage("[type] [options]")
219
+ opts.on( '--type CODE', String, "Report Type code" ) do |val|
220
+ options[:options]['type'] = val
221
+ end
222
+ # opts.on( '--title TITLE', String, "Title for the report" ) do |val|
223
+ # options[:options]['reportTitle'] = val
224
+ # end
225
+ opts.on(nil, '--no-refresh', "Do not refresh until finished" ) do
226
+ do_refresh = false
227
+ end
228
+ opts.on('--rows', '--rows', "Print Report Data rows too.") do
229
+ options[:show_data_rows] = true
230
+ end
231
+ opts.on('--view', '--view', "View report result in web browser when it is finished.") do
232
+ options[:view_report] = true
233
+ end
234
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
235
+ opts.footer = "Run a report to generate a new result." + "\n" +
236
+ "[type] is required. This is code of the report type."
237
+ end
238
+ optparse.parse!(args)
239
+ if args.count > 1
240
+ raise_command_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
241
+ end
242
+ if args[0]
243
+ options[:options]['type'] = args[0]
244
+ end
245
+ connect(options)
246
+ begin
247
+
248
+ # construct payload
249
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
250
+ payload = nil
251
+ if options[:payload]
252
+ payload = options[:payload]
253
+ payload.deep_merge!({'report' => passed_options}) unless passed_options.empty?
254
+ else
255
+ # prompt for resource folder options
256
+ payload = {
257
+ 'report' => {
258
+ }
259
+ }
260
+ # allow arbitrary -O options
261
+ payload.deep_merge!({'report' => passed_options}) unless passed_options.empty?
262
+
263
+ # Report Type
264
+ @all_report_types ||= @reports_interface.types({max: 1000})['reportTypes'] || []
265
+ report_types_dropdown = @all_report_types.collect {|it| {"name" => it["name"], "value" => it["code"]} }
266
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Report Type', 'type' => 'select', 'selectOptions' => report_types_dropdown, 'required' => true}], options[:options], @api_client)
267
+ payload['report']['type'] = v_prompt['type']
268
+ # convert name/code/id to code
269
+ report_type = find_report_type_by_name_or_code_id(payload['report']['type'])
270
+ return 1 if report_type.nil?
271
+ payload['report']['type'] = report_type['code']
272
+
273
+ # Report Types tell us what the available filters are...
274
+ report_option_types = report_type['optionTypes'] || []
275
+ # report_option_types = report_option_types.collect {|it|
276
+ # it['fieldContext'] = nil
277
+ # it
278
+ # }
279
+ # pluck out optionTypes like the UI does..
280
+ metadata_option_type = nil
281
+ if report_option_types.find {|it| it['fieldName'] == 'metadata' }
282
+ metadata_option_type = report_option_types.delete_if {|it| it['fieldName'] == 'metadata' }
283
+ end
284
+
285
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(report_option_types, options[:options], @api_client)
286
+ payload.deep_merge!({'report' => v_prompt}) unless v_prompt.empty?
287
+
288
+ # strip out fieldContext: 'config' please
289
+ # just report.startDate instead of report.config.startDate
290
+ if payload['report']['config'].is_a?(Hash)
291
+ payload['report']['config']
292
+ payload['report'].deep_merge!(payload['report'].delete('config'))
293
+ end
294
+
295
+ if metadata_option_type
296
+ if !options[:options]['metadata']
297
+ metadata_filter = prompt_metadata(options)
298
+ if metadata_filter && !metadata_filter.empty?
299
+ payload['report']['metadata'] = metadata_filter
300
+ end
301
+ end
302
+ end
303
+
304
+ end
305
+
306
+
307
+ if check_payload_dates(payload)
308
+ print_green_success "The CLI generates a query that will use only month and year. However, the API does support yyyy-mm-dd from a previous version of the appliance.\nReplace startMonth/endMonth keys with startDate,endDate ie:"
309
+ payload['report'].delete('startMonth')
310
+ payload['report'].delete('endMonth')
311
+ payload['report']['startDate'] = 'yyyy-mm-dd'
312
+ payload['report']['endDate'] = 'yyyy-mm-dd'
313
+ print_dry_run @reports_interface.dry.create(payload)
314
+ return 0
315
+ end
316
+
317
+ @reports_interface.setopts(options)
318
+ if options[:dry_run]
319
+ print_dry_run @reports_interface.dry.create(payload)
320
+ return 0
321
+ end
322
+ json_response = @reports_interface.create(payload)
323
+ if options[:json]
324
+ puts as_json(json_response, options)
325
+ return 0
326
+ end
327
+
328
+ print_green_success "Created report result #{json_response['reportResult']['id']}"
329
+ print_args = [json_response['reportResult']['id']]
330
+ print_args << "--refresh" if do_refresh
331
+ print_args << "--rows" if options[:show_data_rows]
332
+ print_args << "--view" if options[:view_report]
333
+ get(print_args)
334
+ return 0
335
+ rescue RestClient::Exception => e
336
+ print_rest_exception(e, options)
337
+ exit 1
338
+ end
339
+ end
340
+
341
+ def view(args)
342
+ options = {}
343
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
344
+ opts.banner = subcommand_usage("[id]")
345
+ build_common_options(opts, options, [:dry_run, :remote])
346
+ opts.footer = "View a report result in a web browser" + "\n" +
347
+ "[id] is required. This is the id of the report result."
348
+ end
349
+ optparse.parse!(args)
350
+ if args.count != 1
351
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
352
+ end
353
+ connect(options)
354
+ begin
355
+ report_result = find_report_result_by_id(args[0])
356
+ return 1 if report_result.nil?
357
+
358
+ link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/operations/reports/#{report_result['type']['code']}/results/#{report_result['id']}%3Fcontext=results"
359
+
360
+ if options[:dry_run]
361
+ puts MtnCloud::Util.open_url_command(link)
362
+ return 0
363
+ end
364
+ return MtnCloud::Util.open_url(link)
365
+ rescue RestClient::Exception => e
366
+ print_rest_exception(e, options)
367
+ exit 1
368
+ end
369
+ end
370
+
371
+ def export(args)
372
+ params = {}
373
+ report_format = 'json'
374
+ options = {}
375
+ outfile = nil
376
+ do_overwrite = false
377
+ do_mkdir = false
378
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
379
+ opts.banner = subcommand_usage("[id] [file]")
380
+ opts.on( '--format VALUE', String, "Report Format for exported file, json or csv. Default is json." ) do |val|
381
+ report_format = val
382
+ end
383
+ opts.on( '-f', '--force', "Overwrite existing [local-file] if it exists." ) do
384
+ do_overwrite = true
385
+ # do_mkdir = true
386
+ end
387
+ opts.on( '-p', '--mkdir', "Create missing directories for [local-file] if they do not exist." ) do
388
+ do_mkdir = true
389
+ end
390
+ build_common_options(opts, options, [:dry_run, :remote])
391
+ opts.footer = "Export a report result as json or csv." + "\n" +
392
+ "[id] is required. This is id of the report result." + "\n" +
393
+ "[file] is required. This is local destination for the downloaded file."
394
+ end
395
+ optparse.parse!(args)
396
+ if args.count != 2
397
+ raise_command_error "wrong number of arguments, expected 2 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
398
+ end
399
+ connect(options)
400
+ begin
401
+ report_result = find_report_result_by_id(args[0])
402
+ return 1 if report_result.nil?
403
+
404
+ outfile = args[1]
405
+ outfile = File.expand_path(outfile)
406
+ if outfile =~ /\.csv\Z/i
407
+ report_format = "csv"
408
+ end
409
+
410
+ if Dir.exist?(outfile)
411
+ print_red_alert "[file] is invalid. It is the name of an existing directory: #{outfile}"
412
+ return 1
413
+ end
414
+ destination_dir = File.dirname(outfile)
415
+ if !Dir.exist?(destination_dir)
416
+ if do_mkdir
417
+ print cyan,"Creating local directory #{destination_dir}",reset,"\n"
418
+ FileUtils.mkdir_p(destination_dir)
419
+ else
420
+ print_red_alert "[file] is invalid. Directory not found: #{destination_dir}"
421
+ return 1
422
+ end
423
+ end
424
+ if File.exist?(outfile)
425
+ if do_overwrite
426
+ # uhh need to be careful wih the passed filepath here..
427
+ # don't delete, just overwrite.
428
+ # File.delete(outfile)
429
+ else
430
+ print_error MtnCloud::Terminal.angry_prompt
431
+ puts_error "[file] is invalid. File already exists: #{outfile}", "Use -f to overwrite the existing file."
432
+ # puts_error optparse
433
+ return 1
434
+ end
435
+ end
436
+
437
+ @reports_interface.setopts(options)
438
+ if options[:dry_run]
439
+ print_dry_run @reports_interface.dry.export(report_result['id'], outfile, params, report_format)
440
+ return 0
441
+ end
442
+ json_response = @reports_interface.export(report_result['id'], outfile, params, report_format)
443
+ print_green_success "Exported report result #{report_result['id']} to file #{outfile}"
444
+ return 0
445
+ rescue RestClient::Exception => e
446
+ print_rest_exception(e, options)
447
+ exit 1
448
+ end
449
+ end
450
+
451
+ def remove(args)
452
+ options = {}
453
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
454
+ opts.banner = subcommand_usage("[id]")
455
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
456
+ opts.footer = "Delete a report result." + "\n" +
457
+ "[id] is required. This is id of the report result."
458
+ end
459
+ optparse.parse!(args)
460
+ if args.count != 1
461
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
462
+ end
463
+ connect(options)
464
+ begin
465
+ report_result = find_report_result_by_id(args[0])
466
+ return 1 if report_result.nil?
467
+
468
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the report result: #{report_result['id']}?")
469
+ return 9, "aborted command"
470
+ end
471
+
472
+ @reports_interface.setopts(options)
473
+ if options[:dry_run]
474
+ print_dry_run @reports_interface.dry.destroy(report_result['id'])
475
+ return
476
+ end
477
+ json_response = @reports_interface.destroy(report_result['id'])
478
+ if options[:json]
479
+ puts as_json(json_response, options)
480
+ return 0
481
+ end
482
+ print_green_success "Deleted report result #{report_result['id']}"
483
+ #list([])
484
+ return 0
485
+ rescue RestClient::Exception => e
486
+ print_rest_exception(e, options)
487
+ exit 1
488
+ end
489
+ end
490
+
491
+ def list_types(args)
492
+ params = {}
493
+ options = {}
494
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
495
+ opts.banner = subcommand_usage()
496
+ build_standard_list_options(opts, options)
497
+ opts.footer = "List report types."
498
+ end
499
+ optparse.parse!(args)
500
+ if args.count > 0
501
+ options[:phrase] = args.join(" ")
502
+ end
503
+ connect(options)
504
+ params.merge!(parse_list_options(options))
505
+
506
+ @reports_interface.setopts(options)
507
+ if options[:dry_run]
508
+ print_dry_run @reports_interface.dry.types(params)
509
+ return
510
+ end
511
+
512
+ json_response = @reports_interface.types(params)
513
+ report_types = json_response['reportTypes']
514
+ render_response(json_response, options, 'reportTypes') do
515
+ title = "Report Types"
516
+ subtitles = []
517
+ subtitles += parse_list_subtitles(options)
518
+ print_h1 title, subtitles
519
+
520
+ report_types = json_response['reportTypes']
521
+
522
+ if report_types.empty?
523
+ print cyan,"No report types found.",reset,"\n"
524
+ else
525
+ columns = {
526
+ "NAME" => 'name',
527
+ "CODE" => 'code'
528
+ }
529
+ # custom pretty table columns ...
530
+ if options[:include_fields]
531
+ columns = options[:include_fields]
532
+ end
533
+ print as_pretty_table(report_types, columns, options)
534
+ print reset
535
+ if json_response['meta']
536
+ print_results_pagination(json_response)
537
+ else
538
+ print_results_pagination({'meta'=>{'total'=>(report_types.size),'size'=>report_types.size,'max'=>(params['max']||25),'offset'=>(params['offset']||0)}})
539
+ end
540
+ end
541
+ print reset,"\n"
542
+ end
543
+ if report_types.empty?
544
+ return 1, "no report types found"
545
+ else
546
+ return 0, nil
547
+ end
548
+ end
549
+
550
+ def get_type(args)
551
+ params = {}
552
+ options = {}
553
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
554
+ opts.banner = subcommand_usage()
555
+ build_standard_get_options(opts, options)
556
+ opts.footer = <<-EOT
557
+ Get report type
558
+ [name] is required. This is the name of a report type
559
+ EOT
560
+ end
561
+ optparse.parse!(args)
562
+ connect(options)
563
+ verify_args!(args:args, optparse:optparse, min:1)
564
+ params.merge!(parse_query_options(options))
565
+ params['name'] = args.join(" ")
566
+ @reports_interface.setopts(options)
567
+ if options[:dry_run]
568
+ print_dry_run @reports_interface.dry.types(params)
569
+ return
570
+ end
571
+
572
+ # json_response = @reports_interface.types(params)
573
+ # api does not have a show() action right now... so find by code or name only
574
+ report_type = find_report_type_by_name_or_code_id(params['name'])
575
+ return 1 if report_type.nil?
576
+
577
+ # json_response = @reports_interface.get_type(report_type['id'])
578
+ # report_type = json_response['reportType']
579
+ json_response = {'reportType' => report_type}
580
+ render_response(json_response, options, 'reportType') do
581
+ print_h1 "Report Type Details", [], options
582
+
583
+ description_cols = {
584
+ "ID" => 'id',
585
+ "Name" => 'name',
586
+ "Code" => 'code',
587
+ "Description" => 'description',
588
+ "Category" => 'category'
589
+ }
590
+ print_description_list(description_cols, report_type)
591
+
592
+ print_h2 "Option Types", options
593
+ opt_columns = [
594
+ {"ID" => lambda {|it| it['id'] } },
595
+ {"NAME" => lambda {|it| it['name'] } },
596
+ {"TYPE" => lambda {|it| it['type'] } },
597
+ {"FIELD NAME" => lambda {|it| it['fieldName'] } },
598
+ {"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
599
+ {"DEFAULT" => lambda {|it| it['defaultValue'] } },
600
+ {"REQUIRED" => lambda {|it| format_boolean it['required'] } },
601
+ ]
602
+ option_types = report_type['optionTypes']
603
+ sorted_option_types = (option_types && option_types[0] && option_types[0]['displayOrder']) ? option_types.sort { |x,y| x['displayOrder'].to_i <=> y['displayOrder'].to_i } : option_types
604
+ print as_pretty_table(sorted_option_types, opt_columns)
605
+
606
+ print reset,"\n"
607
+ end
608
+ return 0, nil
609
+
610
+ end
611
+
612
+ def find_report_result_by_id(id)
613
+ begin
614
+ json_response = @reports_interface.get(id.to_i)
615
+ return json_response['reportResult']
616
+ rescue RestClient::Exception => e
617
+ if e.response && e.response.code == 404
618
+ print_red_alert "Report Result not found by id #{id}"
619
+ return nil
620
+ else
621
+ raise e
622
+ end
623
+ end
624
+ end
625
+
626
+ def find_report_type_by_name_or_code_id(val)
627
+ if val.to_s =~ /\A\d{1,}\Z/
628
+ return find_report_type_by_id(val)
629
+ else
630
+ return find_report_type_by_name_or_code(val)
631
+ end
632
+ end
633
+
634
+ def find_report_type_by_id(id)
635
+ @all_report_types ||= @reports_interface.types({max: 10000})['reportTypes'] || []
636
+ report_types = @all_report_types.select { |it| id && it['id'] == id.to_i }
637
+ if report_types.empty?
638
+ print_red_alert "Report Type not found by id #{id}"
639
+ return nil
640
+ elsif report_types.size > 1
641
+ print_red_alert "#{report_types.size} report types found by id #{id}"
642
+ rows = report_types.collect do |it|
643
+ {id: it['id'], code: it['code'], name: it['name']}
644
+ end
645
+ print "\n"
646
+ puts as_pretty_table(rows, [:id, :code, :name], {color:red})
647
+ return nil
648
+ else
649
+ return report_types[0]
650
+ end
651
+ end
652
+
653
+ def find_report_type_by_name_or_code(name)
654
+ @all_report_types ||= @reports_interface.types({max: 10000})['reportTypes'] || []
655
+ report_types = @all_report_types.select { |it| name && it['code'] == name || it['name'] == name }
656
+ if report_types.empty?
657
+ print_red_alert "Report Type not found by code #{name}"
658
+ return nil
659
+ elsif report_types.size > 1
660
+ print_red_alert "#{report_types.size} report types found by code #{name}"
661
+ rows = report_types.collect do |it|
662
+ {id: it['id'], code: it['code'], name: it['name']}
663
+ end
664
+ print "\n"
665
+ puts as_pretty_table(rows, [:id, :code, :name], {color:red})
666
+ return nil
667
+ else
668
+ return report_types[0]
669
+ end
670
+ end
671
+
672
+ def format_report_status(report_result, return_color=cyan)
673
+ out = ""
674
+ status_string = report_result['status'].to_s
675
+ if status_string == 'ready'
676
+ out << "#{green}#{status_string.upcase}#{return_color}"
677
+ elsif status_string == 'requested'
678
+ out << "#{cyan}#{status_string.upcase}#{return_color}"
679
+ elsif status_string == 'generating'
680
+ out << "#{cyan}#{status_string.upcase}#{return_color}"
681
+ elsif status_string == 'failed'
682
+ out << "#{red}#{status_string.upcase}#{return_color}"
683
+ else
684
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
685
+ end
686
+ out
687
+ end
688
+
689
+ # Prompts user for metadata for report filter
690
+ # returns array of metadata objects {id: null, name: "MYTAG", value: "myvalue"}
691
+ def prompt_metadata(options={})
692
+ #puts "Configure Environment Variables:"
693
+ no_prompt = (options[:no_prompt] || (options[:options] && options[:options][:no_prompt]))
694
+ metadata_filter = {}
695
+ metadata_index = 0
696
+ has_another_metadata = options[:options] && options[:options]["metadata#{metadata_index}"]
697
+ add_another_metadata = has_another_metadata || (!no_prompt && MtnCloud::Cli::OptionTypes.confirm("Add a metadata tag filter?", {default: false}))
698
+ while add_another_metadata do
699
+ field_context = "metadata#{metadata_index}"
700
+ metadata = {}
701
+ metadata['id'] = nil
702
+ metadata_label = metadata_index == 0 ? "Metadata Tag" : "Metadata Tag [#{metadata_index+1}]"
703
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => "#{metadata_label} Name", 'required' => true, 'description' => 'Metadata Tag Name.', 'defaultValue' => metadata['name']}], options[:options])
704
+ # todo: metadata.type ?
705
+ metadata['name'] = v_prompt[field_context]['name'].to_s
706
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => field_context, 'fieldName' => 'value', 'type' => 'text', 'fieldLabel' => "#{metadata_label} Value", 'required' => true, 'description' => 'Metadata Tag Value', 'defaultValue' => metadata['value']}], options[:options])
707
+ metadata['value'] = v_prompt[field_context]['value'].to_s
708
+ metadata_filter[metadata['name']] = metadata['value']
709
+ metadata_index += 1
710
+ has_another_metadata = options[:options] && options[:options]["metadata#{metadata_index}"]
711
+ add_another_metadata = has_another_metadata || (!no_prompt && MtnCloud::Cli::OptionTypes.confirm("Add another metadata tag filter?", {default: false}))
712
+ end
713
+
714
+ return metadata_filter
715
+ end
716
+
717
+ def check_payload_dates(payload)
718
+ if payload['report']['startMonth'] && payload['report']['endMonth']
719
+ return payload['report']['startMonth'].size > 7 || payload['report']['endMonth'].size > 7
720
+ end
721
+ return false
722
+ end
723
+ end
724
+