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,1391 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::Tasks
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::JobsHelper
6
+
7
+ register_subcommands :list, :get, :add, :update, :remove, :execute
8
+ register_subcommands :'list-types' => :list_task_types
9
+ register_subcommands :'get-type' => :get_task_type
10
+
11
+ def connect(opts)
12
+ @api_client = establish_remote_appliance_connection(opts)
13
+ @tasks_interface = @api_client.tasks
14
+ @task_sets_interface = @api_client.task_sets
15
+ @instances_interface = @api_client.instances
16
+ @servers_interface = @api_client.servers
17
+ end
18
+
19
+ def handle(args)
20
+ handle_subcommand(args)
21
+ end
22
+
23
+ def list(args)
24
+ params = {}
25
+ options = {}
26
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
27
+ opts.banner = subcommand_usage("[search]")
28
+ opts.on('-t', '--type x,y,z', Array, "Filter by task type code(s)") do |val|
29
+ params['taskTypeCodes'] = val
30
+ end
31
+
32
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
33
+ add_query_parameter(params, 'labels', parse_labels(val))
34
+ end
35
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
36
+ add_query_parameter(params, 'allLabels', parse_labels(val))
37
+ end
38
+
39
+ build_standard_list_options(opts, options)
40
+ opts.footer = "List tasks."
41
+ end
42
+ optparse.parse!(args)
43
+ connect(options)
44
+ if args.count > 0
45
+ options[:phrase] = args.join(" ")
46
+ end
47
+ params.merge!(parse_list_options(options))
48
+ @tasks_interface.setopts(options)
49
+ if options[:dry_run]
50
+ print_dry_run @tasks_interface.dry.list(params)
51
+ return
52
+ end
53
+ json_response = @tasks_interface.list(params)
54
+ tasks = json_response['tasks']
55
+ render_response(json_response, options, 'tasks') do
56
+ title = "Tasks"
57
+ subtitles = []
58
+ subtitles += parse_list_subtitles(options)
59
+ print_h1 title, subtitles
60
+ if tasks.empty?
61
+ print cyan,"No tasks found.",reset,"\n"
62
+ else
63
+ print cyan
64
+ print_tasks_table(tasks, options)
65
+ print_results_pagination(json_response)
66
+ end
67
+ print reset,"\n"
68
+ end
69
+ if tasks.empty?
70
+ return 1, "no tasks found"
71
+ else
72
+ return 0, nil
73
+ end
74
+
75
+ end
76
+
77
+ def get(args)
78
+ options = {}
79
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
80
+ opts.banner = subcommand_usage("[workflow]")
81
+ opts.on('--no-content', "Do not display script content." ) do
82
+ options[:no_content] = true
83
+ end
84
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
85
+ end
86
+ optparse.parse!(args)
87
+ if args.count < 1
88
+ raise_command_error "wrong number of arguments, expected 1-N and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
89
+ end
90
+ connect(options)
91
+ id_list = parse_id_list(args)
92
+ return run_command_for_each_arg(id_list) do |arg|
93
+ _get(arg, options)
94
+ end
95
+ end
96
+
97
+ def _get(id, options)
98
+ task_name = id
99
+ begin
100
+ @tasks_interface.setopts(options)
101
+ if options[:dry_run]
102
+ if task_name.to_s =~ /\A\d{1,}\Z/
103
+ print_dry_run @tasks_interface.dry.get(task_name.to_i)
104
+ else
105
+ print_dry_run @tasks_interface.dry.get({name: task_name})
106
+ end
107
+ return
108
+ end
109
+ task = find_task_by_name_or_id(task_name)
110
+ exit 1 if task.nil?
111
+ # refetch it
112
+ json_response = {'task' => task}
113
+ unless task_name.to_s =~ /\A\d{1,}\Z/
114
+ json_response = @tasks_interface.get(task['id'])
115
+ end
116
+ if options[:json]
117
+ puts as_json(json_response, options, "task")
118
+ return 0
119
+ elsif options[:yaml]
120
+ puts as_yaml(json_response, options, "task")
121
+ return 0
122
+ elsif options[:csv]
123
+ puts records_as_csv([json_response['task']], options)
124
+ return 0
125
+ else
126
+ # load task type to know which options to display
127
+ task_type = task['taskType'] ? find_task_type_by_name(task['taskType']['name']) : nil
128
+ #print "\n", cyan, "Task #{task['name']} - #{task['taskType']['name']}\n\n"
129
+ print_h1 "Task Details"
130
+ print cyan
131
+ description_cols = {
132
+ "ID" => 'id',
133
+ "Name" => 'name',
134
+ "Code" => 'code',
135
+ "Type" => lambda {|it| it['taskType']['name'] },
136
+ "Labels" => lambda {|it| format_list(it['labels'], '', 3) rescue '' },
137
+ "Visibility" => 'visibility',
138
+ "Execute Target" => lambda {|it|
139
+ if it['executeTarget'] == 'local'
140
+ git_info = []
141
+ if it['taskOptions']
142
+ if it['taskOptions']['localScriptGitId']
143
+ git_info << "Git Repo: #{it['taskOptions']['localScriptGitId']}"
144
+ end
145
+ if it['taskOptions']['localScriptGitRef']
146
+ git_info << "Git Ref: #{it['taskOptions']['localScriptGitRef']}"
147
+ end
148
+ end
149
+ "Local #{git_info.join(', ')}"
150
+ elsif it['executeTarget'] == 'remote'
151
+ remote_url = ""
152
+ if it['taskOptions']
153
+ remote_url = "#{it['taskOptions']['username']}@#{it['taskOptions']['host']}:#{it['taskOptions']['port']}"
154
+ end
155
+ "Remote #{remote_url}"
156
+ elsif it['executeTarget'] == 'resource'
157
+ "Resource"
158
+ else
159
+ it['executeTarget']
160
+ end
161
+ },
162
+ "Result Type" => 'resultType',
163
+ "Retryable" => lambda {|it|
164
+ if it['retryable']
165
+ format_boolean(it['retryable']).to_s + " Count: #{it['retryCount']}, Delay: #{it['retryDelaySeconds']}"
166
+ else
167
+ format_boolean(it['retryable'])
168
+ end
169
+ },
170
+ "Allow Custom Config" => lambda {|it| format_boolean(it['allowCustomConfig']) },
171
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
172
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
173
+ }
174
+ print_description_list(description_cols, task)
175
+
176
+ # JD: uhh, the api should NOT be returning passwords!!
177
+ if task_type
178
+ # task_type['optionTypes'].sort { |x,y| x['displayOrder'].to_i <=> y['displayOrder'].to_i }.each do |optionType|
179
+ # if optionType['fieldLabel'].to_s.downcase == 'script'
180
+ # if task['taskOptions'][optionType['fieldName']]
181
+ # print_h2 "Script"
182
+ # print reset,"#{task['taskOptions'][optionType['fieldName']]}","\n",reset
183
+ # end
184
+ # else
185
+ # print cyan,("#{optionType['fieldLabel']} : " + (optionType['type'] == 'password' ? "#{task['taskOptions'][optionType['fieldName']] ? '************' : ''}" : "#{task['taskOptions'][optionType['fieldName']] || optionType['defaultValue']}")),"\n"
186
+ # end
187
+ # end
188
+ script_content = nil
189
+ task_option_types = []
190
+ task_option_config = {}
191
+ task_option_columns = []
192
+ task_type['optionTypes'].sort { |x,y| x['displayOrder'].to_i <=> y['displayOrder'].to_i }.each do |optionType|
193
+ if optionType['code'] == 'script'
194
+ script_content = task['taskOptions'][optionType['fieldName']]
195
+ elsif optionType['fieldName'] == 'httpHeaders' || optionType['fieldName'] == 'webHeaders'
196
+ http_headers = task['taskOptions']['httpHeaders'] || task['taskOptions']['webHeaders']
197
+ begin
198
+ if http_headers.is_a?(String)
199
+ http_headers = JSON.parse(http_headers)
200
+ end
201
+ # API has mismatch on fieldName httpHeaders vs webHeaders, we want to format this in a particular way though anyhow..
202
+ task_option_columns << {(optionType['fieldLabel']) => lambda {|it| http_headers.collect {|h| "#{h['key']}: #{h['value']}"}.join(", ") } }
203
+ rescue => ex
204
+ MtnCloud::Logging::DarkPrinter.puts("Failed to parse httpHeaders task option as JSON") if MtnCloud::Logging.debug?
205
+ end
206
+ else
207
+ task_option_types << optionType
208
+ task_option_columns << {(optionType['fieldLabel']) => lambda {|it|
209
+ value = task['taskOptions'][optionType['code']] || task['taskOptions'][optionType['fieldName']] || optionType['defaultValue']
210
+ if optionType['type'] == 'checkbox'
211
+ value.to_s.empty? ? 'off' : value.to_s
212
+ else
213
+ value.to_s
214
+ end
215
+ } }
216
+ end
217
+ end
218
+ else
219
+ print yellow,"Task type not found.",reset,"\n"
220
+ end
221
+ if !task_option_columns.empty?
222
+ print_h2 "Task Options"
223
+ print_description_list(task_option_columns, task["taskOptions"])
224
+ end
225
+ if script_content
226
+ print_h2 "Script"
227
+ print reset,script_content,"\n",reset
228
+ end
229
+ # some task types have a file (file-content) instead of taskOptions.script
230
+ file_content = task['file']
231
+ if file_content && options[:no_content] != true
232
+ print_h2 "Script Content"
233
+ if file_content['sourceType'] == 'local'
234
+ puts file_content['content']
235
+ elsif file_content['sourceType'] == 'url'
236
+ puts "URL: #{file_content['contentPath']}"
237
+ elsif file_content['sourceType'] == 'repository'
238
+ puts "Repository: #{file_content['repository']['name'] rescue 'n/a'}"
239
+ puts "Path: #{file_content['contentPath']}"
240
+ if file_content['contentRef']
241
+ puts "Ref: #{file_content['contentRef']}"
242
+ end
243
+ else
244
+ puts "Source: #{file_content['sourceType']}"
245
+ puts "Path: #{file_content['contentPath']}"
246
+ end
247
+ end
248
+
249
+ print reset,"\n"
250
+ return 0
251
+ end
252
+ rescue RestClient::Exception => e
253
+ print_rest_exception(e, options)
254
+ exit 1
255
+ end
256
+ end
257
+
258
+ def add(args)
259
+ params = {}
260
+ file_params = {}
261
+ options = {}
262
+ task_name = nil
263
+ task_code = nil
264
+ task_type_name = nil
265
+ task_visibility = nil
266
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
267
+ opts.banner = subcommand_usage("[name] -t TASK_TYPE")
268
+ opts.on( '-t', '--type TASK_TYPE', "Task Type" ) do |val|
269
+ task_type_name = val
270
+ end
271
+ opts.on('--name NAME', String, "Task Name" ) do |val|
272
+ task_name = val
273
+ end
274
+ opts.on('--visibility VISIBILITY', String, "Task Visibility" ) do |val|
275
+ task_visibility = val
276
+ end
277
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
278
+ options[:options]['labels'] = parse_labels(val)
279
+ end
280
+ opts.on('--code CODE', String, "Task Code" ) do |val|
281
+ task_code = val
282
+ end
283
+ opts.on('--source VALUE', String, "Source Type. local, repository, url. Only applies to script task types.") do |val|
284
+ file_params['sourceType'] = val
285
+ end
286
+ opts.on('--content TEXT', String, "Contents of the task script. This implies source is local.") do |val|
287
+ file_params['sourceType'] = 'local' if file_params['sourceType'].nil?
288
+ file_params['content'] = val
289
+ end
290
+ opts.on('--file FILE', "File containing the task script. This can be used instead of --content" ) do |filename|
291
+ file_params['sourceType'] = 'local' if file_params['sourceType'].nil?
292
+ full_filename = File.expand_path(filename)
293
+ if File.exist?(full_filename)
294
+ file_params['content'] = File.read(full_filename)
295
+ else
296
+ print_red_alert "File not found: #{full_filename}"
297
+ exit 1
298
+ end
299
+ end
300
+ opts.on('--url VALUE', String, "URL, for use when source is url") do |val|
301
+ file_params['contentPath'] = val
302
+ end
303
+ opts.on('--content-path VALUE', String, "Content Path, for use when source is repository or url") do |val|
304
+ file_params['contentPath'] = val
305
+ end
306
+ opts.on('--content-ref VALUE', String, "Content Ref (Version Ref), for use when source is repository") do |val|
307
+ file_params['contentRef'] = val
308
+ end
309
+ opts.on('--result-type VALUE', String, "Result Type" ) do |val|
310
+ options[:options]['resultType'] = val
311
+ end
312
+ opts.on('--result-type VALUE', String, "Result Type" ) do |val|
313
+ options[:options]['executeTarget'] = val
314
+ end
315
+ opts.on('--execute-target VALUE', String, "Execute Target" ) do |val|
316
+ options[:options]['executeTarget'] = val
317
+ end
318
+ opts.on('--credential VALUE', String, "Credential ID or \"local\"" ) do |val|
319
+ options[:options]['credential'] = val
320
+ end
321
+ opts.on('--target-host VALUE', String, "Target Host" ) do |val|
322
+ options[:options]['taskOptions'] ||= {}
323
+ options[:options]['taskOptions']['host'] = val
324
+ end
325
+ opts.on('--target-port VALUE', String, "Target Port" ) do |val|
326
+ options[:options]['taskOptions'] ||= {}
327
+ options[:options]['taskOptions']['port'] = val
328
+ end
329
+ opts.on('--target-username VALUE', String, "Target Username" ) do |val|
330
+ options[:options]['taskOptions'] ||= {}
331
+ options[:options]['taskOptions']['username'] = val
332
+ end
333
+ opts.on('--target-password VALUE', String, "Target Password" ) do |val|
334
+ options[:options]['taskOptions'] ||= {}
335
+ options[:options]['taskOptions']['password'] = val
336
+ end
337
+ opts.on('--target-ssh-key VALUE', String, "Target SSH Key" ) do |val|
338
+ options[:options]['taskOptions'] ||= {}
339
+ options[:options]['taskOptions']['sshKey'] = val
340
+ end
341
+ opts.on('--git-repo VALUE', String, "Git Repo ID" ) do |val|
342
+ options[:options]['taskOptions'] ||= {}
343
+ options[:options]['taskOptions']['localScriptGitId'] = val
344
+ end
345
+ opts.on('--git-ref VALUE', String, "Git Ref" ) do |val|
346
+ options[:options]['taskOptions'] ||= {}
347
+ options[:options]['taskOptions']['localScriptGitRef'] = val
348
+ end
349
+ opts.on('--retryable [on|off]', String, "Retryable" ) do |val|
350
+ options[:options]['retryable'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
351
+ end
352
+ opts.on('--retry-count COUNT', String, "Retry Count" ) do |val|
353
+ options[:options]['retryCount'] = val.to_i
354
+ end
355
+ opts.on('--retry-delay SECONDS', String, "Retry Delay Seconds" ) do |val|
356
+ options[:options]['retryDelaySeconds'] = val.to_i
357
+ end
358
+ opts.on('--allow-custom-config [on|off]', String, "Allow Custom Config") do |val|
359
+ options[:options]['allowCustomConfig'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
360
+ end
361
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
362
+ end
363
+ optparse.parse!(args)
364
+ #verify_args!(args:args, count:1, optparse:optparse)
365
+ if args[0]
366
+ # task_name = args[0]
367
+ task_name = args[0]
368
+ end
369
+ # if task_name.nil? || task_type_name.nil?
370
+ # puts optparse
371
+ # exit 1
372
+ # end
373
+ connect(options)
374
+ begin
375
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
376
+ if passed_options['type']
377
+ task_type_name = passed_options.delete('type')
378
+ end
379
+ payload = nil
380
+
381
+ if options[:payload]
382
+ payload = options[:payload]
383
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
384
+ payload.deep_merge!({'task' => {'file' => file_params}}) unless file_params.empty?
385
+ else
386
+ # construct payload
387
+ payload = {
388
+ "task" => {
389
+ #"name" => task_name,
390
+ #"code" => task_code,
391
+ #"taskType" {"id" => task_type['id'], "code" => task_type['code']},
392
+ #"taskOptions" => {}
393
+ }
394
+ }
395
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
396
+
397
+
398
+
399
+ # Name
400
+ if task_name
401
+ payload['task']['name'] = task_name
402
+ else
403
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options[:options], @api_client)
404
+ payload['task']['name'] = v_prompt['name'] unless v_prompt['name'].to_s.empty?
405
+ end
406
+
407
+ # Code
408
+ if task_code
409
+ payload['task']['code'] = task_code
410
+ else
411
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'description' => 'Code'}], options[:options], @api_client)
412
+ payload['task']['code'] = v_prompt['code'] unless v_prompt['code'].to_s.empty?
413
+ end
414
+
415
+ # Task Type
416
+ @all_task_types ||= @tasks_interface.list_types({max:1000})['taskTypes']
417
+ task_types_dropdown = @all_task_types.collect {|it| {"name" => it["name"], "value" => it["code"]}}
418
+
419
+ if task_type_name
420
+ #payload['task']['taskType'] = task_type_name
421
+ else
422
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => task_types_dropdown, 'required' => true}], options[:options], @api_client)
423
+ task_type_name = v_prompt['type']
424
+ end
425
+
426
+ task_type = find_task_type_by_name(task_type_name)
427
+ if task_type.nil?
428
+ print_red_alert "Task Type not found by code '#{task_type_name}'"
429
+ return 1
430
+ end
431
+
432
+ # Visibility
433
+ if task_visibility != nil
434
+ payload['task']['visibility'] = task_visibility
435
+ else
436
+ payload['task']['visibility'] = 'private'
437
+ end
438
+
439
+ payload['task']['taskType'] = {"id" => task_type['id'], "code" => task_type['code']}
440
+
441
+
442
+ # Result Type
443
+ if options[:options]['resultType']
444
+ payload['task']['resultType'] = options[:options]['resultType']
445
+ elsif task_type['hasResults']
446
+ result_types_dropdown = [{"name" => "Value", "value" => "value"}, {"name" => "Exit Code", "value" => "exitCode"}, {"name" => "Key Value", "value" => "keyValue"}, {"name" => "JSON", "value" => "json"}]
447
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'resultType', 'fieldLabel' => 'Result Type', 'type' => 'select', 'selectOptions' => result_types_dropdown}], options[:options], @api_client)
448
+ payload['task']['resultType'] = v_prompt['resultType'] unless v_prompt['resultType'].to_s.empty?
449
+ end
450
+
451
+ # Task Type Option Types
452
+
453
+ # correct fieldContext
454
+ has_file_content = false
455
+ task_option_types = task_type['optionTypes'] || []
456
+ task_option_types.each do |it|
457
+ if it['type'] == 'file-content'
458
+ has_file_content = true
459
+ it['fieldContext'] = nil
460
+ it['fieldName'] = 'file'
461
+ # this should be required right!? fix api optionType data plz
462
+ it['required'] = true
463
+ it['defaultValue'] = 'local'
464
+ else
465
+ if it['fieldContext'].nil? || it['fieldContext'] == ''
466
+ it['fieldContext'] = 'taskOptions'
467
+ end
468
+ # taskOptions should prompt for code instead of fieldName, oy vey
469
+ if it['fieldContext'] == 'taskOptions'
470
+ it['fieldName'] = it['code']
471
+ end
472
+ end
473
+ end
474
+ process_special_task_option_typeaheads(task_option_types)
475
+ # inject file_params into options for file-content prompt
476
+ # or into taskOptions.script for types not yet using file-content
477
+ unless file_params.empty?
478
+ if has_file_content
479
+ options[:options]['file'] ||= {}
480
+ options[:options]['file'].merge!(file_params)
481
+ else
482
+ options[:options]['taskOptions'] ||= {}
483
+ options[:options]['taskOptions']['script'] = file_params['content'] if file_params['content']
484
+ end
485
+ end
486
+ # prompt
487
+
488
+ # tasks are different in that they use the optionType code instead of fieldName for the key values
489
+ input_options = MtnCloud::Cli::OptionTypes.prompt(task_option_types, options[:options],@api_client, options[:params])
490
+ # flatten taskOptions as serverside expects
491
+ if input_options['taskOptions']
492
+ input_options['taskOptions'] = MtnCloud::RestClient.grails_params(input_options['taskOptions'])
493
+ # remove "off" checkbox values, like the UI does
494
+ input_options['taskOptions'].keys.each do |k|
495
+ if input_options['taskOptions'][k] == "off"
496
+ input_options['taskOptions'].delete(k)
497
+ end
498
+ end
499
+ end
500
+ payload.deep_merge!({'task' => input_options}) unless input_options.empty?
501
+
502
+
503
+ # Target Options
504
+
505
+ if options[:options]['executeTarget'] != nil
506
+ payload['task']['executeTarget'] = options[:options]['executeTarget']
507
+ else
508
+ default_target = nil
509
+ execute_targets_dropdown = []
510
+ if task_type['allowExecuteLocal']
511
+ default_target = 'local'
512
+ execute_targets_dropdown << {"name" => "Local", "value" => "local"}
513
+ end
514
+ if task_type['allowExecuteRemote']
515
+ default_target = 'remote'
516
+ execute_targets_dropdown << {"name" => "Remote", "value" => "remote"}
517
+ end
518
+ if task_type['allowExecuteResource']
519
+ default_target = 'resource'
520
+ execute_targets_dropdown << {"name" => "Resource", "value" => "resource"}
521
+ end
522
+ if !execute_targets_dropdown.empty?
523
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'executeTarget', 'fieldLabel' => 'Execute Target', 'type' => 'select', 'selectOptions' => execute_targets_dropdown, 'defaultValue' => default_target, 'required' => true}], options[:options], @api_client)
524
+ payload['task']['executeTarget'] = v_prompt['executeTarget'].to_s unless v_prompt['executeTarget'].to_s.empty?
525
+ end
526
+ end
527
+
528
+ if payload['task']['executeTarget'] == 'local'
529
+ if task_type['allowLocalRepo']
530
+ # Git Repo
531
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'localScriptGitId', 'fieldLabel' => 'Git Repo', 'type' => 'text', 'description' => 'Git Repo ID'}], options[:options], @api_client)
532
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['localScriptGitId'].to_s.empty?
533
+ payload['task']['taskOptions'] ||= {}
534
+ payload['task']['taskOptions']['localScriptGitId'] = v_prompt['taskOptions']['localScriptGitId']
535
+ end
536
+ # Git Ref
537
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'localScriptGitRef', 'fieldLabel' => 'Git Ref', 'type' => 'text', 'description' => 'Git Ref eg. master'}], options[:options], @api_client)
538
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['localScriptGitRef'].to_s.empty?
539
+ payload['task']['taskOptions'] ||= {}
540
+ payload['task']['taskOptions']['localScriptGitRef'] = v_prompt['taskOptions']['localScriptGitRef']
541
+ end
542
+ end
543
+
544
+ elsif payload['task']['executeTarget'] == 'remote'
545
+ # Host
546
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'host', 'fieldLabel' => 'IP Address', 'type' => 'text', 'description' => 'IP Address / Host for remote execution'}], options[:options], @api_client)
547
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['host'].to_s.empty?
548
+ payload['task']['taskOptions'] ||= {}
549
+ payload['task']['taskOptions']['host'] = v_prompt['taskOptions']['host']
550
+ end
551
+ # Port
552
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'port', 'fieldLabel' => 'Port', 'type' => 'text', 'description' => 'Port for remote execution', 'defaultValue' => '22'}], options[:options], @api_client)
553
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['port'].to_s.empty?
554
+ payload['task']['taskOptions'] ||= {}
555
+ payload['task']['taskOptions']['port'] = v_prompt['taskOptions']['port']
556
+ end
557
+ # Credentials
558
+ credential_code = "credential"
559
+ credential_option_type = {'code' => credential_code, 'fieldName' => credential_code, 'fieldLabel' => 'Credentials', 'type' => 'select', 'optionSource' => 'credentials', 'description' => 'Enter an existing credential ID or choose "local"', 'defaultValue' => "local", 'required' => true}
560
+ supported_credential_types = ['username-keypair', 'username-password', 'username-password-keypair'].compact.flatten.join(",").split(",").collect {|it| it.strip }
561
+ credential_params = {"new" => false, "credentialTypes" => supported_credential_types}
562
+ credential_value = MtnCloud::Cli::OptionTypes.select_prompt(credential_option_type, @api_client, credential_params, options[:no_prompt], options[:options][credential_code])
563
+ if !credential_value.to_s.empty?
564
+ if credential_value == "local"
565
+ payload['task'][credential_code] = {"type" => credential_value}
566
+ elsif credential_value.to_s =~ /\A\d{1,}\Z/
567
+ payload['task'][credential_code] = {"id" => credential_value.to_i}
568
+ end
569
+ end
570
+ if credential_value == "local"
571
+ # Username
572
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'username', 'fieldLabel' => 'Username', 'type' => 'text', 'description' => 'Username for remote execution'}], options[:options], @api_client)
573
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['username'].to_s.empty?
574
+ payload['task']['taskOptions'] ||= {}
575
+ payload['task']['taskOptions']['username'] = v_prompt['taskOptions']['username']
576
+ end
577
+ # Password
578
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'description' => 'Password for remote execution'}], options[:options], @api_client)
579
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['password'].to_s.empty?
580
+ payload['task']['taskOptions'] ||= {}
581
+ payload['task']['taskOptions']['password'] = v_prompt['taskOptions']['password']
582
+ end
583
+ # SSH Key
584
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldContext' => 'taskOptions', 'fieldName' => 'sshKey', 'fieldLabel' => 'Key', 'type' => 'select', 'optionSource' => 'keyPairs', 'description' => 'SSH Key for remote execution'}], options[:options], @api_client)
585
+ if v_prompt['taskOptions'] && !v_prompt['taskOptions']['sshKey'].to_s.empty?
586
+ payload['task']['taskOptions'] ||= {}
587
+ payload['task']['taskOptions']['sshKey'] = v_prompt['taskOptions']['sshKey']
588
+ end
589
+ end
590
+ end
591
+
592
+
593
+ # Retryable
594
+ if options[:options]['retryable'] != nil
595
+ payload['task']['retryable'] = options[:options]['retryable']
596
+ else
597
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'retryable', 'fieldLabel' => 'Retryable', 'type' => 'checkbox', 'defaultValue' => false}], options[:options], @api_client)
598
+ payload['task']['retryable'] = ['true','on'].include?(v_prompt['retryable'].to_s) unless v_prompt['retryable'].nil?
599
+ end
600
+
601
+ if payload['task']['retryable']
602
+ # Retry Count
603
+ if options[:options]['retryCount']
604
+ payload['task']['retryCount'] = options[:options]['retryCount'].to_i
605
+ else
606
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'retryCount', 'fieldLabel' => 'Retry Count', 'type' => 'number', 'defaultValue' => 5}], options[:options], @api_client)
607
+ payload['task']['retryCount'] = v_prompt['retryCount'].to_i unless v_prompt['retryCount'].nil?
608
+ end
609
+ # Retry Delay
610
+ if options[:options]['retryDelaySeconds']
611
+ payload['task']['retryDelaySeconds'] = options[:options]['retryDelaySeconds'].to_i
612
+ else
613
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'retryDelaySeconds', 'fieldLabel' => 'Retry Delay', 'type' => 'number', 'defaultValue' => 10}], options[:options], @api_client)
614
+ payload['task']['retryDelaySeconds'] = v_prompt['retryDelaySeconds'].to_i unless v_prompt['retryDelaySeconds'].nil?
615
+ end
616
+ end
617
+
618
+
619
+ # Allow Custom Config
620
+ if options[:options]['allowCustomConfig'] != nil
621
+ payload['task']['allowCustomConfig'] = options[:options]['allowCustomConfig']
622
+ else
623
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'allowCustomConfig', 'fieldLabel' => 'Allow Custom Config', 'type' => 'checkbox', 'defaultValue' => false}], options[:options], @api_client)
624
+ payload['task']['allowCustomConfig'] = ['true','on'].include?(v_prompt['allowCustomConfig'].to_s) unless v_prompt['allowCustomConfig'].nil?
625
+ end
626
+
627
+
628
+ end
629
+ @tasks_interface.setopts(options)
630
+ if options[:dry_run]
631
+ print_dry_run @tasks_interface.dry.create(payload)
632
+ return
633
+ end
634
+ json_response = @tasks_interface.create(payload)
635
+ task = json_response['task']
636
+ if options[:json]
637
+ print JSON.pretty_generate(json_response),"\n"
638
+ elsif !options[:quiet]
639
+ task = json_response['task']
640
+ print_green_success "Task #{task['name']} created"
641
+ get([task['id']])
642
+ end
643
+ rescue RestClient::Exception => e
644
+ print_rest_exception(e, options)
645
+ exit 1
646
+ end
647
+ end
648
+
649
+ def update(args)
650
+ params = {}
651
+ file_params = {}
652
+ options = {}
653
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
654
+ opts.banner = subcommand_usage("[task] [options]")
655
+ opts.on('--name NAME', String, "Task Name" ) do |val|
656
+ options[:options]['name'] = val
657
+ end
658
+ opts.on('--visibility VISIBILITY', String, "Task Visibility" ) do |val|
659
+ options[:options]['visibility'] = val
660
+ end
661
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
662
+ options[:options]['labels'] = parse_labels(val)
663
+ end
664
+ opts.on('--code CODE', String, "Task Code" ) do |val|
665
+ options[:options]['code'] = val
666
+ end
667
+ opts.on('--source VALUE', String, "Source Type. local, repository, url. Only applies to script task types.") do |val|
668
+ file_params['sourceType'] = val
669
+ end
670
+ opts.on('--content TEXT', String, "Contents of the task script. This implies source is local.") do |val|
671
+ file_params['sourceType'] = 'local' if file_params['sourceType'].nil?
672
+ file_params['content'] = val
673
+ end
674
+ opts.on('--file FILE', "File containing the task script. This can be used instead of --content" ) do |filename|
675
+ file_params['sourceType'] = 'local' if file_params['sourceType'].nil?
676
+ full_filename = File.expand_path(filename)
677
+ if File.exist?(full_filename)
678
+ file_params['content'] = File.read(full_filename)
679
+ else
680
+ print_red_alert "File not found: #{full_filename}"
681
+ exit 1
682
+ end
683
+ end
684
+ opts.on('--url VALUE', String, "URL, for use when source is url") do |val|
685
+ file_params['contentPath'] = val
686
+ end
687
+ opts.on('--content-path VALUE', String, "Content Path, for use when source is repository or url") do |val|
688
+ file_params['contentPath'] = val
689
+ end
690
+ opts.on('--content-ref VALUE', String, "Content Ref (Version Ref), for use when source is repository") do |val|
691
+ file_params['contentRef'] = val
692
+ end
693
+ opts.on('--result-type VALUE', String, "Result Type" ) do |val|
694
+ options[:options]['resultType'] = val
695
+ end
696
+ opts.on('--result-type VALUE', String, "Result Type" ) do |val|
697
+ options[:options]['executeTarget'] = val
698
+ end
699
+ opts.on('--execute-target VALUE', String, "Execute Target" ) do |val|
700
+ options[:options]['executeTarget'] = val
701
+ end
702
+ opts.on('--credential VALUE', String, "Credential ID or \"local\"" ) do |val|
703
+ options[:options]['credential'] = val
704
+ end
705
+ opts.on('--target-host VALUE', String, "Target Host" ) do |val|
706
+ options[:options]['taskOptions'] ||= {}
707
+ options[:options]['taskOptions']['host'] = val
708
+ end
709
+ opts.on('--target-port VALUE', String, "Target Port" ) do |val|
710
+ options[:options]['taskOptions'] ||= {}
711
+ options[:options]['taskOptions']['port'] = val
712
+ end
713
+ opts.on('--target-username VALUE', String, "Target Username" ) do |val|
714
+ options[:options]['taskOptions'] ||= {}
715
+ options[:options]['taskOptions']['username'] = val
716
+ end
717
+ opts.on('--target-password VALUE', String, "Target Password" ) do |val|
718
+ options[:options]['taskOptions'] ||= {}
719
+ options[:options]['taskOptions']['password'] = val
720
+ end
721
+ opts.on('--target-ssh-key VALUE', String, "Target SSH Key" ) do |val|
722
+ options[:options]['taskOptions'] ||= {}
723
+ options[:options]['taskOptions']['sshKey'] = val
724
+ end
725
+ opts.on('--git-repo VALUE', String, "Git Repo ID" ) do |val|
726
+ options[:options]['taskOptions'] ||= {}
727
+ options[:options]['taskOptions']['localScriptGitId'] = val
728
+ end
729
+ opts.on('--git-ref VALUE', String, "Git Ref" ) do |val|
730
+ options[:options]['taskOptions'] ||= {}
731
+ options[:options]['taskOptions']['localScriptGitRef'] = val
732
+ end
733
+ opts.on('--retryable [on|off]', String, "Retryable" ) do |val|
734
+ options[:options]['retryable'] = val.to_s == 'on' || val.to_s == 'true' || val == '' || val.nil?
735
+ end
736
+ opts.on('--retry-count COUNT', String, "Retry Count" ) do |val|
737
+ options[:options]['retryCount'] = val.to_i
738
+ end
739
+ opts.on('--retry-delay SECONDS', String, "Retry Delay Seconds" ) do |val|
740
+ options[:options]['retryDelaySeconds'] = val.to_i
741
+ end
742
+ opts.on('--allow-custom-config [on|off]', String, "Allow Custom Config") do |val|
743
+ options[:options]['allowCustomConfig'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
744
+ end
745
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
746
+ end
747
+ optparse.parse!(args)
748
+ verify_args!(args:args, count:1, optparse:optparse)
749
+ task_name = args[0]
750
+ connect(options)
751
+ begin
752
+ task = find_task_by_name_or_id(task_name)
753
+ return 1 if task.nil?
754
+ task_type = find_task_type_by_name(task['taskType']['name'])
755
+ return 1 if task_type.nil?
756
+
757
+ # file content param varies, heh
758
+ has_file_content = false
759
+ task_option_types = task_type['optionTypes'] || []
760
+ task_option_types.each do |it|
761
+ if it['type'] == 'file-content'
762
+ has_file_content = true
763
+ end
764
+ end
765
+ # inject file_params into options for file-content prompt
766
+ # or into taskOptions.script for types not yet using file-content
767
+ unless file_params.empty?
768
+ if has_file_content
769
+ options[:options]['file'] ||= {}
770
+ options[:options]['file'].merge!(file_params)
771
+ else
772
+ options[:options]['taskOptions'] ||= {}
773
+ options[:options]['taskOptions']['script'] = file_params['content'] if file_params['content']
774
+ end
775
+ end
776
+
777
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
778
+ payload = nil
779
+
780
+ if options[:payload]
781
+ payload = options[:payload]
782
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
783
+ # payload.deep_merge!({'task' => {'file' => file_params}}) unless file_params.empty?
784
+ else
785
+ # construct payload
786
+ payload = {}
787
+ payload.deep_merge!({'task' => passed_options}) unless passed_options.empty?
788
+ # payload.deep_merge!({'task' => {'file' => file_params}}) unless file_params.empty?
789
+
790
+ if payload['task'].empty?
791
+ print_red_alert "Specify at least one option to update"
792
+ puts optparse
793
+ return 1
794
+ end
795
+
796
+ end
797
+
798
+ @tasks_interface.setopts(options)
799
+ if options[:dry_run]
800
+ print_dry_run @tasks_interface.dry.update(task['id'], payload)
801
+ return 0
802
+ end
803
+ json_response = @tasks_interface.update(task['id'], payload)
804
+ if options[:json]
805
+ print JSON.pretty_generate(json_response)
806
+ if !json_response['success']
807
+ return 1
808
+ end
809
+ else
810
+ print_green_success "Task #{json_response['task']['name'] rescue ''} updated"
811
+ get([task['id']])
812
+ end
813
+ return 0
814
+ rescue RestClient::Exception => e
815
+ print_rest_exception(e, options)
816
+ return 1
817
+ end
818
+ end
819
+
820
+ def remove(args)
821
+ params = {}
822
+ options = {}
823
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
824
+ opts.banner = subcommand_usage("[task]")
825
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
826
+ opts.on( '-f', '--force', "Force Delete" ) do
827
+ params[:force] = true
828
+ end
829
+ end
830
+ optparse.parse!(args)
831
+ verify_args!(args:args, count:1, optparse:optparse)
832
+ task_name = args[0]
833
+ connect(options)
834
+ begin
835
+ task = find_task_by_name_or_id(task_name)
836
+ exit 1 if task.nil?
837
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the task #{task['name']}?")
838
+ exit
839
+ end
840
+ @tasks_interface.setopts(options)
841
+ if options[:dry_run]
842
+ print_dry_run @tasks_interface.dry.destroy(task['id'], params)
843
+ return
844
+ end
845
+ json_response = @tasks_interface.destroy(task['id'], params)
846
+ if options[:json]
847
+ print JSON.pretty_generate(json_response),"\n"
848
+ elsif !options[:quiet]
849
+ print_green_success "Task #{task['name']} removed"
850
+ end
851
+ rescue RestClient::Exception => e
852
+ print_rest_exception(e, options)
853
+ exit 1
854
+ end
855
+ end
856
+
857
+ def execute(args)
858
+ params = {}
859
+ options = {}
860
+ target_type = nil
861
+ instance_ids = []
862
+ instances = []
863
+ instance_label = nil
864
+ server_ids = []
865
+ servers = []
866
+ server_label = nil
867
+ default_refresh_interval = 5
868
+ all_target_types = ['appliance', 'instance', 'instance-label', 'server', 'server-label']
869
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
870
+ opts.banner = subcommand_usage("[task] [options]")
871
+ opts.on('--context-type VALUE', String, "Context Type, #{ored_list(all_target_types)}") do |val|
872
+ val = val.downcase
873
+ val = 'appliance' if val == 'none'
874
+ if target_type && target_type != val
875
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
876
+ end
877
+ if !all_target_types.include?(val)
878
+ raise ::OptionParser::InvalidOption.new("'#{val}' is invalid. It must be one of the following: instance, instance-label, server, server-label or appliance")
879
+ end
880
+ target_type = val
881
+ end
882
+ opts.on('--target-type VALUE', String, "alias for context-type") do |val|
883
+ val = val.downcase
884
+ val = 'appliance' if val == 'none'
885
+ if target_type && target_type != val
886
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
887
+ end
888
+ if !all_target_types.include?(val)
889
+ raise ::OptionParser::InvalidOption.new("'#{val}' is invalid. It must be one of the following: instance, instance-label, server, server-label or appliance")
890
+ end
891
+ target_type = val
892
+ end
893
+ opts.add_hidden_option('--target-type')
894
+ opts.on('--instance INSTANCE', String, "Instance name or id to target for execution. This option can be passed more than once.") do |val|
895
+ if target_type && target_type != 'instance'
896
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
897
+ end
898
+ target_type = 'instance'
899
+ instance_ids << val
900
+ end
901
+ opts.on('--instances LIST', Array, "Instances, comma separated list of instance names or IDs.") do |list|
902
+ if target_type && target_type != 'instance'
903
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
904
+ end
905
+ target_type = 'instance'
906
+ instance_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
907
+ end
908
+ opts.on('--instance-label LABEL', String, "Instance Label") do |val|
909
+ if target_type && target_type != 'instance-label'
910
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
911
+ end
912
+ target_type = 'instance-label'
913
+ instance_label = val
914
+ end
915
+ opts.on('--server SERVER', String, "Server name or id to target for execution. This option can be passed more than once.") do |val|
916
+ if target_type && target_type != 'server'
917
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
918
+ end
919
+ target_type = 'server'
920
+ server_ids << val
921
+ end
922
+ opts.on('--servers LIST', Array, "Servers, comma separated list of host names or IDs.") do |list|
923
+ if target_type && target_type != 'server'
924
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
925
+ end
926
+ target_type = 'server'
927
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
928
+ end
929
+ opts.on('--server-label LABEL', String, "Server Label") do |val|
930
+ if target_type && target_type != 'server-label'
931
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
932
+ end
933
+ target_type = 'server-label'
934
+ server_label = val
935
+ end
936
+ opts.on('--host HOST', String, "alias for --server") do |val|
937
+ if target_type && target_type != 'server'
938
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
939
+ end
940
+ target_type = 'server'
941
+ server_ids << val
942
+ end
943
+ opts.add_hidden_option('--host')
944
+ opts.on('--hosts HOSTS', Array, "alias for --servers") do |list|
945
+ if target_type && target_type != 'server'
946
+ raise ::OptionParser::InvalidOption.new("The --hosts option cannot be combined with another context (#{target_type})")
947
+ end
948
+ target_type = 'server'
949
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
950
+ end
951
+ opts.add_hidden_option('--hosts')
952
+ opts.on('-a', '--appliance', "Execute on the appliance, the target is the appliance itself.") do
953
+ if target_type && target_type != 'appliance'
954
+ raise ::OptionParser::InvalidOption.new("The --appliance option cannot be combined with another context (#{target_type})")
955
+ end
956
+ target_type = 'appliance'
957
+ end
958
+ opts.on('--config [TEXT]', String, "Custom config") do |val|
959
+ params['customConfig'] = val.to_s
960
+ end
961
+ opts.on('--refresh [SECONDS]', String, "Refresh until execution is complete. Default interval is #{default_refresh_interval} seconds.") do |val|
962
+ options[:refresh_interval] = val.to_s.empty? ? default_refresh_interval : val.to_f
963
+ end
964
+ opts.on(nil, '--no-refresh', "Do not refresh" ) do
965
+ options[:no_refresh] = true
966
+ end
967
+ build_standard_post_options(opts, options)
968
+ end
969
+ optparse.parse!(args)
970
+ if args.count != 1
971
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
972
+ end
973
+ verify_args!(args:args, count:1, optparse:optparse)
974
+ task_name = args[0]
975
+ connect(options)
976
+ begin
977
+ task = find_task_by_name_or_id(task_name)
978
+ return 1 if task.nil?
979
+
980
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
981
+ payload = nil
982
+ if options[:payload]
983
+ payload = options[:payload]
984
+ payload.deep_merge!({'job' => passed_options}) unless passed_options.empty?
985
+ else
986
+ # prompt for target type and target
987
+ if target_type.nil?
988
+ # todo: Need api to fetch available Context Types for taskId/workflowId
989
+ available_target_types = get_available_contexts_for_task(task)
990
+ default_target_type = available_target_types.first ? available_target_types.first['name'] : nil
991
+ if !available_target_types.empty?
992
+ default_target_type = available_target_types.first ? available_target_types.first['name'] : nil
993
+ target_type = MtnCloud::Cli::OptionTypes.prompt([{'switch' => 'context-type', 'fieldName' => 'targetType', 'fieldLabel' => 'Context Type', 'type' => 'select', 'selectOptions' => available_target_types, 'defaultValue' => default_target_type, 'required' => true, 'description' => 'Context Type determines the type of target(s) for the execution'}], options[:options], @api_client)['targetType']
994
+ end
995
+ end
996
+ if target_type
997
+ params['targetType'] = target_type
998
+ end
999
+ if target_type == 'instance'
1000
+ if instance_ids.empty?
1001
+ instance_ids_value = MtnCloud::Cli::OptionTypes.prompt([{'switch' => 'instances', 'fieldName' => 'instances', 'fieldLabel' => 'Instance(s)', 'type' => 'text', 'required' => true, 'description' => 'Instances, comma separated list of instance names or IDs.'}], options[:options], @api_client)['instances']
1002
+ instance_ids = parse_array(instance_ids_value)
1003
+ end
1004
+ instance_ids.each do |instance_id|
1005
+ instance = find_instance_by_name_or_id(instance_id)
1006
+ return 1 if instance.nil?
1007
+ instances << instance
1008
+ end
1009
+ params['instances'] = instances.collect {|it| it['id'] }
1010
+ elsif target_type == 'instance-label'
1011
+ if instance_label.nil?
1012
+ instance_label = MtnCloud::Cli::OptionTypes.prompt([{'switch' => 'instance-label', 'fieldName' => 'instanceLabel', 'fieldLabel' => 'Instance Label', 'type' => 'text', 'required' => true, 'description' => 'Instance Label'}], options[:options], @api_client)['instanceLabel']
1013
+ end
1014
+ # params['config'] ||= {}
1015
+ # params['config']['instanceLabel'] = instance_label
1016
+ params['instanceLabel'] = instance_label
1017
+ elsif target_type == 'server'
1018
+ if server_ids.empty?
1019
+ server_ids_value = MtnCloud::Cli::OptionTypes.prompt([{'switch' => 'servers', 'fieldName' => 'servers', 'fieldLabel' => 'Server(s)', 'type' => 'text', 'required' => true, 'description' => 'Servers, comma separated list of server names or IDs.'}], options[:options], @api_client)['servers']
1020
+ server_ids = parse_array(server_ids_value)
1021
+ end
1022
+ server_ids.each do |server_id|
1023
+ server = find_server_by_name_or_id(server_id)
1024
+ return 1 if server.nil?
1025
+ servers << server
1026
+ end
1027
+ params['servers'] = servers.collect {|it| it['id'] }
1028
+ elsif target_type == 'server-label'
1029
+ if server_label.nil?
1030
+ server_label = MtnCloud::Cli::OptionTypes.prompt([{'switch' => 'server-label', 'fieldName' => 'serverLabel', 'fieldLabel' => 'Server Label', 'type' => 'text', 'required' => true, 'description' => 'Server Label'}], options[:options], @api_client)['serverLabel']
1031
+ end
1032
+ # params['config'] ||= {}
1033
+ # params['config']['serverLabel'] = server_label
1034
+ params['serverLabel'] = server_label
1035
+ end
1036
+ # todo: prompt to task optionTypes for customOptions
1037
+ if task['optionTypes']
1038
+
1039
+ end
1040
+ job_payload = {}
1041
+ job_payload.deep_merge!(params)
1042
+ job_payload.deep_merge!(passed_options) unless passed_options.empty?
1043
+ payload = {'job' => job_payload}
1044
+ end
1045
+
1046
+ @tasks_interface.setopts(options)
1047
+ if options[:dry_run]
1048
+ print_dry_run @tasks_interface.dry.run(task['id'], payload)
1049
+ return
1050
+ end
1051
+ json_response = @tasks_interface.run(task['id'], payload)
1052
+ render_response(json_response, options) do
1053
+ target_desc = nil
1054
+ if instances.size() > 0
1055
+ target_desc = (instances.size() == 1) ? "instance #{instances[0]['name']}" : "#{instances.size()} instances"
1056
+ elsif servers.size() > 0
1057
+ target_desc = (servers.size() == 1) ? "host #{servers[0]['name']}" : "#{servers.size()} hosts"
1058
+ end
1059
+ if target_desc
1060
+ print_green_success "Executing task #{task['name']} on #{target_desc}"
1061
+ else
1062
+ print_green_success "Executing task #{task['name']}"
1063
+ end
1064
+ if json_response["jobExecution"] && json_response["jobExecution"]["id"]
1065
+ job_execution_id = json_response["jobExecution"]["id"]
1066
+ if options[:no_refresh]
1067
+ get_args = [json_response["jobExecution"]["id"], "--details"] + (options[:remote] ? ["-r",options[:remote]] : [])
1068
+ MtnCloud::Logging::DarkPrinter.puts((['jobs', 'get-execution'] + get_args).join(' ')) if MtnCloud::Logging.debug?
1069
+ ::MtnCloud::Cli::JobsCommand.new.handle(['get-execution'] + get_args)
1070
+ else
1071
+ #MtnCloud::Cli::JobsCommand.new.handle(["get-execution", job_execution_id, "--refresh", options[:refresh_interval].to_s]+ (options[:remote] ? ["-r",options[:remote]] : []))
1072
+ job_execution_results = wait_for_job_execution(job_execution_id, options.merge({:details => true}))
1073
+ end
1074
+ end
1075
+ end
1076
+ return 0, nil
1077
+ end
1078
+ end
1079
+
1080
+ def list_task_types(args)
1081
+ params = {}
1082
+ options = {}
1083
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1084
+ opts.banner = subcommand_usage()
1085
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
1086
+ opts.footer = "List task types."
1087
+ end
1088
+ optparse.parse!(args)
1089
+ if args.count > 0
1090
+ raise_command_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
1091
+ end
1092
+ connect(options)
1093
+ begin
1094
+ params.merge!(parse_list_options(options))
1095
+ @tasks_interface.setopts(options)
1096
+ if options[:dry_run]
1097
+ print_dry_run @tasks_interface.dry.list_types(params)
1098
+ return
1099
+ end
1100
+ json_response = @tasks_interface.list_types(params)
1101
+
1102
+
1103
+ render_result = render_with_format(json_response, options, 'taskTypes')
1104
+ return 0 if render_result
1105
+
1106
+ title = "Task Types"
1107
+ subtitles = []
1108
+ subtitles += parse_list_subtitles(options)
1109
+ print_h1 title, subtitles
1110
+ task_types = json_response['taskTypes']
1111
+ if task_types.empty?
1112
+ print cyan,"No task types found.",reset,"\n"
1113
+ else
1114
+ print cyan
1115
+ rows = task_types.collect do |task_type|
1116
+ {name: task_type['name'], id: task_type['id'], code: task_type['code'], description: task_type['description']}
1117
+ end
1118
+ print as_pretty_table(rows, [:id, :name, :code], options)
1119
+ #print_results_pagination(json_response)
1120
+ print_results_pagination({size:task_types.size,total:task_types.size})
1121
+ end
1122
+ print reset,"\n"
1123
+ return 0
1124
+ rescue RestClient::Exception => e
1125
+ print_rest_exception(e, options)
1126
+ exit 1
1127
+ end
1128
+ end
1129
+
1130
+ def get_task_type(args)
1131
+ params = {}
1132
+ options = {}
1133
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1134
+ opts.banner = subcommand_usage("[type]")
1135
+ build_common_options(opts, options, [:query, :json, :yaml, :csv, :fields, :dry_run, :remote])
1136
+ opts.footer = "Get details about a task type.\n" +
1137
+ "[type] is required. This is the id or code or name of a task type."
1138
+ end
1139
+ optparse.parse!(args)
1140
+ if args.count != 1
1141
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
1142
+ end
1143
+ connect(options)
1144
+ begin
1145
+ @tasks_interface.setopts(options)
1146
+ if options[:dry_run]
1147
+ if args[0].to_s =~ /\A\d{1,}\Z/
1148
+ print_dry_run @tasks_interface.dry.get_type(args[0].to_i)
1149
+ else
1150
+ print_dry_run @tasks_interface.dry.list_types({name:args[0]})
1151
+ end
1152
+ return
1153
+ end
1154
+ # find_task_type_by_name actually finds by name or code id
1155
+ task_type = find_task_type_by_name(args[0])
1156
+ return 1 if task_type.nil?
1157
+ json_response = {'taskType' => task_type} # skip redundant request
1158
+ # json_response = @tasks_interface.get(task_type['id'])
1159
+
1160
+ render_result = render_with_format(json_response, options, 'taskType')
1161
+ return 0 if render_result
1162
+
1163
+ task_type = json_response['taskType']
1164
+
1165
+ title = "Task Type"
1166
+
1167
+ print_h1 "Task Type", [], options
1168
+
1169
+ print cyan
1170
+ description_cols = {
1171
+ "ID" => 'id',
1172
+ "Name" => 'name',
1173
+ "Code" => 'name',
1174
+ #"Description" => 'description',
1175
+ "Scriptable" => lambda {|it| format_boolean(it['scriptable']) },
1176
+ # lots more here
1177
+ # "enabled" => lambda {|it| format_boolean(it['enabled']) },
1178
+ # "hasResults" => lambda {|it| format_boolean(it['hasResults']) },
1179
+ # "allowRemoteKeyAuth" => lambda {|it| format_boolean(it['allowRemoteKeyAuth']) },
1180
+ # "allowExecuteLocal" => lambda {|it| format_boolean(it['allowExecuteLocal']) },
1181
+ # "allowExecuteRemote" => lambda {|it| format_boolean(it['allowExecuteRemote']) },
1182
+ # "allowExecuteResource" => lambda {|it| format_boolean(it['allowExecuteResource']) },
1183
+ # "allowLocalRepo" => lambda {|it| format_boolean(it['allowLocalRepo']) },
1184
+ # "allowRemoteKeyAuth" => lambda {|it| format_boolean(it['allowRemoteKeyAuth']) },
1185
+ }
1186
+ print_description_list(description_cols, task_type)
1187
+
1188
+ option_types = task_type['optionTypes'] || []
1189
+ option_types = option_types.sort {|x,y| x['displayOrder'] <=> y['displayOrder'] }
1190
+ if !option_types.empty?
1191
+ print_h2 "Config Option Types", [], options
1192
+ option_type_cols = {
1193
+ "Name" => lambda {|it| it['fieldContext'].to_s != '' ? "#{it['fieldContext']}.#{it['fieldName']}" : it['fieldName'] },
1194
+ "Label" => lambda {|it| it['fieldLabel'] },
1195
+ "Type" => lambda {|it| it['type'] },
1196
+ }
1197
+ print cyan
1198
+ print as_pretty_table(option_types, option_type_cols)
1199
+ end
1200
+
1201
+ print reset,"\n"
1202
+ return 0
1203
+ rescue RestClient::Exception => e
1204
+ print_rest_exception(e, options)
1205
+ return 1
1206
+ end
1207
+ end
1208
+
1209
+ private
1210
+
1211
+ def find_task_by_name_or_id(val)
1212
+ if val.to_s =~ /\A\d{1,}\Z/
1213
+ return find_task_by_id(val)
1214
+ else
1215
+ return find_task_by_name(val)
1216
+ end
1217
+ end
1218
+
1219
+ def find_task_by_id(id)
1220
+ begin
1221
+ json_response = @tasks_interface.get(id.to_i)
1222
+ return json_response['task']
1223
+ rescue RestClient::Exception => e
1224
+ if e.response && e.response.code == 404
1225
+ print_red_alert "Task not found by id #{id}"
1226
+ return nil
1227
+ else
1228
+ raise e
1229
+ end
1230
+ end
1231
+ end
1232
+
1233
+ def find_task_by_name(name)
1234
+ tasks = @tasks_interface.list({name: name.to_s})['tasks']
1235
+ if tasks.empty?
1236
+ print_red_alert "Task not found by name #{name}"
1237
+ return nil
1238
+ elsif tasks.size > 1
1239
+ print_red_alert "#{tasks.size} tasks by name #{name}"
1240
+ print_tasks_table(tasks, {color: red})
1241
+ print reset,"\n\n"
1242
+ return nil
1243
+ else
1244
+ return tasks[0]
1245
+ end
1246
+ end
1247
+
1248
+ def find_task_type_by_name(val)
1249
+ raise "find_task_type_by_name passed a bad name: #{val.inspect}" if val.to_s == ''
1250
+ @all_task_types ||= @tasks_interface.list_types({max:1000})['taskTypes']
1251
+
1252
+ if @all_task_types.nil? && !@all_task_types.empty?
1253
+ print_red_alert "No task types found"
1254
+ return nil
1255
+ end
1256
+ matching_task_types = @all_task_types.select { |it| val && (it['name'] == val || it['code'] == val || it['id'].to_s == val.to_s) }
1257
+ if matching_task_types.size == 1
1258
+ return matching_task_types[0]
1259
+ elsif matching_task_types.size == 0
1260
+ print_red_alert "Task Type not found by '#{val}'"
1261
+ else
1262
+ print_red_alert "#{matching_task_types.size} task types found by name #{name}"
1263
+ rows = matching_task_types.collect do |it|
1264
+ {id: it['id'], name: it['name'], code: it['code']}
1265
+ end
1266
+ print "\n"
1267
+ puts as_pretty_table(rows, [:name, :code], {color:red})
1268
+ return nil
1269
+ end
1270
+ end
1271
+
1272
+ def update_task_option_types(task_type)
1273
+ [
1274
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 0}
1275
+ ] + task_type['optionTypes']
1276
+ end
1277
+
1278
+ def print_tasks_table(tasks, opts={})
1279
+ columns = [
1280
+ {"ID" => lambda {|it| it['id'] } },
1281
+ {"NAME" => lambda {|it| it['name'] } },
1282
+ {"TYPE" => lambda {|it| it['taskType']['name'] ? it['taskType']['name'] : it['type'] } },
1283
+ {"LABELS" => lambda {|it| format_list(it['labels'], '', 3) rescue '' }},
1284
+ {"VISIBILITY" => lambda {|it| it['visibility'] } },
1285
+ {"CREATED" => lambda {|it| format_local_dt(it['dateCreated']) } }
1286
+
1287
+ # {"UPDATED" => lambda {|it| format_local_dt(it['lastUpdated']) } },
1288
+ ]
1289
+ if opts[:include_fields]
1290
+ columns = opts[:include_fields]
1291
+ end
1292
+ print as_pretty_table(tasks, columns, opts)
1293
+ end
1294
+
1295
+ def find_instance_by_name_or_id(val)
1296
+ if val.to_s =~ /\A\d{1,}\Z/
1297
+ return find_instance_by_id(val)
1298
+ else
1299
+ return find_instance_by_name(val)
1300
+ end
1301
+ end
1302
+
1303
+ def find_instance_by_id(id)
1304
+ begin
1305
+ json_response = @instances_interface.get(id.to_i)
1306
+ return json_response['instance']
1307
+ rescue RestClient::Exception => e
1308
+ if e.response && e.response.code == 404
1309
+ print_red_alert "Instance not found by id #{id}"
1310
+ return nil
1311
+ else
1312
+ raise e
1313
+ end
1314
+ end
1315
+ end
1316
+
1317
+ def find_instance_by_name(name)
1318
+ instances = @instances_interface.list({name: name.to_s})['instances']
1319
+ if instances.empty?
1320
+ print_red_alert "Instance not found by name #{name}"
1321
+ return nil
1322
+ elsif instances.size > 1
1323
+ print_red_alert "#{instances.size} instances found by name #{name}"
1324
+ as_pretty_table(instances, [:id, :name], {color: red})
1325
+ print_red_alert "Try using ID instead"
1326
+ print reset,"\n"
1327
+ return nil
1328
+ else
1329
+ return instances[0]
1330
+ end
1331
+ end
1332
+
1333
+ def find_server_by_name_or_id(val)
1334
+ if val.to_s =~ /\A\d{1,}\Z/
1335
+ return find_server_by_id(val)
1336
+ else
1337
+ return find_server_by_name(val)
1338
+ end
1339
+ end
1340
+
1341
+ def find_server_by_id(id)
1342
+ begin
1343
+ json_response = @servers_interface.get(id.to_i)
1344
+ return json_response['server']
1345
+ rescue RestClient::Exception => e
1346
+ if e.response && e.response.code == 404
1347
+ print_red_alert "Server not found by id #{id}"
1348
+ return nil
1349
+ else
1350
+ raise e
1351
+ end
1352
+ end
1353
+ end
1354
+
1355
+ def find_server_by_name(name)
1356
+ servers = @servers_interface.list({name: name.to_s})['servers']
1357
+ if servers.empty?
1358
+ print_red_alert "Host not found by name #{name}"
1359
+ return nil
1360
+ elsif servers.size > 1
1361
+ print_red_alert "#{servers.size} hosts found by name #{name}"
1362
+ as_pretty_table(servers, [:id, :name], {color: red})
1363
+ print_red_alert "Try using ID instead"
1364
+ print reset,"\n"
1365
+ return nil
1366
+ else
1367
+ return servers[0]
1368
+ end
1369
+ end
1370
+
1371
+ def process_special_task_option_typeaheads(option_types)
1372
+ # massage special task typeaheads options
1373
+ # this makes us all sad
1374
+ option_types.each do |option_type|
1375
+ if option_type['type'] == 'typeahead'
1376
+ if ['operationalWorkflowName','ifOperationalWorkflowName','elseOperationalWorkflowName','containerScript','containerTemplate'].include?(option_type['code'])
1377
+ option_type.deep_merge!({'config' => {'valueField' => 'name'}})
1378
+ end
1379
+ elsif option_type['type'] == 'hidden'
1380
+ if ['operationalWorkflowId','ifOperationalWorkflowId','elseOperationalWorkflowId','containerScriptId','containerTemplateId'].include?(option_type['code'])
1381
+ option_type['processValue'] = lambda {|val|
1382
+ if val.to_s.empty?
1383
+ selected_option = MtnCloud::Cli::OptionTypes.get_last_select()
1384
+ selected_option ? selected_option['value'] : nil
1385
+ end
1386
+ }
1387
+ end
1388
+ end
1389
+ end
1390
+ end
1391
+ end