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,587 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::CypherCommand
4
+ include MtnCloud::Cli::CliCommand
5
+
6
+ set_command_name :'cypher'
7
+
8
+ register_subcommands :list, :get, :put, :remove
9
+ # some appropriate aliases
10
+ #register_subcommands :read => :get,
11
+ #register_subcommands :write => :put
12
+ #register_subcommands :add => :put
13
+ #register_subcommands :delete => :remove
14
+ # register_subcommands :destroy => :destroy
15
+
16
+ def initialize()
17
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
18
+ end
19
+
20
+ def connect(opts)
21
+ @api_client = establish_remote_appliance_connection(opts)
22
+ # @cypher_interface = @api_client.cypher
23
+ @cypher_interface = @api_client.cypher
24
+ end
25
+
26
+ def handle(args)
27
+ handle_subcommand(args)
28
+ end
29
+
30
+ def list(args)
31
+ options = {}
32
+ params = {}
33
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
34
+ opts.banner = subcommand_usage("[key]")
35
+ # opts.on('--details', '--details', "Show more details." ) do
36
+ # options[:details] = true
37
+ # end
38
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :json, :dry_run, :remote])
39
+ opts.footer = "List cypher keys." + "\n" +
40
+ "[key] is optional. This is the cypher key or path to search for."
41
+ end
42
+ optparse.parse!(args)
43
+ connect(options)
44
+ if args.count > 1
45
+ print_error MtnCloud::Terminal.angry_prompt
46
+ puts_error "wrong number of arguments, expected 0-1 and got #{args.count}\n#{optparse}"
47
+ return 1
48
+ end
49
+ item_key = args[0]
50
+ begin
51
+ params.merge!(parse_list_options(options))
52
+ @cypher_interface.setopts(options)
53
+ if options[:dry_run]
54
+ print_dry_run @cypher_interface.dry.list(item_key, params)
55
+ return 0
56
+ end
57
+ json_response = @cypher_interface.list(item_key, params)
58
+ if options[:json]
59
+ puts as_json(json_response, options)
60
+ return 0
61
+ elsif options[:yaml]
62
+ puts as_yaml(json_response, options)
63
+ return 0
64
+ elsif options[:csv]
65
+ puts records_as_csv([json_response], options)
66
+ return 0
67
+ end
68
+ cypher_items = json_response["cypherItems"] || json_response["cyphers"]
69
+ cypher_data = json_response["data"]
70
+ title = "Cypher Key List"
71
+ subtitles = []
72
+ subtitles += parse_list_subtitles(options)
73
+ if item_key
74
+ subtitles << "Key: #{item_key}"
75
+ end
76
+ print_h1 title, subtitles, options
77
+
78
+ cypher_keys = json_response["data"] ? json_response["data"]["keys"] : []
79
+ if cypher_keys.nil? || cypher_keys.empty?
80
+ if item_key
81
+ print cyan,"No cypher items found for '#{item_key}'.",reset,"\n"
82
+ end
83
+ else
84
+
85
+ cypher_columns = {
86
+ "KEY" => lambda {|it| it["itemKey"] },
87
+ # "LEASE REMAINING" => lambda {|it|
88
+ # format_lease_remaining(it["expireDate"])
89
+ # },
90
+ "TTL" => lambda {|it|
91
+ format_expiration_ttl(it["expireDate"])
92
+ },
93
+ "EXPIRATION" => lambda {|it|
94
+ format_expiration_date(it["expireDate"])
95
+ },
96
+ # "DATE CREATED" => lambda {|it| format_local_dt(it["dateCreated"]) },
97
+ "LAST UPDATED" => lambda {|it| format_local_dt(it["lastUpdated"]) },
98
+ "LAST ACCESSED" => lambda {|it| format_local_dt(it["lastAccessed"]) }
99
+ }
100
+ print cyan
101
+ print as_pretty_table(cypher_items, cypher_columns, options)
102
+ print reset
103
+ # print_results_pagination({size:cypher_keys.size,total:cypher_keys.size.to_i})
104
+ print_results_pagination(json_response)
105
+ end
106
+ print reset,"\n"
107
+ return 0
108
+ rescue RestClient::Exception => e
109
+ print_rest_exception(e, options)
110
+ exit 1
111
+ end
112
+ end
113
+
114
+ def get(args)
115
+ options = {}
116
+ params = {}
117
+ value_only = false
118
+ do_decrypt = false
119
+ ttl = nil
120
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
121
+ opts.banner = subcommand_usage("[key]")
122
+ # opts.on(nil, '--decrypt', 'Display the decrypted value') do
123
+ # do_decrypt = true
124
+ # end
125
+ # opts.on(nil, '--metadata', 'Display metadata about the key, such as versions.') do
126
+ # display_versions = true
127
+ # end
128
+ opts.on('-v', '--value', 'Print only the decrypted value.') do
129
+ value_only = true
130
+ end
131
+ opts.on( '-t', '--ttl SECONDS', "Time to live, the lease duration before this key expires. Use if creating new key." ) do |val|
132
+ ttl = val
133
+ if val.to_s.empty? || val.to_s == '0'
134
+ ttl = 0
135
+ else
136
+ ttl = val
137
+ end
138
+ end
139
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :outfile, :dry_run, :quiet, :remote])
140
+ opts.footer = "Read a cypher item and display the decrypted value." + "\n" +
141
+ "[key] is required. This is the cypher key to read." + "\n" +
142
+ "Use --ttl to specify a ttl if expecting cypher engine to automatically create the key."
143
+ end
144
+ optparse.parse!(args)
145
+ if args.count != 1
146
+ print_error MtnCloud::Terminal.angry_prompt
147
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
148
+ return 1
149
+ end
150
+ connect(options)
151
+ begin
152
+ item_key = args[0]
153
+ if ttl
154
+ params["ttl"] = ttl
155
+ end
156
+ @cypher_interface.setopts(options)
157
+ if options[:dry_run]
158
+ print_dry_run @cypher_interface.dry.get(item_key, params)
159
+ return 0
160
+ end
161
+ params.merge!(parse_list_options(options))
162
+ json_response = @cypher_interface.get(item_key, params)
163
+ render_result = render_with_format(json_response, options)
164
+ if render_result
165
+ return 0
166
+ end
167
+
168
+ cypher_item = json_response['cypher']
169
+ decrypted_value = json_response["data"]
170
+ data_type = decrypted_value.is_a?(String) ? 'string' : 'object'
171
+
172
+ if value_only
173
+ print cyan
174
+ if decrypted_value.is_a?(Hash)
175
+ puts as_json(decrypted_value)
176
+ else
177
+ puts decrypted_value.to_s
178
+ end
179
+ print reset
180
+ return 0
181
+ end
182
+
183
+ print_h1 "Cypher Key", [], options
184
+ print cyan
185
+ # This response does contain cypher too though.
186
+
187
+ if cypher_item.empty?
188
+ puts "Cypher item not found in response"
189
+ else
190
+ description_cols = {
191
+ #"ID" => 'id',
192
+ "Key" => lambda {|it| it["itemKey"] },
193
+ "TTL" => lambda {|it|
194
+ format_expiration_ttl(it["expireDate"])
195
+ },
196
+ # "Type" => lambda {|it|
197
+ # data_type
198
+ # },
199
+ "Expiration" => lambda {|it|
200
+ format_expiration_date(it["expireDate"])
201
+ },
202
+ # "Date Created" => lambda {|it| format_local_dt(it["dateCreated"]) },
203
+ "Last Updated" => lambda {|it| format_local_dt(it["lastUpdated"]) },
204
+ "Last Accessed" => lambda {|it| format_local_dt(it["lastAccessed"]) }
205
+ }
206
+ if cypher_item["expireDate"].nil?
207
+ description_cols.delete("Expires")
208
+ end
209
+ print_description_list(description_cols, cypher_item)
210
+ end
211
+ # print_h2 "Value", options
212
+ # print_h2 "Data", options
213
+ print_h2 "Data (#{data_type})", options
214
+
215
+ if decrypted_value
216
+ print cyan
217
+ if decrypted_value.is_a?(String)
218
+ # attempt to parse and render as_json
219
+ if decrypted_value.to_s[0] == '{' && decrypted_value.to_s[-1] == '}'
220
+ begin
221
+ json_value = JSON.parse(decrypted_value)
222
+ puts as_json(json_value)
223
+ rescue => ex
224
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse cypher value '#{decrypted_value}' as JSON. Error: #{ex}" if MtnCloud::Logging.debug?
225
+ puts decrypted_value
226
+ end
227
+ else
228
+ puts decrypted_value
229
+ end
230
+ else
231
+ puts as_json(decrypted_value)
232
+ end
233
+ else
234
+ puts "No data found."
235
+ end
236
+
237
+ print reset, "\n"
238
+
239
+ return 0
240
+ rescue RestClient::Exception => e
241
+ print_rest_exception(e, options)
242
+ return 1
243
+ end
244
+ end
245
+
246
+ def put(args)
247
+ usage = <<-EOT
248
+ Usage: #{prog_name} #{command_name} put [key] [value] [options] to store a string.
249
+ #{prog_name} #{command_name} put [key] [k=v] [k=v] [options] to store an object.
250
+ EOT
251
+ options = {}
252
+ params = {}
253
+ item_key = nil
254
+ item_value = nil
255
+ ttl = nil
256
+ no_overwrite = nil
257
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
258
+ # opts.banner = subcommand_usage("[key] [value]\n\t[key] [k=v] [k=v] [k=v]")
259
+ opts.banner = usage
260
+ opts.on( '--key KEY', String, "Key. This can also be passed as the first argument." ) do |val|
261
+ item_key = val
262
+ end
263
+ opts.on( '-v', '--value VALUE', "Secret value. This can be used to store a string instead of an object, and can also be passed as the second argument." ) do |val|
264
+ item_value = val
265
+ end
266
+ # opts.on( '--type VALUE', String, "Type, default is based on key engine, string or object" ) do |val|
267
+ # params['type'] = val
268
+ # end
269
+ opts.on( '-t', '--ttl SECONDS', "Time to live, the lease duration before this key expires." ) do |val|
270
+ ttl = val
271
+ if val.to_s.empty? || val.to_s == '0'
272
+ ttl = 0
273
+ else
274
+ ttl = val
275
+ end
276
+ end
277
+ opts.on( '--type string|object', "The type of data being stored: string or object." ) do |val|
278
+ params['type'] = val
279
+ end
280
+ # opts.on( '--no-overwrite', '--no-overwrite', "Do not overwrite existing keys. Existing keys are overwritten by default." ) do
281
+ # params['overwrite'] = false
282
+ # end
283
+ build_common_options(opts, options, [:auto_confirm, :options, :payload, :query, :json, :yaml, :csv, :fields, :outfile, :dry_run, :quiet, :remote])
284
+ opts.footer = "Create or update a cypher key." + "\n" +
285
+ "[key] is required. This is the key of the cypher being created or updated. The key includes the mount prefix eg. secret/hello" + "\n" +
286
+ "[value] is required for some cypher engines, such as secret. This is the secret value or k=v pairs being stored. Supports 1-N arguments." + "\n" +
287
+ "If a single [value] is passed, it is stored as type string." + "\n" +
288
+ "If more than one [value] is passed, the format is expected to be k=v and the value will be stored as an object." + "\n" +
289
+ "The --value option can be used to store a string value." + "\n" +
290
+ "The --payload option can be used to store an object."
291
+ end
292
+ optparse.parse!(args)
293
+ # if args.count < 1
294
+ # print_error MtnCloud::Terminal.angry_prompt
295
+ # puts_error "wrong number of arguments, expected 1-N and got #{args.count}\n#{optparse}"
296
+ # return 1
297
+ # end
298
+ connect(options)
299
+ params.merge!(parse_query_options(options))
300
+
301
+ # parse arguments like [value] or [k=v]
302
+ if args.count == 0
303
+ # prompt for key and value
304
+ elsif args.count == 1
305
+ item_key = args[0]
306
+ # prompt for value
307
+ elsif args.count == 2
308
+ item_key = args[0]
309
+ item_value = args[1]
310
+ # expecting [value] or [k=v]
311
+ item_value_object = {}
312
+ item_value_pair = item_value.split("=")
313
+ if item_value_pair.size == 2
314
+ item_value_object[item_value_pair[0].to_s] = item_value_pair[1]
315
+ item_value = item_value_object
316
+ else
317
+ # item_value = item_value
318
+ end
319
+ elsif args.count > 2
320
+ item_key = args[0]
321
+ item_value = args[1]
322
+ # expecting [k=v] [k=v]
323
+ item_value_object = {}
324
+ args[1..(args.size-1)].each do |arg|
325
+ item_value_pair = arg.split("=")
326
+ item_value_object[item_value_pair[0].to_s] = item_value_pair[1]
327
+ end
328
+ item_value = item_value_object
329
+ end
330
+
331
+ # this is redunant and silly, refactor soon
332
+
333
+ # Key prompt
334
+ if item_key
335
+ options[:options]['key'] = item_key
336
+ end
337
+ if item_key.nil?
338
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'key', 'fieldLabel' => 'Key', 'type' => 'text', 'required' => true, 'description' => cypher_key_help}], options[:options])
339
+ item_key = v_prompt['key']
340
+ end
341
+
342
+ payload = nil
343
+ if options[:payload]
344
+ payload = options[:payload]
345
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) || ['key','value'].include?(k)}) if options[:options] && options[:options].keys.size > 0
346
+ else
347
+ # merge -O options into normally parsed options
348
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) || ['key','value'].include?(k)}) if options[:options] && options[:options].keys.size > 0
349
+
350
+ # Value prompt
351
+ value_is_required = false
352
+ cypher_mount_type = item_key.split("/").first
353
+ if ["secret","tfvars"].include?(cypher_mount_type)
354
+ value_is_required = true
355
+ end
356
+
357
+ # todo: read value from STDIN shall we?
358
+
359
+ # cool, we got value as arguments like foo=bar
360
+ if args.count > 1
361
+ # parse one and only arg as the value like password/mine mypassword123
362
+ if args.count == 2 && args[1].split("=").size() == 1
363
+ item_value = args[1]
364
+ elsif args.count > 1
365
+ # parse args as key value pairs like secret/config foo=bar thing=myvalue
366
+ value_arguments = args[1..-1]
367
+ value_arguments_map = {}
368
+ value_arguments.each do |value_argument|
369
+ value_pair = value_argument.split("=")
370
+ value_arguments_map[value_pair[0]] = value_pair[1] ? value_pair[1..-1].join("=") : nil
371
+ end
372
+ item_value = value_arguments_map
373
+ end
374
+ else
375
+ # Prompt for a single text value to be sent as {"value":"my secret"}
376
+ if value_is_required
377
+ options[:options]['value'] = item_value if item_value
378
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'value', 'fieldLabel' => 'Value', 'type' => 'text', 'required' => value_is_required, 'description' => "Secret value for this cypher"}], options[:options])
379
+ item_value = v_prompt['value']
380
+ end
381
+ end
382
+
383
+ # make sure not to pass a value for these or it will not save them.
384
+ # if ['uuid','key','password'].include?(cypher_mount_type)
385
+ # item_value = nil
386
+ # end
387
+
388
+ # construct payload
389
+ # payload = {
390
+ # 'cypher' => params
391
+ # }
392
+ payload = {}
393
+ # if value is valid json, then the payload IS the value
394
+ if item_value.is_a?(String) && item_value.to_s[0] == '{' && item_value.to_s[-1] == '}'
395
+ begin
396
+ json_object = JSON.parse(item_value)
397
+ item_value = json_object
398
+ rescue => ex
399
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse cypher value '#{item_value}' as JSON. Error: #{ex}" if MtnCloud::Logging.debug?
400
+ raise_command_error "Failed to parse cypher value as JSON: #{item_value}"
401
+ # return 1
402
+ end
403
+ else
404
+ # it is just a string
405
+ if item_value.is_a?(String)
406
+ params['type'] = 'string'
407
+ #params["value"] = item_value
408
+ payload["value"] = item_value
409
+ elsif item_value.nil?
410
+ payload = {}
411
+ else item_value
412
+ # great, a Hash I hope
413
+ payload = item_value
414
+ end
415
+ end
416
+ end
417
+
418
+ # prompt for Lease
419
+ options[:options]['ttl'] = ttl if ttl
420
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'ttl', 'fieldLabel' => 'Lease (TTL in seconds)', 'type' => 'text', 'required' => false, 'description' => cypher_ttl_help, 'defaultValue' => '0'}], options[:options])
421
+ ttl = v_prompt['ttl']
422
+
423
+ if ttl
424
+ params['ttl'] = ttl
425
+ #payload["ttl"] = ttl
426
+ end
427
+ @cypher_interface.setopts(options)
428
+ if options[:dry_run]
429
+ print_dry_run @cypher_interface.dry.create(item_key, params, payload)
430
+ return
431
+ end
432
+ existing_cypher = nil
433
+ json_response = @cypher_interface.list(item_key)
434
+ if json_response["data"] && json_response["data"]["keys"]
435
+ existing_cypher = json_response["data"]["keys"].find {|k| k == item_key }
436
+ end
437
+ if existing_cypher
438
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to overwrite the cypher key #{item_key}?")
439
+ return 9, "aborted command"
440
+ end
441
+ end
442
+ json_response = @cypher_interface.create(item_key, params, payload)
443
+ render_result = render_with_format(json_response, options)
444
+ if render_result
445
+ return 0
446
+ end
447
+ #print_green_success "Cypher #{item_key} updated"
448
+ # print_green_success "Wrote cypher #{item_key}"
449
+ print_green_success "Success! Data written to: #{item_key}"
450
+ # should print without doing get, because that can use a token.
451
+ cypher_item = json_response['cypher']
452
+ get_args = [item_key] + (options[:remote] ? ["-r",options[:remote]] : [])
453
+ get(get_args)
454
+ return 0
455
+ end
456
+
457
+ def remove(args)
458
+ options = {}
459
+ params = {}
460
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
461
+ opts.banner = subcommand_usage("[key]")
462
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
463
+ opts.footer = "Delete a cypher." + "\n" +
464
+ "[key] is required. This is the cypher key to be deleted."
465
+ end
466
+ optparse.parse!(args)
467
+
468
+ if args.count != 1
469
+ print_error MtnCloud::Terminal.angry_prompt
470
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
471
+ return 1
472
+ end
473
+
474
+ connect(options)
475
+ begin
476
+ item_key = args[0]
477
+ cypher_item = find_cypher_by_key(item_key)
478
+ return 1 if cypher_item.nil?
479
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the cypher #{item_key}?")
480
+ return 9, "aborted command"
481
+ end
482
+ @cypher_interface.setopts(options)
483
+ if options[:dry_run]
484
+ print_dry_run @cypher_interface.dry.destroy(item_key, params)
485
+ return
486
+ end
487
+ json_response = @cypher_interface.destroy(item_key, params)
488
+ if options[:json]
489
+ puts as_json(json_response, options)
490
+ elsif !options[:quiet]
491
+ print_green_success "Deleted cypher #{item_key}"
492
+ # list([])
493
+ end
494
+ return 0
495
+ rescue RestClient::Exception => e
496
+ print_rest_exception(e, options)
497
+ return 1
498
+ end
499
+ end
500
+
501
+ private
502
+
503
+ def find_cypher_by_key(key, params={})
504
+ begin
505
+ json_response = @cypher_interface.get(key, params)
506
+ return json_response
507
+ rescue RestClient::Exception => e
508
+ if e.response && e.response.code == 404
509
+ print_red_alert "Cypher not found by key #{key}"
510
+ return nil
511
+ else
512
+ raise e
513
+ end
514
+ end
515
+ end
516
+
517
+ def cypher_key_help
518
+ """
519
+ Keys can have different behaviors depending on the specified mountpoint.
520
+ Available Mountpoints:
521
+ password - Generates a secure password of specified character length in the key pattern (or 15) with symbols, numbers, upper case, and lower case letters (i.e. password/15/mypass generates a 15 character password).
522
+ tfvars - This is a module to store a tfvars file for terraform.
523
+ secret - This is the standard secret module that stores a key/value in encrypted form.
524
+ uuid - Returns a new UUID by key name when requested and stores the generated UUID by key name for a given lease timeout period.
525
+ key - Generates a Base 64 encoded AES Key of specified bit length in the key pattern (i.e. key/128/mykey generates a 128-bit key)"""
526
+ end
527
+
528
+ def cypher_ttl_help
529
+ """
530
+ TTL in seconds
531
+ Quick Second Time Reference:
532
+ Hour: 3600
533
+ Day: 86400
534
+ Week: 604800
535
+ Month (30 days): 2592000
536
+ Year: 31536000
537
+ Unlimited: 0
538
+ This can be passed in abbreviated duration format. eg. 32d, 90s, 5y
539
+ The default is 0, meaning Unlimited.
540
+ """
541
+ end
542
+
543
+ def format_lease_remaining(expire_date, warning_threshold=3600, return_color=cyan)
544
+ out = ""
545
+ if expire_date
546
+ out << format_expiration_date(expire_date, warning_threshold, return_color)
547
+ out << " ("
548
+ out << format_expiration_ttl(expire_date, warning_threshold, return_color)
549
+ out << ")"
550
+ else
551
+ # out << return_color
552
+ out << "Never expires"
553
+ end
554
+ return out
555
+ end
556
+
557
+ def format_expiration_date(expire_date, warning_threshold=3600, return_color=cyan)
558
+ expire_date = parse_time(expire_date)
559
+ if !expire_date
560
+ # return ""
561
+ return cyan + "Never expires" + return_color
562
+ end
563
+ if expire_date <= Time.now
564
+ return red + format_local_dt(expire_date) + return_color
565
+ else
566
+ return cyan + format_local_dt(expire_date) + return_color
567
+ end
568
+ end
569
+
570
+ def format_expiration_ttl(expire_date, warning_threshold=3600, return_color=cyan)
571
+ expire_date = parse_time(expire_date)
572
+ if !expire_date
573
+ return ""
574
+ #return cyan + "Never expires" + return_color
575
+ end
576
+ seconds = expire_date - Time.now
577
+ if seconds <= 0
578
+ # return red + "Expired" + return_color
579
+ return red + "Expired " + format_duration_seconds(seconds.abs).to_s + " ago" + return_color
580
+ elsif seconds <= warning_threshold
581
+ return yellow + format_duration_seconds(seconds.abs).to_s + return_color
582
+ else
583
+ return cyan + format_duration_seconds(seconds.abs).to_s + return_color
584
+ end
585
+ end
586
+ end
587
+