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,1022 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::Workflows
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::JobsHelper
6
+
7
+ register_subcommands :list, :get, :add, :update, :remove, :execute
8
+ set_default_subcommand :list
9
+
10
+ # def initialize()
11
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
12
+ # end
13
+
14
+ def connect(opts)
15
+ @api_client = establish_remote_appliance_connection(opts)
16
+ @task_sets_interface = @api_client.task_sets
17
+ @tasks_interface = @api_client.tasks
18
+ @option_types_interface = @api_client.option_types
19
+ @instances_interface = @api_client.instances
20
+ @servers_interface = @api_client.servers
21
+ end
22
+
23
+
24
+ def handle(args)
25
+ handle_subcommand(args)
26
+ end
27
+
28
+
29
+ def list(args)
30
+ params = {}
31
+ options = {}
32
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
33
+ opts.banner = subcommand_usage("[search]")
34
+ opts.on("-t", "--type TYPE", "Type of workflow. i.e. provision or operation. Default is provision.") do |val|
35
+ workflow_type = val.to_s.downcase
36
+ if workflow_type.include?('provision')
37
+ workflow_type = 'provision'
38
+ elsif workflow_type.include?('operation')
39
+ workflow_type = 'operation'
40
+ end
41
+ params['type'] = workflow_type
42
+ end
43
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
44
+ add_query_parameter(params, 'labels', parse_labels(val))
45
+ end
46
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
47
+ add_query_parameter(params, 'allLabels', parse_labels(val))
48
+ end
49
+ build_standard_list_options(opts, options)
50
+ opts.footer = "List workflows."
51
+ end
52
+ optparse.parse!(args)
53
+ connect(options)
54
+ if args.count > 0
55
+ options[:phrase] = args.join(" ")
56
+ end
57
+ params.merge!(parse_list_options(options))
58
+ @task_sets_interface.setopts(options)
59
+ if options[:dry_run]
60
+ print_dry_run @task_sets_interface.dry.get(params)
61
+ return
62
+ end
63
+ json_response = @task_sets_interface.get(params)
64
+ task_sets = json_response['taskSets']
65
+ render_response(json_response, options, 'taskSets') do
66
+ title = "Workflows"
67
+ subtitles = []
68
+ subtitles += parse_list_subtitles(options)
69
+ if params['type']
70
+ subtitles << "Type: #{params['type']}"
71
+ end
72
+ print_h1 title, subtitles
73
+ if task_sets.empty?
74
+ print cyan,"No workflows found.",reset,"\n"
75
+ else
76
+ print cyan
77
+ print_workflows_table(task_sets)
78
+ print_results_pagination(json_response)
79
+ end
80
+ print reset,"\n"
81
+ end
82
+ if task_sets.empty?
83
+ return 1, "no workflows found"
84
+ else
85
+ return 0, nil
86
+ end
87
+ end
88
+
89
+ def add(args)
90
+ options = {}
91
+ params = {}
92
+ tasks = nil
93
+ task_arg_list = nil
94
+ option_types = nil
95
+ option_type_arg_list = nil
96
+ workflow_type = nil # 'provision'
97
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
98
+ opts.banner = subcommand_usage("[name] --tasks taskId:phase,taskId2:phase,taskId3:phase")
99
+ opts.on("--name NAME", String, "Name for workflow") do |val|
100
+ params['name'] = val
101
+ end
102
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
103
+ options[:options]['labels'] = parse_labels(val)
104
+ end
105
+ opts.on("--description DESCRIPTION", String, "Description of workflow") do |val|
106
+ params['description'] = val
107
+ end
108
+ opts.on("-t", "--type TYPE", "Type of workflow. i.e. provision or operation. Default is provision.") do |val|
109
+ workflow_type = val.to_s.downcase
110
+ if workflow_type.include?('provision')
111
+ workflow_type = 'provision'
112
+ elsif workflow_type.include?('operation')
113
+ workflow_type = 'operation'
114
+ end
115
+ params['type'] = workflow_type
116
+ end
117
+ opts.on("--operational", "--operational", "Create an operational workflow, alias for --type operational.") do |val|
118
+ workflow_type = 'operation'
119
+ params['type'] = workflow_type
120
+ end
121
+ opts.on("--tasks [x,y,z]", Array, "List of tasks to run in order, in the format <Task ID>:<Task Phase> Task Phase is optional. Default is the same workflow type: 'provision' or 'operation'.") do |list|
122
+ task_arg_list = []
123
+ list.each do |it|
124
+ task_id, task_phase = it.split(":")
125
+ task_arg_list << {task_id: task_id.to_s.strip, task_phase: task_phase.to_s.strip}
126
+ end if list
127
+ end
128
+ opts.on("--option-types x,y,z", Array, "List of option type name or IDs. For use with operational workflows to add configuration during execution.") do |list|
129
+ option_type_arg_list = []
130
+ list.each do |it|
131
+ option_type_arg_list << {option_type_id: it.to_s.strip}
132
+ end
133
+ end
134
+ opts.on('--platform [PLATFORM]', String, "Platform, eg. linux, windows or osx") do |val|
135
+ params['platform'] = val.to_s.empty? ? nil : val.to_s.downcase
136
+ end
137
+ opts.on('--allow-custom-config [on|off]', String, "Allow Custom Config") do |val|
138
+ params['allowCustomConfig'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
139
+ end
140
+ opts.on('--visibility VISIBILITY', String, "Visibility, eg. private or public") do |val|
141
+ params['visibility'] = val.to_s.downcase
142
+ end
143
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
144
+ end
145
+ optparse.parse!(args)
146
+ if args.count > 1
147
+ raise_command_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
148
+ end
149
+ connect(options)
150
+ begin
151
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
152
+ payload = nil
153
+ if options[:payload]
154
+ payload = options[:payload]
155
+ payload.deep_merge!({'taskSet' => passed_options}) unless passed_options.empty?
156
+ else
157
+ params.deep_merge!(passed_options) unless passed_options.empty?
158
+ if args[0]
159
+ params['name'] = args[0]
160
+ end
161
+ # if params['name'].to_s.empty?
162
+ # puts_error "#{MtnCloud::Terminal.angry_prompt}missing required option: [name]\n#{optparse}"
163
+ # return 1
164
+ # end
165
+ # if task_arg_list.nil?
166
+ # puts_error "#{MtnCloud::Terminal.angry_prompt}missing required option: --tasks\n#{optparse}"
167
+ # return 1
168
+ # end
169
+
170
+ # Name
171
+ if params['name'].nil?
172
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options[:options], @api_client)
173
+ params['name'] = v_prompt['name'] unless v_prompt['name'].to_s.empty?
174
+ end
175
+
176
+ # Description
177
+ if params['description'].nil?
178
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'description' => 'Description'}], options[:options], @api_client)
179
+ params['description'] = v_prompt['description'] unless v_prompt['description'].to_s.empty?
180
+ end
181
+
182
+ # Type
183
+ if workflow_type.nil?
184
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => get_available_workflow_types(), 'required' => true, 'description' => 'Workflow Type', 'defaultValue' => workflow_type || 'provision'}], options[:options], @api_client)
185
+ workflow_type = v_prompt['type'] unless v_prompt['type'].to_s.empty?
186
+ params['type'] = workflow_type
187
+ end
188
+
189
+ # Tasks
190
+ while tasks.nil? do
191
+ if task_arg_list.nil?
192
+ tasks_val = nil
193
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'tasks', 'fieldLabel' => 'Tasks', 'type' => 'text', 'required' => false, 'description' => "List of tasks to run in order, in the format <Task ID>:<Task Phase> Task Phase is optional. Default is the same workflow type: 'provision' or 'operation'."}], options[:options], @api_client)
194
+ tasks_val = v_prompt['tasks'] unless v_prompt['tasks'].to_s.empty?
195
+ if tasks_val
196
+ task_arg_list = []
197
+ tasks_val.split(",").each do |it|
198
+ task_id, task_phase = it.split(":")
199
+ task_arg_list << {task_id: task_id.to_s.strip, task_phase: task_phase.to_s.strip}
200
+ end
201
+ else
202
+ # empty array is allowed
203
+ tasks = []
204
+ end
205
+ end
206
+ if task_arg_list
207
+ tasks = []
208
+ task_arg_list.each do |task_arg|
209
+ found_task = find_task_by_name_or_id(task_arg[:task_id])
210
+ #return 1 if found_task.nil?
211
+ if found_task.nil?
212
+ task_arg_list = nil
213
+ tasks = nil
214
+ break
215
+ end
216
+ row = {'taskId' => found_task['id']}
217
+ if !task_arg[:task_phase].to_s.strip.empty?
218
+ row['taskPhase'] = task_arg[:task_phase]
219
+ elsif workflow_type == 'operation'
220
+ row['taskPhase'] = 'operation'
221
+ end
222
+ tasks << row
223
+ end
224
+ else
225
+ if options[:no_prompt]
226
+ # empty array is allowed
227
+ tasks = []
228
+ end
229
+ end
230
+ end
231
+
232
+ # Option Types
233
+ if workflow_type == 'operation'
234
+ while option_types.nil? do
235
+ if option_type_arg_list.nil?
236
+ option_types_val = nil
237
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'optionTypes', 'fieldLabel' => 'Option Types', 'type' => 'text', 'description' => "List of option type name or IDs. For use with operational workflows to add configuration during execution."}], options[:options], @api_client)
238
+ option_types_val = v_prompt['optionTypes'] unless v_prompt['optionTypes'].to_s.empty?
239
+ if option_types_val
240
+ option_type_arg_list = []
241
+ option_types_val.split(",").each do |it|
242
+ option_type_arg_list << {option_type_id: it.to_s.strip}
243
+ end
244
+ else
245
+ option_types = [] # not required, break out
246
+ end
247
+ end
248
+ if option_type_arg_list
249
+ option_types = []
250
+ option_type_arg_list.each do |option_type_arg|
251
+ found_option_type = find_option_type_by_name_or_id(option_type_arg[:option_type_id])
252
+ #return 1 if found_option_type.nil?
253
+ if found_option_type.nil?
254
+ option_type_arg_list = nil
255
+ option_types = nil
256
+ break
257
+ end
258
+ option_types << found_option_type['id']
259
+ end
260
+ end
261
+ end
262
+ end
263
+
264
+ payload = {'taskSet' => {}}
265
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
266
+ # params['type'] = workflow_type
267
+ payload['taskSet'].deep_merge!(params)
268
+ if tasks
269
+ payload['taskSet']['tasks'] = tasks
270
+ end
271
+ if option_types && option_types.size > 0
272
+ payload['taskSet']['optionTypes'] = option_types
273
+ end
274
+ end
275
+ @task_sets_interface.setopts(options)
276
+ if options[:dry_run]
277
+ print_dry_run @task_sets_interface.dry.create(payload)
278
+ return
279
+ end
280
+ json_response = @task_sets_interface.create(payload)
281
+ if options[:json]
282
+ print JSON.pretty_generate(json_response)
283
+ else
284
+ workflow = json_response['taskSet']
285
+ print_green_success "Workflow #{workflow['name']} created"
286
+ get([workflow['id']])
287
+ end
288
+ rescue RestClient::Exception => e
289
+ print_rest_exception(e, options)
290
+ exit 1
291
+ end
292
+ end
293
+
294
+ def get(args)
295
+ options = {}
296
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
297
+ opts.banner = subcommand_usage("[workflow]")
298
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
299
+ end
300
+ optparse.parse!(args)
301
+ if args.count < 1
302
+ puts optparse
303
+ return 1
304
+ end
305
+ connect(options)
306
+ id_list = parse_id_list(args)
307
+ return run_command_for_each_arg(id_list) do |arg|
308
+ _get(arg, options)
309
+ end
310
+ end
311
+
312
+ def _get(id, options)
313
+ workflow_name = id
314
+ begin
315
+ @task_sets_interface.setopts(options)
316
+ if options[:dry_run]
317
+ if workflow_name.to_s =~ /\A\d{1,}\Z/
318
+ print_dry_run @task_sets_interface.dry.get(workflow_name.to_i)
319
+ else
320
+ print_dry_run @task_sets_interface.dry.get({name: workflow_name})
321
+ end
322
+ return
323
+ end
324
+ workflow = find_workflow_by_name_or_id(workflow_name)
325
+ exit 1 if workflow.nil?
326
+ # refetch it..
327
+ json_response = {'taskSet' => workflow}
328
+ unless workflow_name.to_s =~ /\A\d{1,}\Z/
329
+ json_response = @task_sets_interface.get(workflow['id'])
330
+ end
331
+ workflow = json_response['taskSet']
332
+ if options[:json]
333
+ puts as_json(json_response, options, "taskSet")
334
+ return 0
335
+ elsif options[:yaml]
336
+ puts as_yaml(json_response, options, "taskSet")
337
+ return 0
338
+ elsif options[:csv]
339
+ puts records_as_csv([json_response['taskSet']], options)
340
+ return 0
341
+ else
342
+ # tasks = []
343
+ # (workflow['tasks'] || []).each do |task_name|
344
+ # tasks << find_task_by_name_or_id(task_name)['id']
345
+ # end
346
+ tasks = workflow['taskSetTasks'].sort { |x,y| x['taskOrder'].to_i <=> y['taskOrder'].to_i }
347
+ print_h1 "Workflow Details"
348
+
349
+ print cyan
350
+ description_cols = {
351
+ "ID" => 'id',
352
+ "Name" => 'name',
353
+ "Labels" => lambda {|it| format_list(it['labels'], '', 3) rescue '' },
354
+ "Description" => 'description',
355
+ "Type" => lambda {|workflow| format_workflow_type(workflow) },
356
+ "Platform" => lambda {|it| format_platform(it['platform']) },
357
+ "Allow Custom Config" => lambda {|it| format_boolean(it['allowCustomConfig']) },
358
+ "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
359
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
360
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
361
+ }
362
+ print_description_list(description_cols, workflow)
363
+
364
+ #task_names = tasks.collect {|it| it['name'] }
365
+ print_h2 "Workflow Tasks"
366
+ if tasks.empty?
367
+ print cyan,"No tasks in this workflow.",reset,"\n"
368
+ else
369
+ print cyan
370
+ # tasks.each_with_index do |taskSetTask, index|
371
+ # puts "#{(index+1).to_s.rjust(3, ' ')}. #{taskSetTask['task']['name']}"
372
+ # end
373
+ task_set_task_columns = [
374
+ #{"ID" => lambda {|it| it['id'] } },
375
+ {"TASK ID" => lambda {|it| it['task']['id'] } },
376
+ {"NAME" => lambda {|it| it['task']['name'] } },
377
+ {"TYPE" => lambda {|it| it['task']['taskType'] ? it['task']['taskType']['name'] : '' } },
378
+ {"PHASE" => lambda {|it| it['taskPhase'] } }, # not returned yet?
379
+ ]
380
+ print cyan
381
+ print as_pretty_table(tasks, task_set_task_columns)
382
+ end
383
+
384
+ workflow_option_types = workflow['optionTypes']
385
+
386
+ if workflow_option_types && workflow_option_types.size() > 0
387
+ print_h2 "Workflow Option Types"
388
+ columns = [
389
+ {"ID" => lambda {|it| it['id'] } },
390
+ {"NAME" => lambda {|it| it['name'] } },
391
+ {"TYPE" => lambda {|it| it['type'] } },
392
+ {"FIELD NAME" => lambda {|it| it['fieldName'] } },
393
+ {"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
394
+ {"DEFAULT" => lambda {|it| it['defaultValue'] } },
395
+ {"REQUIRED" => lambda {|it| format_boolean it['required'] } },
396
+ ]
397
+ print as_pretty_table(workflow_option_types, columns)
398
+ end
399
+ print reset
400
+ print "\n"
401
+ end
402
+ rescue RestClient::Exception => e
403
+ print_rest_exception(e, options)
404
+ exit 1
405
+ end
406
+ end
407
+
408
+ def update(args)
409
+ options = {}
410
+ params = {}
411
+ tasks = nil
412
+ task_arg_list = nil
413
+ option_types = nil
414
+ option_type_arg_list = nil
415
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
416
+ opts.banner = subcommand_usage("[name] --tasks taskId:phase,taskId2:phase,taskId3:phase")
417
+ opts.on("--name NAME", String, "New name for workflow") do |val|
418
+ params['name'] = val
419
+ end
420
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
421
+ options[:options]['labels'] = parse_labels(val)
422
+ end
423
+ opts.on("--description DESCRIPTION", String, "Description of workflow") do |val|
424
+ params['description'] = val
425
+ end
426
+ opts.on("--tasks [x,y,z]", Array, "List of tasks to run in order, in the format <Task ID>:<Task Phase> Task Phase is optional. Default is the same workflow type: 'provision' or 'operation'.") do |list|
427
+ task_arg_list = []
428
+ list.each do |it|
429
+ task_id, task_phase = it.split(":")
430
+ task_arg_list << {task_id: task_id.to_s.strip, task_phase: task_phase.to_s.strip}
431
+ end if list
432
+ end
433
+ opts.on("--option-types [x,y,z]", Array, "List of option type name or IDs. For use with operational workflows to add configuration during execution.") do |list|
434
+ option_type_arg_list = []
435
+ list.each do |it|
436
+ option_type_arg_list << {option_type_id: it.to_s.strip}
437
+ end if list
438
+ end
439
+ opts.on('--platform [PLATFORM]', String, "Platform, eg. linux, windows or osx") do |val|
440
+ params['platform'] = val.to_s.empty? ? nil : val.to_s.downcase
441
+ end
442
+ opts.on('--allow-custom-config [on|off]', String, "Allow Custom Config") do |val|
443
+ params['allowCustomConfig'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
444
+ end
445
+ opts.on('--visibility VISIBILITY', String, "Visibility, eg. private or public") do |val|
446
+ params['visibility'] = val.to_s.downcase
447
+ end
448
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
449
+ end
450
+ optparse.parse!(args)
451
+ if args.count != 1
452
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
453
+ end
454
+ workflow_name = args[0]
455
+ connect(options)
456
+ begin
457
+ workflow = find_workflow_by_name_or_id(workflow_name)
458
+ return 1 if workflow.nil?
459
+ payload = nil
460
+ if options[:payload]
461
+ payload = options[:payload]
462
+ else
463
+ if task_arg_list
464
+ tasks = []
465
+ task_arg_list.each do |task_arg|
466
+ found_task = find_task_by_name_or_id(task_arg[:task_id])
467
+ return 1 if found_task.nil?
468
+ row = {'taskId' => found_task['id']}
469
+ if !task_arg[:task_phase].to_s.strip.empty?
470
+ row['taskPhase'] = task_arg[:task_phase]
471
+ end
472
+ tasks << row
473
+ end
474
+ end
475
+ if option_type_arg_list
476
+ option_types = []
477
+ option_type_arg_list.each do |option_type_arg|
478
+ found_option_type = find_option_type_by_name_or_id(option_type_arg[:option_type_id])
479
+ return 1 if found_option_type.nil?
480
+ option_types << found_option_type['id']
481
+ end
482
+ end
483
+ payload = {'taskSet' => {}}
484
+ params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
485
+ payload['taskSet'].deep_merge!(params)
486
+ if tasks
487
+ payload['taskSet']['tasks'] = tasks
488
+ end
489
+ if option_types
490
+ payload['taskSet']['optionTypes'] = option_types
491
+ end
492
+ end
493
+ @task_sets_interface.setopts(options)
494
+ if options[:dry_run]
495
+ print_dry_run @task_sets_interface.dry.update(workflow['id'], payload)
496
+ return
497
+ end
498
+ json_response = @task_sets_interface.update(workflow['id'], payload)
499
+ if options[:json]
500
+ print JSON.pretty_generate(json_response)
501
+ elsif !options[:quiet]
502
+ print_green_success "Workflow #{json_response['taskSet']['name']} updated"
503
+ get([workflow['id']])
504
+ end
505
+ rescue RestClient::Exception => e
506
+ print_rest_exception(e, options)
507
+ exit 1
508
+ end
509
+ end
510
+
511
+ def remove(args)
512
+ options = {}
513
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
514
+ opts.banner = "Usage: #{prog_name} workflows remove [name]"
515
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
516
+ end
517
+ optparse.parse!(args)
518
+ if args.count < 1
519
+ puts optparse
520
+ exit 1
521
+ end
522
+ workflow_name = args[0]
523
+ connect(options)
524
+ begin
525
+ workflow = find_workflow_by_name_or_id(workflow_name)
526
+ exit 1 if workflow.nil?
527
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the workflow #{workflow['name']}?")
528
+ exit 1
529
+ end
530
+ @task_sets_interface.setopts(options)
531
+ if options[:dry_run]
532
+ print_dry_run @task_sets_interface.dry.destroy(workflow['id'])
533
+ return
534
+ end
535
+ json_response = @task_sets_interface.destroy(workflow['id'])
536
+ if options[:json]
537
+ print JSON.pretty_generate(json_response)
538
+ elsif !options[:quiet]
539
+ print_green_success "Workflow #{workflow['name']} removed"
540
+ end
541
+ rescue RestClient::Exception => e
542
+ print_rest_exception(e, options)
543
+ exit 1
544
+ end
545
+ end
546
+
547
+ def execute(args)
548
+ params = {}
549
+ options = {}
550
+ target_type = nil
551
+ instance_ids = []
552
+ instances = []
553
+ instance_label = nil
554
+ server_ids = []
555
+ servers = []
556
+ server_label = nil
557
+ default_refresh_interval = 5
558
+ all_target_types = ['appliance', 'instance', 'instance-label', 'server', 'server-label']
559
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
560
+ opts.banner = subcommand_usage("[workflow] [options]")
561
+ opts.on('--context-type VALUE', String, "Context Type, #{ored_list(all_target_types)}") do |val|
562
+ val = val.downcase
563
+ val = 'appliance' if val == 'none'
564
+ if target_type && target_type != val
565
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
566
+ end
567
+ if !all_target_types.include?(val)
568
+ raise ::OptionParser::InvalidOption.new("'#{val}' is invalid. It must be one of the following: instance, instance-label, server, server-label or appliance")
569
+ end
570
+ target_type = val
571
+ end
572
+ opts.on('--target-type VALUE', String, "alias for context-type") do |val|
573
+ val = val.downcase
574
+ val = 'appliance' if val == 'none'
575
+ if target_type && target_type != val
576
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
577
+ end
578
+ if !all_target_types.include?(val)
579
+ raise ::OptionParser::InvalidOption.new("'#{val}' is invalid. It must be one of the following: instance, instance-label, server, server-label or appliance")
580
+ end
581
+ target_type = val
582
+ end
583
+ opts.add_hidden_option('--target-type')
584
+ opts.on('--instance INSTANCE', String, "Instance name or id to target for execution. This option can be passed more than once.") do |val|
585
+ if target_type && target_type != 'instance'
586
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
587
+ end
588
+ target_type = 'instance'
589
+ instance_ids << val
590
+ end
591
+ opts.on('--instances LIST', Array, "Instances, comma separated list of instance names or IDs.") do |list|
592
+ if target_type && target_type != 'instance'
593
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
594
+ end
595
+ target_type = 'instance'
596
+ instance_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
597
+ end
598
+ opts.on('--instance-label LABEL', String, "Instance Label") do |val|
599
+ if target_type && target_type != 'instance-label'
600
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
601
+ end
602
+ target_type = 'instance-label'
603
+ instance_label = val
604
+ end
605
+ opts.on('--server SERVER', String, "Server name or id to target for execution. This option can be passed more than once.") do |val|
606
+ if target_type && target_type != 'server'
607
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
608
+ end
609
+ target_type = 'server'
610
+ server_ids << val
611
+ end
612
+ opts.on('--servers LIST', Array, "Servers, comma separated list of host names or IDs.") do |list|
613
+ if target_type && target_type != 'server'
614
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
615
+ end
616
+ target_type = 'server'
617
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
618
+ end
619
+ opts.on('--server-label LABEL', String, "Server Label") do |val|
620
+ if target_type && target_type != 'server-label'
621
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
622
+ end
623
+ target_type = 'server-label'
624
+ server_label = val
625
+ end
626
+ opts.on('--host HOST', String, "alias for --server") do |val|
627
+ if target_type && target_type != 'server'
628
+ raise ::OptionParser::InvalidOption.new("cannot be combined with another context (#{target_type})")
629
+ end
630
+ target_type = 'server'
631
+ server_ids << val
632
+ end
633
+ opts.add_hidden_option('--host')
634
+ opts.on('--hosts HOSTS', Array, "alias for --servers") do |list|
635
+ if target_type && target_type != 'server'
636
+ raise ::OptionParser::InvalidOption.new("The --hosts option cannot be combined with another context (#{target_type})")
637
+ end
638
+ target_type = 'server'
639
+ server_ids = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
640
+ end
641
+ opts.add_hidden_option('--hosts')
642
+ opts.on('-a', '--appliance', "Execute on the appliance, the target is the appliance itself.") do
643
+ if target_type && target_type != 'appliance'
644
+ raise ::OptionParser::InvalidOption.new("The --appliance option cannot be combined with another context (#{target_type})")
645
+ end
646
+ target_type = 'appliance'
647
+ end
648
+ opts.on('--config [TEXT]', String, "Custom config") do |val|
649
+ params['customConfig'] = val.to_s
650
+ end
651
+ opts.on('--refresh [SECONDS]', String, "Refresh until execution is complete. Default interval is #{default_refresh_interval} seconds.") do |val|
652
+ options[:refresh_interval] = val.to_s.empty? ? default_refresh_interval : val.to_f
653
+ end
654
+ opts.on(nil, '--no-refresh', "Do not refresh" ) do
655
+ options[:no_refresh] = true
656
+ end
657
+ build_standard_post_options(opts, options)
658
+ end
659
+ optparse.parse!(args)
660
+ if args.count != 1
661
+ raise_command_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
662
+ end
663
+ workflow_name = args[0]
664
+ connect(options)
665
+
666
+ workflow = find_workflow_by_name_or_id(workflow_name)
667
+ return 1 if workflow.nil?
668
+
669
+ passed_options = options[:options] ? options[:options].reject {|k,v| k.is_a?(Symbol) } : {}
670
+ payload = nil
671
+ if options[:payload]
672
+ payload = options[:payload]
673
+ payload.deep_merge!({'job' => passed_options}) unless passed_options.empty?
674
+ else
675
+ # prompt for target type and target
676
+ if target_type.nil?
677
+ # todo: Need api to fetch available Context Types for taskId/workflowId
678
+ available_target_types = get_available_contexts_for_workflow(workflow)
679
+ default_target_type = available_target_types.first ? available_target_types.first['name'] : nil
680
+ if !available_target_types.empty?
681
+ default_target_type = available_target_types.first ? available_target_types.first['name'] : nil
682
+ 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']
683
+ end
684
+ end
685
+ if target_type
686
+ params['targetType'] = target_type
687
+ end
688
+ if target_type == 'instance'
689
+ if instance_ids.empty?
690
+ 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']
691
+ instance_ids = parse_array(instance_ids_value)
692
+ end
693
+ instance_ids.each do |instance_id|
694
+ instance = find_instance_by_name_or_id(instance_id)
695
+ return 1 if instance.nil?
696
+ instances << instance
697
+ end
698
+ params['instances'] = instances.collect {|it| it['id'] }
699
+ elsif target_type == 'instance-label'
700
+ if instance_label.nil?
701
+ 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']
702
+ end
703
+ # params['config'] ||= {}
704
+ # params['config']['instanceLabel'] = instance_label
705
+ params['instanceLabel'] = instance_label
706
+ elsif target_type == 'server'
707
+ if server_ids.empty?
708
+ 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']
709
+ server_ids = parse_array(server_ids_value)
710
+ end
711
+ server_ids.each do |server_id|
712
+ server = find_server_by_name_or_id(server_id)
713
+ return 1 if server.nil?
714
+ servers << server
715
+ end
716
+ params['servers'] = servers.collect {|it| it['id'] }
717
+ elsif target_type == 'server-label'
718
+ if server_label.nil?
719
+ 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']
720
+ end
721
+ # params['config'] ||= {}
722
+ # params['config']['serverLabel'] = server_label
723
+ params['serverLabel'] = server_label
724
+ end
725
+
726
+ # prompt to workflow optionTypes for customOptions
727
+ custom_options = nil
728
+ if workflow['optionTypes'] && workflow['optionTypes'].size() > 0
729
+ # Clone to avoid mutating workflow data, and clear fieldContext so that
730
+ # accumulated results remain flat (not nested under 'customOptions') when
731
+ # passed as params to dependent option source API calls. If fieldContext
732
+ # were left as 'customOptions', option_params would be sent to the options
733
+ # API as customOptions[zoneId]=2 instead of the expected flat zoneId=2,
734
+ # causing dependent option lists (e.g. Resource Pools) to return empty.
735
+ custom_option_types = workflow['optionTypes'].collect {|it|
736
+ ot = it.clone
737
+ ot.delete('fieldContext')
738
+ ot
739
+ }
740
+ # Support both -O fieldName=value AND the legacy -O customOptions.fieldName=value syntax.
741
+ prompt_options = (options[:options] || {}).dup
742
+ if prompt_options['customOptions'].is_a?(Hash)
743
+ prompt_options.merge!(prompt_options.delete('customOptions'))
744
+ end
745
+ prompt_results = MtnCloud::Cli::OptionTypes.prompt(custom_option_types, prompt_options, @api_client, {})
746
+ custom_options = {'customOptions' => prompt_results} unless prompt_results.empty?
747
+ end
748
+ job_payload = {}
749
+ job_payload.deep_merge!(params)
750
+ passed_options.delete('customOptions')
751
+ job_payload.deep_merge!(passed_options) unless passed_options.empty?
752
+ if custom_options
753
+ # job_payload.deep_merge!('config' => custom_options)
754
+ job_payload.deep_merge!(custom_options)
755
+ end
756
+ payload = {'job' => job_payload}
757
+ end
758
+
759
+ @task_sets_interface.setopts(options)
760
+ if options[:dry_run]
761
+ print_dry_run @task_sets_interface.dry.run(workflow['id'], payload)
762
+ return 0
763
+ end
764
+ json_response = @task_sets_interface.run(workflow['id'], payload)
765
+
766
+ render_response(json_response, options) do
767
+ target_desc = nil
768
+ if instances.size() > 0
769
+ target_desc = (instances.size() == 1) ? "instance #{instances[0]['name']}" : "#{instances.size()} instances"
770
+ elsif servers.size() > 0
771
+ target_desc = (servers.size() == 1) ? "host #{servers[0]['name']}" : "#{servers.size()} hosts"
772
+ end
773
+ if target_desc
774
+ print_green_success "Executing workflow #{workflow['name']} on #{target_desc}"
775
+ else
776
+ print_green_success "Executing workflow #{workflow['name']}"
777
+ end
778
+ if json_response["jobExecution"] && json_response["jobExecution"]["id"]
779
+ job_execution_id = json_response["jobExecution"]["id"]
780
+ if options[:no_refresh]
781
+ get_args = [json_response["jobExecution"]["id"], "--details"] + (options[:remote] ? ["-r",options[:remote]] : [])
782
+ MtnCloud::Logging::DarkPrinter.puts((['jobs', 'get-execution'] + get_args).join(' ')) if MtnCloud::Logging.debug?
783
+ ::MtnCloud::Cli::JobsCommand.new.handle(['get-execution'] + get_args)
784
+ else
785
+ #MtnCloud::Cli::JobsCommand.new.handle(["get-execution", job_execution_id, "--refresh", options[:refresh_interval].to_s]+ (options[:remote] ? ["-r",options[:remote]] : []))
786
+ job_execution_results = wait_for_job_execution(job_execution_id, options.merge({:details => true}))
787
+ end
788
+ end
789
+ end
790
+ return 0, nil
791
+ end
792
+
793
+ private
794
+
795
+ def get_available_workflow_types
796
+ [{"name" => "Provisioning", "value" => "provision", "isDefault" => true}, {"name" => "Operational", "value" => "operation"}]
797
+ end
798
+
799
+ def find_workflow_by_name_or_id(val)
800
+ if val.to_s =~ /\A\d{1,}\Z/
801
+ return find_workflow_by_id(val)
802
+ else
803
+ return find_workflow_by_name(val)
804
+ end
805
+ end
806
+
807
+ def find_workflow_by_id(id)
808
+ begin
809
+ json_response = @task_sets_interface.get(id.to_i)
810
+ return json_response['taskSet']
811
+ rescue RestClient::Exception => e
812
+ if e.response && e.response.code == 404
813
+ print_red_alert "Workflow not found by id #{id}"
814
+ return nil
815
+ else
816
+ raise e
817
+ end
818
+ end
819
+ end
820
+
821
+ def find_workflow_by_name(name)
822
+ workflows = @task_sets_interface.list({name: name.to_s})['taskSets']
823
+ if workflows.empty?
824
+ print_red_alert "Workflow not found by name #{name}"
825
+ return nil
826
+ elsif workflows.size > 1
827
+ print_red_alert "#{workflows.size} workflows by name #{name}"
828
+ print_workflows_table(workflows, {color: red})
829
+ print reset,"\n\n"
830
+ return nil
831
+ else
832
+ return workflows[0]
833
+ end
834
+ end
835
+
836
+ def find_task_by_name_or_id(val)
837
+ if val.to_s =~ /\A\d{1,}\Z/
838
+ return find_task_by_id(val)
839
+ else
840
+ return find_task_by_name(val)
841
+ end
842
+ end
843
+
844
+ def find_task_by_id(id)
845
+ begin
846
+ json_response = @tasks_interface.get(id.to_i)
847
+ return json_response['task']
848
+ rescue RestClient::Exception => e
849
+ if e.response && e.response.code == 404
850
+ print_red_alert "Task not found by id #{id}"
851
+ return nil
852
+ else
853
+ raise e
854
+ end
855
+ end
856
+ end
857
+
858
+ def find_task_by_name(name)
859
+ tasks = @tasks_interface.list({name: name.to_s})['tasks']
860
+ if tasks.empty?
861
+ print_red_alert "Task not found by name #{name}"
862
+ return nil
863
+ elsif tasks.size > 1
864
+ print_red_alert "#{tasks.size} tasks by name #{name}"
865
+ print_tasks_table(tasks, {color: red})
866
+ print reset,"\n\n"
867
+ return nil
868
+ else
869
+ return tasks[0]
870
+ end
871
+ end
872
+
873
+ def print_workflows_table(workflows, opts={})
874
+ columns = [
875
+ {"ID" => lambda {|workflow| workflow['id'] } },
876
+ {"NAME" => lambda {|workflow| workflow['name'] } },
877
+ {"LABELS" => lambda {|it| format_list(it['labels'], '', 3) rescue '' }},
878
+ {"DESCRIPTION" => lambda {|workflow| workflow['description'] } },
879
+ {"TYPE" => lambda {|workflow| format_workflow_type(workflow) } },
880
+ {"TASKS" => lambda {|workflow|
881
+ # (workflow['taskSetTasks'] || []).sort { |x,y| x['taskOrder'].to_i <=> y['taskOrder'].to_i }.collect { |taskSetTask|
882
+ # taskSetTask['task']['name']
883
+ # }.join(', ')
884
+ (workflow['taskSetTasks'] || []).size.to_s
885
+ } },
886
+ {"CREATED" => lambda {|workflow| format_local_dt(workflow['dateCreated']) } },
887
+ ]
888
+ if opts[:include_fields]
889
+ columns = opts[:include_fields]
890
+ end
891
+ print as_pretty_table(workflows, columns, opts)
892
+ end
893
+
894
+ def format_workflow_type(workflow)
895
+ if workflow['type'] == 'provision'
896
+ "Provisioning"
897
+ elsif workflow['type'] == 'operation'
898
+ "Operational"
899
+ else
900
+ workflow['type']
901
+ end
902
+ end
903
+
904
+ def format_platform(platform)
905
+ if platform.nil?
906
+ "All"
907
+ elsif platform == 'osx'
908
+ "OSX"
909
+ else
910
+ platform.to_s.capitalize
911
+ end
912
+ end
913
+
914
+ def find_option_type_by_name_or_id(val)
915
+ if val.to_s =~ /\A\d{1,}\Z/
916
+ return find_option_type_by_id(val)
917
+ else
918
+ return find_option_type_by_name(val)
919
+ end
920
+ end
921
+
922
+ def find_option_type_by_id(id)
923
+ begin
924
+ json_response = @option_types_interface.get(id.to_i)
925
+ return json_response['optionType']
926
+ rescue RestClient::Exception => e
927
+ if e.response && e.response.code == 404
928
+ print_red_alert "Option Type not found by id #{id}"
929
+ return nil
930
+ else
931
+ raise e
932
+ end
933
+ end
934
+ end
935
+
936
+ def find_option_type_by_name(name)
937
+ json_results = @option_types_interface.list({name: name.to_s})
938
+ if json_results['optionTypes'].empty?
939
+ print_red_alert "Option Type not found by name #{name}"
940
+ return nil
941
+ end
942
+ option_type = json_results['optionTypes'][0]
943
+ return option_type
944
+ end
945
+
946
+ def find_instance_by_name_or_id(val)
947
+ if val.to_s =~ /\A\d{1,}\Z/
948
+ return find_instance_by_id(val)
949
+ else
950
+ return find_instance_by_name(val)
951
+ end
952
+ end
953
+
954
+ def find_instance_by_id(id)
955
+ begin
956
+ json_response = @instances_interface.get(id.to_i)
957
+ return json_response['instance']
958
+ rescue RestClient::Exception => e
959
+ if e.response && e.response.code == 404
960
+ print_red_alert "Instance not found by id #{id}"
961
+ return nil
962
+ else
963
+ raise e
964
+ end
965
+ end
966
+ end
967
+
968
+ def find_instance_by_name(name)
969
+ instances = @instances_interface.list({name: name.to_s})['instances']
970
+ if instances.empty?
971
+ print_red_alert "Instance not found by name #{name}"
972
+ return nil
973
+ elsif instances.size > 1
974
+ print_red_alert "#{instances.size} instances found by name #{name}"
975
+ as_pretty_table(instances, [:id, :name], {color: red})
976
+ print_red_alert "Try using ID instead"
977
+ print reset,"\n"
978
+ return nil
979
+ else
980
+ return instances[0]
981
+ end
982
+ end
983
+
984
+ def find_server_by_name_or_id(val)
985
+ if val.to_s =~ /\A\d{1,}\Z/
986
+ return find_server_by_id(val)
987
+ else
988
+ return find_server_by_name(val)
989
+ end
990
+ end
991
+
992
+ def find_server_by_id(id)
993
+ begin
994
+ json_response = @servers_interface.get(id.to_i)
995
+ return json_response['server']
996
+ rescue RestClient::Exception => e
997
+ if e.response && e.response.code == 404
998
+ print_red_alert "Server not found by id #{id}"
999
+ return nil
1000
+ else
1001
+ raise e
1002
+ end
1003
+ end
1004
+ end
1005
+
1006
+ def find_server_by_name(name)
1007
+ servers = @servers_interface.list({name: name.to_s})['servers']
1008
+ if servers.empty?
1009
+ print_red_alert "Host not found by name #{name}"
1010
+ return nil
1011
+ elsif servers.size > 1
1012
+ print_red_alert "#{servers.size} hosts found by name #{name}"
1013
+ as_pretty_table(servers, [:id, :name], {color: red})
1014
+ print_red_alert "Try using ID instead"
1015
+ print reset,"\n"
1016
+ return nil
1017
+ else
1018
+ return servers[0]
1019
+ end
1020
+ end
1021
+
1022
+ end