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,822 @@
1
+ require 'mtncloud/cli/cli_command'
2
+ require 'mtncloud/morpkg'
3
+
4
+ class MtnCloud::Cli::PackagesCommand
5
+ include MtnCloud::Cli::CliCommand
6
+ include MtnCloud::Cli::LibraryHelper
7
+
8
+ set_command_name :'packages'
9
+ register_subcommands :list, :search, :get, :install, :update, :remove, :export, :build
10
+ register_subcommands :'install-file' => :install_file
11
+
12
+ # hide until this is released
13
+ set_command_hidden
14
+
15
+ def initialize()
16
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
17
+ end
18
+
19
+ def connect(opts)
20
+ @api_client = establish_remote_appliance_connection(opts)
21
+ @packages_interface = @api_client.packages
22
+ end
23
+
24
+ def handle(args)
25
+ handle_subcommand(args)
26
+ end
27
+
28
+ def list(args)
29
+ options = {}
30
+ params = {}
31
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
32
+ opts.banner = subcommand_usage()
33
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
34
+ opts.footer = "List installed packages."
35
+ end
36
+ optparse.parse!(args)
37
+ connect(options)
38
+ begin
39
+ params.merge!(parse_list_options(options))
40
+ @packages_interface.setopts(options)
41
+ if options[:dry_run]
42
+ print_dry_run @packages_interface.dry.list(params)
43
+ return 0
44
+ end
45
+ json_response = @packages_interface.list(params)
46
+ if options[:json]
47
+ puts as_json(json_response, options, "packages")
48
+ return 0
49
+ elsif options[:yaml]
50
+ puts as_yaml(json_response, options, "packages")
51
+ return 0
52
+ elsif options[:csv]
53
+ puts records_as_csv(json_response["packages"], options)
54
+ else
55
+ installed_packages = json_response["packages"]
56
+ title = "Installed Packages"
57
+ subtitles = []
58
+ subtitles += parse_list_subtitles(options)
59
+ print_h1 title, subtitles
60
+ if installed_packages.empty?
61
+ print cyan,"No installed packages found",reset,"\n"
62
+ else
63
+ rows = installed_packages.collect {|package|
64
+ {
65
+ code: package['code'],
66
+ name: package['name'],
67
+ version: package['version'],
68
+ description: package['description'],
69
+ }
70
+ }
71
+ columns = [:code, :name, {:description => {:max_width => 50}}, :version]
72
+ # custom pretty table columns ...
73
+ if options[:include_fields]
74
+ columns = options[:include_fields]
75
+ end
76
+ print cyan
77
+ print as_pretty_table(rows, columns, options)
78
+ print reset
79
+ print_results_pagination(json_response)
80
+ end
81
+ print reset,"\n"
82
+ end
83
+ rescue RestClient::Exception => e
84
+ print_rest_exception(e, options)
85
+ exit 1
86
+ end
87
+ end
88
+
89
+ def search(args)
90
+ options = {}
91
+ params = {}
92
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
93
+ opts.banner = subcommand_usage()
94
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
95
+ opts.footer = "Search the marketplace for available packages."
96
+ end
97
+ optparse.parse!(args)
98
+ connect(options)
99
+ begin
100
+ if args[0]
101
+ options[:phrase] = args[0]
102
+ # params['phrase'] = args[0]
103
+ end
104
+ params.merge!(parse_list_options(options))
105
+ @packages_interface.setopts(options)
106
+ if options[:dry_run]
107
+ print_dry_run @packages_interface.dry.search(params)
108
+ return 0
109
+ end
110
+ json_response = @packages_interface.search(params)
111
+ if options[:json]
112
+ puts as_json(json_response, options, "packages")
113
+ return 0
114
+ elsif options[:yaml]
115
+ puts as_yaml(json_response, options, "packages")
116
+ return 0
117
+ elsif options[:csv]
118
+ puts records_as_csv(json_response["packages"], options)
119
+ else
120
+ available_packages = json_response["packages"]
121
+ title = "Available Packages"
122
+ subtitles = []
123
+ subtitles += parse_list_subtitles(options)
124
+ print_h1 title, subtitles
125
+ if available_packages.empty?
126
+ print cyan,"No packages found",reset,"\n"
127
+ else
128
+ rows = available_packages.collect {|package|
129
+ {
130
+ code: package['code'],
131
+ name: package['name'],
132
+ description: package['description'],
133
+ versions: (package['versions'] || []).collect {|v| v['version'] }.join(', ')
134
+ }
135
+ }
136
+ columns = [:code, :name, {:description => {:max_width => 50}}, {:versions => {:max_width => 30}}]
137
+ # custom pretty table columns ...
138
+ if options[:include_fields]
139
+ columns = options[:include_fields]
140
+ end
141
+ print cyan
142
+ print as_pretty_table(rows, columns, options)
143
+ print reset
144
+ print_results_pagination(json_response)
145
+ end
146
+ print reset,"\n"
147
+ end
148
+ rescue RestClient::Exception => e
149
+ print_rest_exception(e, options)
150
+ exit 1
151
+ end
152
+ end
153
+
154
+ def get(args)
155
+ options = {}
156
+ params = {}
157
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
158
+ opts.banner = subcommand_usage("[code]")
159
+ opts.on( nil, '--versions', "Display Available Versions" ) do
160
+ options[:show_versions] = true
161
+ end
162
+ opts.on( nil, '--objects', "Display Installed Package Objects" ) do
163
+ options[:show_objects] = true
164
+ end
165
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
166
+ opts.footer = "Get details about a package.\n" +
167
+ "[code] is required. This is the package code."
168
+ end
169
+ optparse.parse!(args)
170
+ connect(options)
171
+ if args.count != 1
172
+ print_error MtnCloud::Terminal.angry_prompt
173
+ puts_error "#{command_name} get expects 1 argument and received #{args.count} #{args.join(' ')}\n#{optparse}"
174
+ return 1
175
+ end
176
+ begin
177
+ params.merge!(parse_list_options(options))
178
+ params['code'] = args[0]
179
+ @packages_interface.setopts(options)
180
+ if options[:dry_run]
181
+ print_dry_run @packages_interface.dry.info(params)
182
+ return 0
183
+ end
184
+ json_response = @packages_interface.info(params)
185
+ if options[:json]
186
+ puts as_json(json_response, options, "package")
187
+ return 0
188
+ elsif options[:yaml]
189
+ puts as_yaml(json_response, options, "package")
190
+ return 0
191
+ elsif options[:csv]
192
+ puts records_as_csv(json_response["package"], options)
193
+ else
194
+ installed_package = json_response["package"]
195
+ available_package = json_response["availablePackage"]
196
+
197
+ if installed_package.nil? && available_package.nil?
198
+ print yellow,"No package found for code '#{params['code']}'",reset,"\n"
199
+ return 1
200
+ end
201
+
202
+ print_h1 "Package Info"
203
+
204
+ # merge installed and available package info
205
+ package_record = installed_package || available_package
206
+ #package_record['versions'] = available_package['versions'] if available_package
207
+ print cyan
208
+ description_cols = {
209
+ # "Organization" => 'organization',
210
+ "Code" => 'code',
211
+ "Name" => 'name',
212
+ "Description" => 'description',
213
+ # "Type" => lambda {|it| (it['packageType'] || it['type']).to_s },
214
+ "Latest Version" => lambda {|it|
215
+ if available_package && available_package['versions']
216
+ latest_version = available_package['versions'].find {|v| v['latestVersion'] }
217
+ if latest_version.nil?
218
+ sorted_versions = available_package['versions'].sort {|x,y| x['dateCreated'] <=> y['dateCreated'] }
219
+ latest_version = sorted_versions.first()
220
+ end
221
+ latest_version ? latest_version['version'] : ""
222
+ else
223
+ ""
224
+ end
225
+ },
226
+ "Installed Version" => lambda {|it|
227
+ installed_package ? installed_package['version'] : ""
228
+ },
229
+ "Status" => lambda {|it|
230
+ installed_package ? format_package_status(installed_package['status']) : format_package_status(nil)
231
+ },
232
+ }
233
+ if installed_package.nil?
234
+ description_cols.delete("Installed Version")
235
+ end
236
+
237
+ print_description_list(description_cols, package_record)
238
+ # print reset, "\n"
239
+ if options[:show_versions]
240
+ print_h2 "Available Versions"
241
+ if available_package.nil?
242
+ print yellow,"No marketplace package found for code '#{params['code']}'",reset,"\n"
243
+ else
244
+ if available_package['versions'].nil? || available_package['versions'].empty?
245
+ print yellow,"No available versions found",reset,"\n"
246
+ else
247
+ # api is sorting these with latestVersion first, right?
248
+ sorted_versions = available_package['versions'] || []
249
+ #sorted_versions = available_package['versions'].sort {|x,y| x['dateCreated'] <=> y['dateCreated'] }
250
+ rows = sorted_versions.collect {|package_version|
251
+ {
252
+ "PACKAGE VERSION": package_version['version'],
253
+ "MIN APPLIANCE VERSION": package_version['minApplianceVersion'],
254
+ "PUBLISH DATE": format_local_dt(package_version['created'] || package_version['dateCreated'])
255
+ }
256
+ }
257
+ columns = ["PACKAGE VERSION", "MIN APPLIANCE VERSION", "PUBLISH DATE"]
258
+ print cyan
259
+ print as_pretty_table(rows, columns)
260
+ # print reset, "\n"
261
+ end
262
+ end
263
+ end
264
+ if options[:show_objects]
265
+ print_h2 "Package Objects"
266
+ if installed_package.nil?
267
+ print cyan,"No objects to show",reset,"\n"
268
+ else
269
+ if installed_package['objects'].nil? || installed_package['objects'].empty?
270
+ print yellow,"No objects to show",reset,"\n"
271
+ else
272
+ rows = installed_package['objects'].collect {|it|
273
+ {
274
+ type: it['refType'],
275
+ id: it['refId'],
276
+ name: it['displayName']
277
+ }
278
+ }
279
+ columns = [:type, :id, :name]
280
+ print cyan
281
+ print as_pretty_table(rows, columns)
282
+ # print reset, "\n"
283
+ end
284
+ end
285
+ end
286
+
287
+ print reset, "\n"
288
+ return 0
289
+ end
290
+ rescue RestClient::Exception => e
291
+ print_rest_exception(e, options)
292
+ exit 1
293
+ end
294
+ end
295
+
296
+ def install(args)
297
+ full_command_string = "#{command_name} install #{args.join(' ')}".strip
298
+ options = {}
299
+ params = {}
300
+ open_prog = nil
301
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
302
+ opts.banner = subcommand_usage("[code]")
303
+ opts.on('-v','--version VERSION', "Package Version number") do |val|
304
+ params['version'] = val
305
+ end
306
+ # opts.on('--package-version VALUE', String, "Version number for package.") do |val|
307
+ # params['version'] = val
308
+ # end
309
+ opts.on('--organization NAME', String, "Package Organization. Default is morpheus.") do |val|
310
+ params['organization'] = val
311
+ end
312
+ opts.on( '-f', '--force', "Force Install." ) do
313
+ params['force'] = true
314
+ end
315
+ build_common_options(opts, options, [:options, :json, :dry_run, :remote, :quiet])
316
+ opts.footer = "Install a package from the marketplace.\n" +
317
+ "[code] is required. This is the package code."
318
+ end
319
+ optparse.parse!(args)
320
+ if args.count != 1
321
+ print_error MtnCloud::Terminal.angry_prompt
322
+ puts_error "#{command_name} install expects 1 argument and received #{args.count} #{args.join(' ')}\n#{optparse}"
323
+ return 1
324
+ end
325
+ connect(options)
326
+ begin
327
+ params['code'] = args[0]
328
+ @packages_interface.setopts(options)
329
+ if options[:dry_run]
330
+ #print cyan,bold, " - Uploading #{local_file_path} to #{bucket_id}:#{destination} DRY RUN", reset, "\n"
331
+ # print_h1 "DRY RUN"
332
+ print_dry_run @packages_interface.dry.install(params)
333
+ print "\n"
334
+ return 0
335
+ end
336
+
337
+ json_response = @packages_interface.install(params)
338
+ if options[:json]
339
+ puts as_json(json_response, options)
340
+ elsif !options[:quiet]
341
+ package_str = params['code'] || ""
342
+ installed_package = json_response['package']
343
+ if installed_package && installed_package['code']
344
+ package_str = installed_package['code']
345
+ end
346
+ if installed_package && installed_package['version']
347
+ package_str = "#{package_str} #{installed_package['version']}"
348
+ end
349
+ print_green_success "Installed package #{package_str}"
350
+ end
351
+
352
+ rescue RestClient::Exception => e
353
+ print_rest_exception(e, options)
354
+ return 1
355
+ end
356
+ end
357
+
358
+ def install_file(args)
359
+ full_command_string = "#{command_name} install-file #{args.join(' ')}".strip
360
+ options = {}
361
+ params = {}
362
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
363
+ opts.banner = subcommand_usage("[morpkg-file]")
364
+ # opts.on('--url URL', String, "Use a remote URL as the source .morpkg instead of uploading a file.") do |val|
365
+ # params['url'] = val
366
+ # end
367
+ opts.on( '-f', '--force', "Force Install." ) do
368
+ params['force'] = true
369
+ end
370
+ build_common_options(opts, options, [:options, :dry_run, :quiet])
371
+ opts.footer = "Install a package with a .morpkg file directly.\n" +
372
+ "[morpkg-file] is required. This is the local filepath of a .morpkg to be uploaded and installed."
373
+ end
374
+ optparse.parse!(args)
375
+
376
+ if args.count != 1
377
+ print_error MtnCloud::Terminal.angry_prompt
378
+ puts_error "expects 1 argument and received #{args.count} #{args.join(' ')}\n#{optparse}"
379
+ return 1
380
+ end
381
+
382
+ # validate local file path
383
+ local_file_path = File.expand_path(args[0].squeeze('/'))
384
+ if local_file_path == "" || local_file_path == "/" || local_file_path == "."
385
+ print_error MtnCloud::Terminal.angry_prompt
386
+ puts_error "bad argument: [morpkg-file]\nFile '#{local_file_path}' is invalid.\n#{optparse}"
387
+ return 1
388
+ end
389
+ if !File.exist?(local_file_path)
390
+ print_error MtnCloud::Terminal.angry_prompt
391
+ puts_error "bad argument: [morpkg-file]\nFile '#{local_file_path}' was not found.\n"
392
+ return 1
393
+ end
394
+ if !File.file?(local_file_path)
395
+ print_error MtnCloud::Terminal.angry_prompt
396
+ puts_error "bad argument: [morpkg-file]\nFile '#{local_file_path}' is not a file.\n"
397
+ return 1
398
+ end
399
+
400
+ connect(options)
401
+ begin
402
+ @packages_interface.setopts(options)
403
+ if options[:dry_run]
404
+ #print cyan,bold, " - Uploading #{local_file_path} to #{bucket_id}:#{destination} DRY RUN", reset, "\n"
405
+ # print_h1 "DRY RUN"
406
+ print_dry_run @packages_interface.dry.install_file(local_file_path, params)
407
+ print "\n"
408
+ return 0
409
+ end
410
+
411
+ json_response = @packages_interface.install_file(local_file_path, params)
412
+ if options[:json]
413
+ puts as_json(json_response, options)
414
+ elsif !options[:quiet]
415
+ package_str = params['code'] || ""
416
+ installed_package = json_response['package']
417
+ if installed_package && installed_package['code']
418
+ package_str = installed_package['code']
419
+ end
420
+ if installed_package && installed_package['version']
421
+ package_str = "#{package_str} #{installed_package['version']}"
422
+ end
423
+ print_green_success "Installed package #{package_str}"
424
+ end
425
+
426
+ rescue RestClient::Exception => e
427
+ print_rest_exception(e, options)
428
+ return 1
429
+ end
430
+ end
431
+
432
+ def update(args)
433
+ raise "not yet implemented"
434
+ end
435
+
436
+ def remove(args)
437
+ raise "not yet implemented"
438
+ end
439
+
440
+ # download a new .morpkg for remote instanceType(s)
441
+ def export(args)
442
+ full_command_string = "#{command_name} export #{args.join(' ')}".strip
443
+ options = {}
444
+ params = {}
445
+ instance_type_codes = nil
446
+ outfile = nil
447
+ do_overwrite = false
448
+ do_mkdir = false
449
+ do_unzip = false
450
+ do_open = false
451
+ open_prog = nil
452
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
453
+ opts.banner = subcommand_usage("[instance-type]")
454
+ opts.on('--file FILE', String, "Destination filepath for the downloaded .morpkg file.") do |val|
455
+ outfile = val
456
+ end
457
+ opts.on('--package-version VALUE', String, "Version number for package.") do |val|
458
+ params['version'] = val
459
+ end
460
+ opts.on('--organization NAME', String, "Organization for package.") do |val|
461
+ params['organization'] = val
462
+ end
463
+ opts.on('--code VALUE', String, "Code for package. Default comes from instance type.") do |val|
464
+ params['code'] = val
465
+ end
466
+ opts.on('--name VALUE', String, "Name for package. Default comes from the instance type name") do |val|
467
+ params['name'] = val
468
+ end
469
+ opts.on('--description VALUE', String, "Description of package.") do |val|
470
+ params['description'] = val
471
+ end
472
+ opts.on('--instance-types LIST', String, "Can be used to export multiple instance types as a single package.") do |val|
473
+ instance_type_codes = []
474
+ val.split(',').collect do |it|
475
+ if !it.strip.empty?
476
+ instance_type_codes << it.strip
477
+ end
478
+ end
479
+ end
480
+ opts.on('--all', String, "Export entire library instead of specific instance type(s).") do
481
+ params['all'] = true
482
+ end
483
+ opts.on('--all-system', String, "Export all system instance types instead of specific instance type(s).") do
484
+ params['all'] = true
485
+ params['systemOnly'] = true
486
+ end
487
+ opts.on('--all-custom', String, "Export all custom instance types instead of specific instance type(s).") do
488
+ params['all'] = true
489
+ params['customOnly'] = true
490
+ end
491
+ opts.on( '-p', '--mkdir', "Create missing directories for [filename] if they do not exist." ) do
492
+ do_mkdir = true
493
+ end
494
+ opts.on( '-f', '--force', "Overwrite existing [filename] if it exists. Also creates missing directories." ) do
495
+ do_overwrite = true
496
+ do_mkdir = true
497
+ end
498
+ opts.on( '--unzip', "Unzip the package to a directory with the same name." ) do
499
+ do_unzip = true
500
+ end
501
+ opts.on( '--open [PROG]', String, "Unzip the package and open the expanded directory with the specified program." ) do |val|
502
+ do_unzip = true
503
+ do_open = true
504
+ if !val.to_s.empty?
505
+ open_prog = val.to_s
506
+ else
507
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
508
+ open_prog = "start"
509
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin/
510
+ open_prog = "open"
511
+ elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
512
+ open_prog = "xdg-open"
513
+ end
514
+ end
515
+ end
516
+ build_common_options(opts, options, [:options, :dry_run, :quiet])
517
+ opts.footer = "Export one or many instance types as a package (.morpkg) file.\n" +
518
+ "[instance-type] is required. This is the instance type code." +
519
+ "--instance-types can be export multiple instance types at once. This is a list of instance type codes."
520
+ end
521
+ optparse.parse!(args)
522
+
523
+ if args.count != 1 && !instance_type_codes && !params['all']
524
+ print_error MtnCloud::Terminal.angry_prompt
525
+ puts_error "#{command_name} export expects 1 argument and received #{args.count} #{args.join(' ')}\n#{optparse}"
526
+ return 1
527
+ end
528
+ connect(options)
529
+ begin
530
+ # construct payload
531
+ if !params['all']
532
+ if args[0] && !instance_type_codes
533
+ instance_type_codes = [args[0]]
534
+ end
535
+ params['instanceType'] = instance_type_codes
536
+ end
537
+ # determine outfile
538
+ if !outfile
539
+ # use a default location
540
+ do_mkdir = true
541
+ if instance_type_codes && instance_type_codes.size == 1
542
+ outfile = File.join(MtnCloud::Cli.home_directory, "tmp", "mtncloud-packages", "#{instance_type_codes[0]}.morpkg")
543
+ else
544
+ outfile = File.join(MtnCloud::Cli.home_directory, "tmp", "mtncloud-packages", "download.morpkg")
545
+ end
546
+ end
547
+ outfile = File.expand_path(outfile)
548
+ if Dir.exist?(outfile)
549
+ puts_error "#{MtnCloud::Terminal.angry_prompt}--file is invalid. It is the name of an existing directory: #{outfile}"
550
+ return 1
551
+ end
552
+ # always a .morpkg
553
+ if outfile[-7..-1] != ".morpkg"
554
+ outfile << ".morpkg"
555
+ end
556
+ destination_dir = File.dirname(outfile)
557
+ if !Dir.exist?(destination_dir)
558
+ if do_mkdir
559
+ print cyan,"Creating local directory #{destination_dir}",reset,"\n"
560
+ FileUtils.mkdir_p(destination_dir)
561
+ else
562
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[filename] is invalid. Directory not found: #{destination_dir} Use -p to create the missing directory."
563
+ return 1
564
+ end
565
+ end
566
+ if File.exist?(outfile)
567
+ if do_overwrite
568
+ # uhh need to be careful wih the passed filepath here..
569
+ # don't delete, just overwrite.
570
+ # File.delete(outfile)
571
+ else
572
+ print_error MtnCloud::Terminal.angry_prompt
573
+ puts_error "[filename] is invalid. File already exists: #{outfile}", "Use -f to overwrite the existing file."
574
+ # puts_error optparse
575
+ return 1
576
+ end
577
+ end
578
+
579
+ # merge -O options into normally parsed options
580
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
581
+ @packages_interface.setopts(options)
582
+ if options[:dry_run]
583
+ print_dry_run @packages_interface.dry.export(params, outfile), full_command_string
584
+ return 0
585
+ end
586
+ if !options[:quiet]
587
+ print cyan + "Downloading package file #{outfile} ... "
588
+ end
589
+
590
+ http_response, bad_body = @packages_interface.export(params, outfile)
591
+
592
+ # FileUtils.chmod(0600, outfile)
593
+ success = http_response.code.to_i == 200
594
+ if success
595
+ if !options[:quiet]
596
+ print green + "SUCCESS" + reset + "\n"
597
+ end
598
+
599
+ if do_unzip
600
+ package_dir = File.join(File.dirname(outfile), File.basename(outfile).sub(/\.morpkg\Z/, ''))
601
+ if File.exist?(package_dir)
602
+ print cyan,"Deleting existing directory #{package_dir}",reset,"\n"
603
+ FileUtils.rm_rf(package_dir)
604
+ end
605
+ print cyan,"Unzipping to #{package_dir}",reset,"\n"
606
+ system("unzip '#{outfile}' -d '#{package_dir}' > /dev/null 2>&1")
607
+ if do_open
608
+ system("#{open_prog} '#{package_dir}'")
609
+ end
610
+ end
611
+
612
+ return 0
613
+ else
614
+ if !options[:quiet]
615
+ print red + "ERROR" + reset + " HTTP #{http_response.code}" + "\n"
616
+ if bad_body
617
+ puts red + bad_body
618
+ end
619
+ #response_body = (http_response.body.kind_of?(Net::ReadAdapter) ? "" : http_response.body)
620
+ end
621
+ # F it, just remove a bad result
622
+ if File.exist?(outfile) && File.file?(outfile)
623
+ MtnCloud::Logging::DarkPrinter.puts "Deleting bad file download: #{outfile}" if MtnCloud::Logging.debug?
624
+ File.delete(outfile)
625
+ end
626
+ if options[:debug]
627
+ puts_error http_response.inspect
628
+ end
629
+ return 1
630
+ end
631
+
632
+ rescue RestClient::Exception => e
633
+ print_rest_exception(e, options)
634
+ return 1
635
+ end
636
+ end
637
+
638
+ # generate a new .morpkg for a local source directory
639
+ def build(args)
640
+ full_command_string = "#{command_name} build #{args.join(' ')}".strip
641
+ options = {}
642
+ source_directory = nil
643
+ outfile = nil
644
+ do_overwrite = false
645
+ do_mkdir = false
646
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
647
+ opts.banner = subcommand_usage("[source] [target]")
648
+ opts.on('--source FILE', String, "Source directory of the package being built.") do |val|
649
+ source_directory = val
650
+ end
651
+ opts.on('--target FILE', String, "Destination filename for the .morpkg output file. Default is [code]-[version].morpkg") do |val|
652
+ outfile = val
653
+ end
654
+ opts.on( '-p', '--mkdir', "Create missing directories for [target] if they do not exist." ) do
655
+ do_mkdir = true
656
+ end
657
+ opts.on( '-f', '--force', "Overwrite existing [target] if it exists. Also creates missing directories." ) do
658
+ do_overwrite = true
659
+ do_mkdir = true
660
+ end
661
+
662
+ build_common_options(opts, options, [:options, :dry_run, :quiet])
663
+ opts.footer = "Generate a new package file. \n" +
664
+ "[source] is required. This is the source directory of the package.\n" +
665
+ "[target] is the output filename. The default is [code]-[version].morpkg"
666
+ end
667
+ optparse.parse!(args)
668
+
669
+ if args.count < 1 || args.count > 2
670
+ print_error MtnCloud::Terminal.angry_prompt
671
+ puts_error "wrong number of arguments, expected 1-2 and got #{args.count}\n#{optparse}"
672
+ return 1
673
+ end
674
+ if args[0]
675
+ source_directory = args[0]
676
+ end
677
+ if args[1]
678
+ outfile = args[1]
679
+ end
680
+ if !source_directory
681
+ print_error MtnCloud::Terminal.angry_prompt
682
+ puts_error "missing required argument [source]\n#{optparse}"
683
+ return 1
684
+ end
685
+
686
+ # connect(options)
687
+ begin
688
+ # validate source
689
+ source_directory = File.expand_path(source_directory)
690
+ if !File.exist?(source_directory)
691
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[source] is invalid. Directory not found: #{source_directory}"
692
+ return 1
693
+ end
694
+ if !File.directory?(source_directory)
695
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[source] is invalid. Not a directory: #{source_directory}"
696
+ return 1
697
+ end
698
+ # parse package source
699
+
700
+ package_org = nil
701
+ package_code = nil
702
+ package_version = nil
703
+ package_type = nil
704
+
705
+
706
+ # validate package
707
+ if !package_code.nil? || package_code.empty?
708
+ puts_error "#{MtnCloud::Terminal.angry_prompt}package data is invalid. Missing package code."
709
+ return 1
710
+ end
711
+ if package_version.nil? || package_version.empty?
712
+ puts_error "#{MtnCloud::Terminal.angry_prompt}package data is invalid. Missing package version."
713
+ return 1
714
+ end
715
+ # determine outfile
716
+ if !outfile
717
+ outfile = File.join(File.dirname(source_directory), "#{package_code}-#{package_version}.morpkg")
718
+ else
719
+ outfile = File.expand_path(outfile)
720
+ end
721
+ if Dir.exist?(outfile)
722
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[target] is invalid. It is the name of an existing directory: #{outfile}"
723
+ return 1
724
+ end
725
+ # always a .morpkg
726
+ if outfile[-7..-1] != ".morpkg"
727
+ outfile << ".morpkg"
728
+ end
729
+ destination_dir = File.dirname(outfile)
730
+ if !Dir.exist?(destination_dir)
731
+ if do_mkdir
732
+ print cyan,"Creating local directory #{destination_dir}",reset,"\n"
733
+ FileUtils.mkdir_p(destination_dir)
734
+ else
735
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[target] is invalid. Directory not found: #{destination_dir} Use -p to create the missing directory."
736
+ return 1
737
+ end
738
+ end
739
+ if File.exist?(outfile)
740
+ if do_overwrite
741
+ # uhh need to be careful wih the passed filepath here..
742
+ # don't delete, just overwrite.
743
+ # File.delete(outfile)
744
+ else
745
+ puts_error "#{MtnCloud::Terminal.angry_prompt}[target] is invalid. File already exists: #{outfile}", "Use -f to overwrite the existing file."
746
+ return 1
747
+ end
748
+ end
749
+
750
+ if options[:dry_run]
751
+ print cyan + "Building package at #{source_directory} ..."
752
+ print cyan + "DRY RUN" + reset + "\n"
753
+ return 0
754
+ end
755
+ if !options[:quiet]
756
+ print cyan + "Building package at #{source_directory} ... "
757
+ end
758
+
759
+ # build it
760
+ #http_response, bad_body = @packages_interface.export(params, outfile)
761
+
762
+ # FileUtils.chmod(0600, outfile)
763
+ success = true
764
+ error_msg = nil
765
+ build_outfile = nil
766
+ begin
767
+ build_outfile = MtnCloud::Morpkg.build_package(source_directory, outfile, options[:force])
768
+ success = true
769
+ rescue => ex
770
+ error_msg = ex.message
771
+ end
772
+ if success
773
+ if !options[:quiet]
774
+ print green + "SUCCESS" + reset + "\n"
775
+ print green + "Generated #{build_outfile}" + reset + "\n"
776
+ end
777
+ return 0
778
+ else
779
+ if !options[:quiet]
780
+ print red + "ERROR" + reset + "\n"
781
+ if error_msg
782
+ print_error red + error_msg + reset + "\n"
783
+ end
784
+ end
785
+ # F it, just remove a bad result
786
+ # if File.exist?(outfile) && File.file?(outfile)
787
+ # MtnCloud::Logging::DarkPrinter.puts "Deleting bad build file: #{outfile}" if MtnCloud::Logging.debug?
788
+ # File.delete(outfile)
789
+ # end
790
+ if options[:debug]
791
+ # puts_error error_msg
792
+ end
793
+ return 1
794
+ end
795
+
796
+ rescue RestClient::Exception => e
797
+ print_rest_exception(e, options)
798
+ return 1
799
+ end
800
+ end
801
+
802
+ private
803
+
804
+ def format_package_status(status_string, return_color=cyan)
805
+ out = ""
806
+ if status_string == 'installed'
807
+ out << "#{green}#{status_string.upcase}#{return_color}"
808
+ elsif status_string == 'uninstalled' || status_string == 'removed'
809
+ out << "#{red}#{status_string.upcase}#{return_color}"
810
+ elsif status_string == 'installing'
811
+ out << "#{cyan}#{status_string.upcase}#{return_color}"
812
+ elsif status_string.nil?
813
+ out << "#{cyan}NOT INSTALLED#{return_color}"
814
+ elsif !status_string.nil?
815
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
816
+ else
817
+ out << ""
818
+ end
819
+ out
820
+ end
821
+
822
+ end