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,1412 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::IntegrationsCommand
4
+ include MtnCloud::Cli::CliCommand
5
+
6
+ set_command_name :'integrations'
7
+ set_command_description "Integrations: View and manage integrations"
8
+
9
+ register_subcommands :list, :get, :add, :update, :remove, :refresh
10
+ register_subcommands :list_objects, :get_object, :add_object, :remove_object
11
+ register_subcommands :list_inventory, :get_inventory, :update_inventory
12
+ register_subcommands :list_types, :get_type
13
+
14
+ def connect(opts)
15
+ @api_client = establish_remote_appliance_connection(opts)
16
+ @integrations_interface = @api_client.integrations
17
+ @integration_types_interface = @api_client.integration_types
18
+ end
19
+
20
+ def handle(args)
21
+ handle_subcommand(args)
22
+ end
23
+
24
+ def list(args)
25
+ options = {}
26
+ params = {}
27
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
28
+ opts.banner = subcommand_usage("[search]")
29
+ opts.on('-t', '--type CODE', "Filter by type code(s), see `list-types` for available type codes") do |val|
30
+ params['type'] = val
31
+ end
32
+ opts.on('--url URL', String, "Filter by url") do |val|
33
+ params['url'] = val
34
+ end
35
+ build_standard_list_options(opts, options)
36
+ opts.footer = "List integrations."
37
+ end
38
+ optparse.parse!(args)
39
+ # verify_args!(args:args, optparse:optparse, count:0)
40
+ if args.count > 0
41
+ options[:phrase] = args.join(" ")
42
+ end
43
+ connect(options)
44
+ params.merge!(parse_list_options(options))
45
+ @integrations_interface.setopts(options)
46
+ if options[:dry_run]
47
+ print_dry_run @integrations_interface.dry.list(params)
48
+ return
49
+ end
50
+ json_response = @integrations_interface.list(params)
51
+ render_response(json_response, options, integration_list_key) do
52
+ integrations = json_response[integration_list_key]
53
+ print_h1 "Integrations", parse_list_subtitles(options), options
54
+ if integrations.empty?
55
+ print cyan,"No integrations found.",reset,"\n"
56
+ else
57
+ list_columns = {
58
+ "ID" => 'id',
59
+ "Name" => 'name',
60
+ "Type" => lambda {|it| format_integration_type(it) },
61
+ "URL" => lambda {|it| it['url'] },
62
+ "Username" => lambda {|it| it['username'] },
63
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
64
+ "Status Date" => lambda {|it| format_local_dt(it['statusDate']) },
65
+ "Status" => lambda {|it| format_integration_status(it) },
66
+ # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
67
+ # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
68
+ }.upcase_keys!
69
+ print as_pretty_table(integrations, list_columns, options)
70
+ print_results_pagination(json_response)
71
+ end
72
+ print reset,"\n"
73
+ end
74
+ return 0, nil
75
+ end
76
+
77
+ def get(args)
78
+ params = {}
79
+ options = {}
80
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
81
+ opts.banner = subcommand_usage("[integration]")
82
+ opts.on('--objects', 'Display exposed objects for the integration.') do
83
+ options[:show_objects] = true
84
+ end
85
+ build_standard_get_options(opts, options)
86
+ opts.footer = <<-EOT
87
+ Get details about a specific integration.
88
+ [integration] is required. This is the name or id of an integration.
89
+ EOT
90
+ end
91
+ optparse.parse!(args)
92
+ verify_args!(args:args, optparse:optparse, min:1)
93
+ connect(options)
94
+ params.merge!(parse_query_options(options))
95
+ id_list = parse_id_list(args)
96
+ return run_command_for_each_arg(id_list) do |arg|
97
+ _get(arg, params, options)
98
+ end
99
+ end
100
+
101
+ def _get(id, params, options)
102
+ integration = nil
103
+ if id.to_s !~ /\A\d{1,}\Z/
104
+ integration = find_integration_by_name_or_id(id)
105
+ return 1, "integration not found for #{id}" if integration.nil?
106
+ id = integration['id']
107
+ end
108
+ if options[:show_objects]
109
+ params['objects'] = true
110
+ end
111
+ @integrations_interface.setopts(options)
112
+ if options[:dry_run]
113
+ print_dry_run @integrations_interface.dry.get(id, params)
114
+ return
115
+ end
116
+ json_response = @integrations_interface.get(id, params)
117
+ integration = json_response[integration_object_key]
118
+ render_response(json_response, options, integration_object_key) do
119
+ print_h1 "Integration Details", [], options
120
+ print cyan
121
+ show_columns = {
122
+ "ID" => 'id',
123
+ "Name" => 'name',
124
+ "Type" => lambda {|it| format_integration_type(it) },
125
+ "URL" => lambda {|it| it['url'] },
126
+ "Host" => lambda {|it| it['host'] },
127
+ "Port" => lambda {|it| it['port'] },
128
+ "Username" => lambda {|it| it['username'] },
129
+ "Password" => lambda {|it| it['password'] },
130
+ "Token" => lambda {|it| it['token'] },
131
+ "Service Key" => lambda {|it| it['serviceKey'] ? it['serviceKey']['name'] : nil },
132
+ "Auth Key" => lambda {|it| it['authKey'] ? it['authKey']['name'] : nil },
133
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
134
+ "Status Date" => lambda {|it| format_local_dt(it['statusDate']) },
135
+ "Status" => lambda {|it| format_integration_status(it) },
136
+ # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
137
+ # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
138
+ }
139
+ show_columns.delete("URL") if integration['url'].nil?
140
+ show_columns.delete("Host") if integration['host'].nil?
141
+ show_columns.delete("Port") if integration['port'].nil?
142
+ show_columns.delete("Password") if integration['password'].nil?
143
+ show_columns.delete("Token") if integration['token'].nil?
144
+ show_columns.delete("Service Key") if integration['serviceKey'].nil?
145
+ show_columns.delete("Auth Key") if integration['authKey'].nil?
146
+ print_description_list(show_columns, integration, options)
147
+
148
+ if options[:show_objects]
149
+ # they are loaded above with ?objects=true
150
+ integration_objects = integration['objects']
151
+ if integration_objects.nil?
152
+ objects_json_response = @integrations_interface.list_objects(integration['id'], {})
153
+ integration_objects = objects_json_response[integration_object_list_key]
154
+ end
155
+ cloud_objects = integration_objects.select {|it| it['refType'] == "ComputeZone" }
156
+ library_objects = integration_objects.select {|it| it['refType'] == "InstanceTypeLayout" || it['refType'] == "InstanceType" }
157
+ blueprint_objects = integration_objects.select {|it| it['refType'] == "AppTemplate" }
158
+ catalog_objects = integration_objects.select {|it| it['refType'] == "CatalogItemType" }
159
+ if integration_objects.empty?
160
+ print reset,"\n"
161
+ print cyan,"No objects found.",reset,"\n"
162
+ else
163
+ # Exposed Clouds
164
+ if !cloud_objects.empty?
165
+ print_h2 "Exposed Clouds", [], options
166
+ list_columns = {
167
+ # "ID" => 'id',
168
+ "Name" => 'name',
169
+ # "Category" => 'category',
170
+ # "Ref Type" => 'refType',
171
+ # "Cloud ID" => 'refId',
172
+ "Group" => lambda {|it| it['group']['name'] rescue nil },
173
+ }.upcase_keys!
174
+ print as_pretty_table(cloud_objects, list_columns, options)
175
+ end
176
+
177
+ # Exposed Libraries
178
+ if !library_objects.empty?
179
+ # print_h2 "Exposed Libraries", [], options
180
+ print_h2 "Exposed Layouts", [], options
181
+ list_columns = {
182
+ # "ID" => 'id',
183
+ "Name" => 'name',
184
+ "Version" => lambda {|it| it['layout']['instanceVersion'] rescue nil },
185
+ "Instance Type" => lambda {|it| it['layout']['instanceType']['name'] rescue nil },
186
+ "Provision Type" => lambda {|it| it['layout']['provisionType']['name'] rescue nil },
187
+ }.upcase_keys!
188
+ print as_pretty_table(library_objects, list_columns, options)
189
+ end
190
+
191
+ # Exposed Blueprints
192
+ if !blueprint_objects.empty?
193
+ print_h2 "Exposed Blueprints", [], options
194
+ list_columns = {
195
+ # "ID" => 'id',
196
+ "Name" => 'name',
197
+ # "Type" => lambda {|it| it['blueprint']['type'] rescue nil },
198
+ "Blueprint" => lambda {|it| it['blueprint']['name'] rescue nil },
199
+ "Group" => lambda {|it| it['group']['name'] rescue nil },
200
+ }.upcase_keys!
201
+ print as_pretty_table(blueprint_objects, list_columns, options)
202
+ end
203
+
204
+ # Exposed Catalog Items
205
+ if !catalog_objects.empty?
206
+ print_h2 "Exposed Catalog Items", [], options
207
+ list_columns = {
208
+ # "ID" => 'id',
209
+ "Name" => 'name',
210
+ }.upcase_keys!
211
+ print as_pretty_table(catalog_objects, list_columns, options)
212
+ end
213
+ end
214
+ end
215
+ print reset,"\n"
216
+ end
217
+ return 0, nil
218
+ end
219
+
220
+ def add(args)
221
+ options = {}
222
+ params = {}
223
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
224
+ opts.banner = subcommand_usage("[name] -t CODE [options]")
225
+ # opts.on('-t', '--type CODE', "Integration Type code, see `#{command_name} list-types` for available type codes") do |val|
226
+ # options[:options]['type'] = val
227
+ # end
228
+ build_option_type_options(opts, options, add_integration_option_types)
229
+ build_option_type_options(opts, options, add_integration_advanced_option_types)
230
+ build_standard_add_options(opts, options)
231
+ opts.footer = <<-EOT
232
+ Create a new integration.
233
+ [name] is required. This is the name of the new integration
234
+ Configuration options vary by integration type.
235
+ EOT
236
+ end
237
+ optparse.parse!(args)
238
+ verify_args!(args:args, optparse:optparse, min:0, max:1)
239
+ options[:options]['name'] = args[0] if args[0]
240
+ connect(options)
241
+ payload = {}
242
+ if options[:payload]
243
+ payload = options[:payload]
244
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
245
+ else
246
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
247
+ # Type prompt first
248
+ #params['type'] = MtnCloud::Cli::OptionTypes.no_prompt([{'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Instance', 'value' => 'instance'}, {'name' => 'Blueprint', 'value' => 'blueprint'}, {'name' => 'Workflow', 'value' => 'workflow'}], 'defaultValue' => 'instance', 'required' => true}], options[:options], @api_client, options[:params])['type']
249
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(add_integration_option_types(), options[:options], @api_client, options[:params])
250
+ params.deep_merge!(v_prompt)
251
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(add_integration_advanced_option_types, options[:options], @api_client, options[:params])
252
+ advanced_config.deep_compact!
253
+ params.deep_merge!(advanced_config)
254
+
255
+ # lookup type by name or code to validate it exists and to prompt for its optionTypes
256
+ # set integration.type=code because the api expects it that way.
257
+ if params['type'].to_s.empty?
258
+ raise_command_error "missing required option: --type TYPE", args, optparse
259
+ end
260
+ integration_type = find_integration_type_by_name_or_code_id(params['type'])
261
+ if integration_type.nil?
262
+ return 1, "integration type not found for #{params['type']}"
263
+ end
264
+ params['type'] = integration_type['code']
265
+ config_option_types = integration_type['optionTypes']
266
+ if config_option_types.nil?
267
+ config_option_types = @integration_types_interface.option_types(integration_type['id'])['optionTypes']
268
+ end
269
+ if config_option_types.nil?
270
+ print yellow,"No option types found for integration type: #{integration_type['name']} (#{integration_type['code']})", reset, "\n"
271
+ end
272
+ if config_option_types && config_option_types.size > 0
273
+ # optionTypes do not need fieldContext: 'integration'
274
+ config_option_types.each do |opt|
275
+ if opt['fieldContext'] == 'integration' || opt['fieldContext'] == 'domain'
276
+ opt['fieldContext'] = nil
277
+ end
278
+ end
279
+ config_prompt = MtnCloud::Cli::OptionTypes.prompt(config_option_types, options[:options], @api_client, options[:params], false, true)
280
+ config_prompt.deep_compact!
281
+ params.deep_merge!(config_prompt)
282
+ end
283
+ # convert checkbox "on" and "off" to true and false
284
+ params.booleanize!
285
+ payload[integration_object_key].deep_merge!(params)
286
+ end
287
+ @integrations_interface.setopts(options)
288
+ if options[:dry_run]
289
+ print_dry_run @integrations_interface.dry.create(payload)
290
+ return 0, nil
291
+ end
292
+ json_response = @integrations_interface.create(payload)
293
+ integration = json_response[integration_object_key]
294
+ render_response(json_response, options, integration_object_key) do
295
+ print_green_success "Added integration #{integration['name']}"
296
+ return _get(integration["id"], {}, options)
297
+ end
298
+ return 0, nil
299
+ end
300
+
301
+ def update(args)
302
+ options = {}
303
+ params = {}
304
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
305
+ opts.banner = subcommand_usage("[integration] [options]")
306
+ build_option_type_options(opts, options, update_integration_option_types)
307
+ build_option_type_options(opts, options, update_integration_advanced_option_types)
308
+ opts.on(nil, '--no-refresh', "Skip refresh on update.") do
309
+ params['refresh'] = 'false'
310
+ end
311
+ build_standard_update_options(opts, options)
312
+ opts.footer = <<-EOT
313
+ Update an integration.
314
+ [integration] is required. This is the name or id of an integration.
315
+ EOT
316
+ end
317
+ optparse.parse!(args)
318
+ verify_args!(args:args, optparse:optparse, count:1)
319
+ connect(options)
320
+ integration = find_integration_by_name_or_id(args[0])
321
+ return 1 if integration.nil?
322
+ payload = {}
323
+ if options[:payload]
324
+ payload = options[:payload]
325
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
326
+ else
327
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
328
+ # do not prompt on update
329
+ v_prompt = MtnCloud::Cli::OptionTypes.no_prompt(update_integration_option_types, options[:options], @api_client, options[:params])
330
+ v_prompt.deep_compact!
331
+ params.deep_merge!(v_prompt)
332
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(update_integration_advanced_option_types, options[:options], @api_client, options[:params])
333
+ advanced_config.deep_compact!
334
+ params.deep_merge!(advanced_config)
335
+ # convert checkbox "on" and "off" to true and false
336
+ params.booleanize!
337
+ # massage association params a bit
338
+
339
+ payload.deep_merge!({integration_object_key => params})
340
+ if payload[integration_object_key].empty? # || options[:no_prompt]
341
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
342
+ end
343
+ end
344
+ @integrations_interface.setopts(options)
345
+ if options[:dry_run]
346
+ print_dry_run @integrations_interface.dry.update(integration['id'], payload)
347
+ return
348
+ end
349
+ json_response = @integrations_interface.update(integration['id'], payload)
350
+ integration = json_response[integration_object_key]
351
+ render_response(json_response, options, integration_object_key) do
352
+ print_green_success "Updated integration #{integration['name']}"
353
+ return _get(integration["id"], {}, options)
354
+ end
355
+ return 0, nil
356
+ end
357
+
358
+ def refresh(args)
359
+ options = {}
360
+ query_params = {}
361
+ params = {}
362
+ payload = {}
363
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
364
+ opts.banner = subcommand_usage("[integration] [options]")
365
+ build_option_type_options(opts, options, update_integration_option_types)
366
+ build_option_type_options(opts, options, update_integration_advanced_option_types)
367
+ build_standard_update_options(opts, options)
368
+ opts.footer = <<-EOT
369
+ Refresh an integration.
370
+ [integration] is required. This is the name or id of an integration.
371
+ EOT
372
+ end
373
+ optparse.parse!(args)
374
+ verify_args!(args:args, optparse:optparse, count:1)
375
+ connect(options)
376
+ query_params.merge!(parse_query_options(options))
377
+ integration = find_integration_by_name_or_id(args[0])
378
+ return 1 if integration.nil?
379
+ payload = {}
380
+ if options[:payload]
381
+ payload = options[:payload]
382
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
383
+ else
384
+ payload.deep_merge!({integration_object_key => parse_passed_options(options)})
385
+ end
386
+ @integrations_interface.setopts(options)
387
+ if options[:dry_run]
388
+ print_dry_run @integrations_interface.dry.refresh(integration['id'], query_params, payload)
389
+ return
390
+ end
391
+ json_response = @integrations_interface.refresh(integration['id'], query_params, payload)
392
+ integration = json_response[integration_object_key]
393
+ render_response(json_response, options, integration_object_key) do
394
+ print_green_success "Refreshed integration #{integration['name']}"
395
+ return _get(integration["id"], {}, options)
396
+ end
397
+ return 0, nil
398
+ end
399
+
400
+ def remove(args)
401
+ options = {}
402
+ params = {}
403
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
404
+ opts.banner = subcommand_usage("[integration] [options]")
405
+ build_standard_remove_options(opts, options)
406
+ opts.footer = <<-EOT
407
+ Delete an integration.
408
+ [integration] is required. This is the name or id of an integration.
409
+ EOT
410
+ end
411
+ optparse.parse!(args)
412
+ verify_args!(args:args, optparse:optparse, count:1)
413
+ connect(options)
414
+ integration = find_integration_by_name_or_id(args[0])
415
+ return 1 if integration.nil?
416
+ @integrations_interface.setopts(options)
417
+ if options[:dry_run]
418
+ print_dry_run @integrations_interface.dry.destroy(integration['id'], params)
419
+ return
420
+ end
421
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the integration #{integration['name']}?")
422
+ return 9, "aborted command"
423
+ end
424
+ json_response = @integrations_interface.destroy(integration['id'], params)
425
+ render_response(json_response, options) do
426
+ print_green_success "Removed integration #{integration['name']}"
427
+ end
428
+ return 0, nil
429
+ end
430
+
431
+
432
+ def list_types(args)
433
+ options = {}
434
+ params = {}
435
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
436
+ opts.banner = subcommand_usage("[search]")
437
+ opts.on('--optionTypes [true|false]', String, "Include optionTypes in the response. Default is false.") do |val|
438
+ params['optionTypes'] = (val.to_s == '' || val.to_s == 'on' || val.to_s == 'true')
439
+ end
440
+ build_standard_list_options(opts, options)
441
+ opts.footer = "List integration types."
442
+ end
443
+ optparse.parse!(args)
444
+ connect(options)
445
+ # verify_args!(args:args, optparse:optparse, count:0)
446
+ if args.count > 0
447
+ options[:phrase] = args.join(" ")
448
+ end
449
+ params.merge!(parse_list_options(options))
450
+ @integration_types_interface.setopts(options)
451
+ if options[:dry_run]
452
+ print_dry_run @integration_types_interface.dry.list(params)
453
+ return
454
+ end
455
+ json_response = @integration_types_interface.list(params)
456
+ render_response(json_response, options, integration_type_list_key) do
457
+ integration_types = json_response[integration_type_list_key]
458
+ print_h1 "Integration Types", parse_list_subtitles(options), options
459
+ if integration_types.empty?
460
+ print cyan,"No integration types found.",reset,"\n"
461
+ else
462
+ list_columns = integration_type_column_definitions.upcase_keys!
463
+ print as_pretty_table(integration_types, list_columns, options)
464
+ print_results_pagination(json_response)
465
+ end
466
+ print reset,"\n"
467
+ end
468
+ return 0, nil
469
+ end
470
+
471
+ def get_type(args)
472
+ params = {'optionTypes' => true}
473
+ options = {}
474
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
475
+ opts.banner = subcommand_usage("[type]")
476
+ build_standard_get_options(opts, options)
477
+ opts.on('--optionTypes [true|false]', String, "Include optionTypes in the response. Default is true.") do |val|
478
+ params['optionTypes'] = (val.to_s == '' || val.to_s == 'on' || val.to_s == 'true')
479
+ end
480
+ opts.footer = <<-EOT
481
+ Get details about a specific integration type.
482
+ [type] is required. This is the name or id of an integration type.
483
+ EOT
484
+ end
485
+ optparse.parse!(args)
486
+ verify_args!(args:args, optparse:optparse, min:1)
487
+ connect(options)
488
+ params.merge!(parse_query_options(options))
489
+ id_list = parse_id_list(args)
490
+ return run_command_for_each_arg(id_list) do |arg|
491
+ _get_type(arg, params, options)
492
+ end
493
+ end
494
+
495
+ def _get_type(id, params, options)
496
+ integration_type = nil
497
+ if id.to_s !~ /\A\d{1,}\Z/
498
+ integration_type = find_integration_type_by_name_or_code(id)
499
+ return 1, "integration type not found for name or code '#{id}'" if integration_type.nil?
500
+ id = integration_type['id']
501
+ end
502
+ # /api/integration-types does not return optionTypes by default, use ?optionTypes=true
503
+ @integration_types_interface.setopts(options)
504
+ if options[:dry_run]
505
+ print_dry_run @integration_types_interface.dry.get(id, params)
506
+ return
507
+ end
508
+ json_response = @integration_types_interface.get(id, params)
509
+ integration_type = json_response[integration_type_object_key]
510
+ render_response(json_response, options, integration_type_object_key) do
511
+ print_h1 "Integration Type Details", [], options
512
+ print cyan
513
+ show_columns = integration_type_column_definitions
514
+ print_description_list(show_columns, integration_type)
515
+
516
+ if integration_type['optionTypes'] && integration_type['optionTypes'].size > 0
517
+ print_h2 "Option Types"
518
+ opt_columns = [
519
+ # {"ID" => lambda {|it| it['id'] } },
520
+ {"FIELD NAME" => lambda {|it| (it['fieldContext'] && it['fieldContext'] != 'integration') ? [it['fieldContext'], it['fieldName']].join('.') : it['fieldName'] } },
521
+ {"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
522
+ {"TYPE" => lambda {|it| it['type'] } },
523
+ {"DEFAULT" => lambda {|it| it['defaultValue'] } },
524
+ {"REQUIRED" => lambda {|it| format_boolean it['required'] } },
525
+ # {"DESCRIPTION" => lambda {|it| it['description'] }, # do it!
526
+ ]
527
+ print as_pretty_table(integration_type['optionTypes'], opt_columns)
528
+ else
529
+ # print cyan,"No option types found for this integration type.","\n",reset
530
+ end
531
+
532
+ print reset,"\n"
533
+ end
534
+ return 0, nil
535
+ end
536
+
537
+ ## Integration Objects
538
+
539
+ def list_objects(args)
540
+ options = {}
541
+ params = {}
542
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
543
+ opts.banner = subcommand_usage("[integration] [search]")
544
+ opts.on('-t', '--type CODE', "Filter by types: cloud, layout, blueprint, catalog") do |val|
545
+ params['type'] = [params['type'], val].compact.flatten.collect {|it| it.to_s.strip.split(",") }.flatten.collect {|it| it.to_s.strip }
546
+ end
547
+ build_standard_list_options(opts, options)
548
+ opts.footer = <<-EOT
549
+ List integration objects.
550
+ [integration] is required. This is the name or id of an integration.
551
+ EOT
552
+ end
553
+ optparse.parse!(args)
554
+ verify_args!(args:args, optparse:optparse, min:1)
555
+ connect(options)
556
+
557
+ integration = find_integration_by_name_or_id(args[0])
558
+ return 1, "integration not found for #{args[0]}" if integration.nil?
559
+
560
+ if args.count > 1
561
+ options[:phrase] = args[1..-1].join(" ")
562
+ end
563
+ params.merge!(parse_list_options(options))
564
+ @integrations_interface.setopts(options)
565
+ if options[:dry_run]
566
+ print_dry_run @integrations_interface.dry.list_objects(integration['id'], params)
567
+ return 0, nil
568
+ end
569
+ json_response = @integrations_interface.list_objects(integration['id'], params)
570
+ render_response(json_response, options, integration_list_key) do
571
+ integration_objects = json_response[integration_object_list_key]
572
+ print_h1 "Integration Objects [#{integration['name']}]", parse_list_subtitles(options), options
573
+ if integration_objects.empty?
574
+ print cyan,"No objects found.",reset,"\n"
575
+ else
576
+ list_columns = {
577
+ "ID" => 'id',
578
+ "Name" => 'name',
579
+ # "Category" => 'category',
580
+ # "Ref Type" => 'refType',
581
+ # "Ref ID" => 'refId',
582
+ # "Type" => lambda {|it| it['type'] },
583
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
584
+ "Ref ID" => 'refId',
585
+ }.upcase_keys!
586
+ print as_pretty_table(integration_objects, list_columns, options)
587
+ print_results_pagination(json_response)
588
+ end
589
+ print reset,"\n"
590
+ end
591
+ return 0, nil
592
+ end
593
+
594
+ def get_object(args)
595
+ params = {}
596
+ options = {}
597
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
598
+ opts.banner = subcommand_usage("[integration] [object]")
599
+ opts.on( '-c', '--config', "Display config only, for blueprint objects" ) do
600
+ options[:show_config] = true
601
+ end
602
+ build_standard_get_options(opts, options)
603
+ opts.footer = <<-EOT
604
+ Get details about a specific integration object.
605
+ [integration] is required. This is the name or id of an integration.
606
+ [object] is required. This is the name or id of an integration object.
607
+ EOT
608
+ end
609
+ optparse.parse!(args)
610
+ verify_args!(args:args, optparse:optparse, min:1)
611
+ connect(options)
612
+ optparse.parse!(args)
613
+ verify_args!(args:args, optparse:optparse, min:2)
614
+ connect(options)
615
+ integration = find_integration_by_name_or_id(args[0])
616
+ return 1, "integration not found for #{args[0]}" if integration.nil?
617
+ params.merge!(parse_query_options(options))
618
+ id_list = parse_id_list(args[1..-1])
619
+ return run_command_for_each_arg(id_list) do |arg|
620
+ _get_object(integration, arg, params, options)
621
+ end
622
+ end
623
+
624
+ def _get_object(integration, id, params, options)
625
+ integration_object = nil
626
+ if id.to_s !~ /\A\d{1,}\Z/
627
+ integration_object = find_integration_object_by_name_or_id(integration['id'], id)
628
+ return 1, "integration object not found for #{id}" if integration_object.nil?
629
+ id = integration_object['id']
630
+ end
631
+ @integrations_interface.setopts(options)
632
+ if options[:dry_run]
633
+ print_dry_run @integrations_interface.dry.get_object(integration['id'], id, params)
634
+ return
635
+ end
636
+ json_response = @integrations_interface.get_object(integration['id'], id, params)
637
+ integration_object = json_response[integration_object_object_key]
638
+ config = integration_object['config']
639
+ # export just the config as json (default) or yaml
640
+ if options[:show_config]
641
+ unless options[:json] || options[:yaml] || options[:csv]
642
+ options[:json] = :true
643
+ end
644
+ return render_with_format(config, options)
645
+ end
646
+ render_response(json_response, options, integration_object_object_key) do
647
+ print_h1 "Integration Object Details", [], options
648
+ print cyan
649
+ if integration_object['type'] == 'cloud'
650
+ show_columns = {
651
+ "Integration" => lambda {|it| integration['name'] },
652
+ "Object ID" => 'id',
653
+ "Name" => 'name',
654
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
655
+ # "Cloud" => lambda {|it| it['cloud']['name'] rescue nil },
656
+ # "Ref Type" => 'refType',
657
+ "Ref ID" => 'refId',
658
+ # "Reference" => lambda {|it| ("#{it['refType']}: #{it['refId']}" rescue nil) },
659
+ "Group" => lambda {|it| it['group']['name'] rescue nil },
660
+ }
661
+ print_description_list(show_columns, integration_object, options)
662
+ print reset,"\n"
663
+ elsif integration_object['type'] == 'layout'
664
+ show_columns = {
665
+ "Integration" => lambda {|it| integration['name'] },
666
+ "Object ID" => 'id',
667
+ "Name" => 'name',
668
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
669
+ # "Layout" => lambda {|it| it['layout']['name'] rescue nil },
670
+ # "Ref Type" => 'refType',
671
+ "Ref ID" => 'refId',
672
+ # "Reference" => lambda {|it| ("#{it['refType']}: #{it['refId']}" rescue nil) },
673
+ "Provision Type" => lambda {|it| it['layout']['provisionType']['name'] rescue nil },
674
+ "Instance Type" => lambda {|it| it['layout']['instanceType']['name'] rescue nil },
675
+ "Version" => lambda {|it| it['layout']['instanceVersion'] rescue nil },
676
+ }
677
+ print_description_list(show_columns, integration_object, options)
678
+ print reset,"\n"
679
+ elsif integration_object['type'] == 'blueprint'
680
+ show_columns = {
681
+ "Integration" => lambda {|it| integration['name'] },
682
+ "Object ID" => 'id',
683
+ "Name" => 'name',
684
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
685
+ # "Ref Type" => 'refType',
686
+ "Ref ID" => 'refId',
687
+ # "Reference" => lambda {|it| ("#{it['refType']}: #{it['refId']}" rescue nil) },
688
+ # "Blueprint Type" => lambda {|it| it['blueprint']['type'] rescue nil },
689
+ "Blueprint" => lambda {|it| it['blueprint']['name'] rescue nil },
690
+ "Group" => lambda {|it| it['group']['name'] rescue nil },
691
+ "Default Cloud" => lambda {|it| it['defaultCloud']['name'] rescue nil },
692
+ "Environment" => lambda {|it| it['environment'] rescue nil },
693
+ }
694
+ print_description_list(show_columns, integration_object, options)
695
+ # print reset,"\n"
696
+ # print_h2 "App Spec"
697
+ print_h2 "Config"
698
+ if config
699
+ # config_string = integration_object['config'] || ""
700
+ config_string = config.is_a?(Hash) ? JSON.pretty_generate(config) : config.to_s
701
+ #print reset,config_string,"\n",reset
702
+ config_lines = config_string.split("\n")
703
+ config_line_count = config_lines.size
704
+ max_lines = 10
705
+ if config_lines.size > max_lines
706
+ config_string = config_lines.first(max_lines).join("\n")
707
+ config_string << "\n\n"
708
+ config_string << "#{dark}(#{(config_line_count - max_lines)} more lines were not shown, use -c to show the config)#{reset}"
709
+ #config_string << "\n"
710
+ end
711
+ # strip --- yaml header
712
+ if config_string[0..3] == "---\n"
713
+ config_string = config_string[4..-1]
714
+ end
715
+ print reset,config_string.chomp("\n"),"\n",reset
716
+ else
717
+ print reset,"(blank)","\n",reset
718
+ end
719
+ print reset,"\n"
720
+ elsif integration_object['type'] == 'catalog'
721
+ show_columns = {
722
+ "Integration" => lambda {|it| integration['name'] },
723
+ "Object ID" => 'id',
724
+ "Name" => 'name',
725
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
726
+ "Catalog Item" => lambda {|it| it['catalogItemType']['name'] rescue nil },
727
+ # "Ref Type" => 'refType',
728
+ # "Ref ID" => 'refId',
729
+ # "Reference" => lambda {|it| ("#{it['refType']}: #{it['refId']}" rescue nil) },
730
+ }
731
+ print_description_list(show_columns, integration_object, options)
732
+ print reset,"\n"
733
+ else
734
+ # Unknown type?
735
+ show_columns = {
736
+ "Integration" => lambda {|it| integration['name'] },
737
+ "Object ID" => 'id',
738
+ "Name" => 'name',
739
+ "Type" => lambda {|it| it['type'].to_s.capitalize },
740
+ "Ref Type" => 'refType',
741
+ "Ref ID" => 'refId',
742
+ }
743
+ print_description_list(show_columns, integration_object, options)
744
+ print reset,"\n"
745
+ end
746
+ end
747
+ return 0, nil
748
+ end
749
+
750
+ def add_object(args)
751
+ options = {}
752
+ params = {}
753
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
754
+ opts.banner = subcommand_usage("[integration] [name] -t CODE [options]")
755
+ # opts.on('-t', '--type CODE', "Integration ObjectType code, see `#{command_name} list-types` for available type codes") do |val|
756
+ # options[:options]['type'] = val
757
+ # end
758
+ build_option_type_options(opts, options, add_integration_object_option_types)
759
+ opts.on('--config-file FILE', String, "Config from a local JSON or YAML file") do |val|
760
+ options[:config_file] = val.to_s
761
+ file_content = nil
762
+ full_filename = File.expand_path(options[:config_file])
763
+ if File.exist?(full_filename)
764
+ file_content = File.read(full_filename)
765
+ else
766
+ print_red_alert "File not found: #{full_filename}"
767
+ return 1
768
+ end
769
+ parse_result = parse_json_or_yaml(file_content)
770
+ config_map = parse_result[:data]
771
+ if config_map.nil?
772
+ # todo: bubble up JSON.parse error message
773
+ raise_command_error "Failed to parse config as YAML or JSON. Error: #{parse_result[:error]}"
774
+ #raise_command_error "Failed to parse config as valid YAML or JSON."
775
+ else
776
+ params['config'] = config_map
777
+ options[:options]['config'] = params['config'] # or file_content
778
+ end
779
+ end
780
+ # build_option_type_options(opts, options, add_integration_object_advanced_option_types)
781
+ build_standard_add_options(opts, options)
782
+ opts.footer = <<-EOT
783
+ Create a new integration object.
784
+ [integration] is required. This is the name or id of an integration.
785
+ [name] is required. This is the name of the new integration
786
+ Configuration options vary by integration type.
787
+ EOT
788
+ end
789
+ optparse.parse!(args)
790
+ verify_args!(args:args, optparse:optparse, min:1, max:2)
791
+ options[:options]['name'] = args[1] if args[1]
792
+ connect(options)
793
+ integration = find_integration_by_name_or_id(args[0])
794
+ return 1, "integration not found for #{args[0]}" if integration.nil?
795
+ payload = {}
796
+ if options[:payload]
797
+ payload = options[:payload]
798
+ payload.deep_merge!({integration_object_object_key => parse_passed_options(options)})
799
+ else
800
+ payload.deep_merge!({integration_object_object_key => parse_passed_options(options)})
801
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(add_integration_object_option_types(), options[:options], @api_client, options[:params])
802
+ v_prompt.deep_compact!
803
+ params.deep_merge!(v_prompt)
804
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(add_integration_object_advanced_option_types, options[:options], @api_client, options[:params])
805
+ advanced_config.deep_compact!
806
+ params.deep_merge!(advanced_config)
807
+ params.booleanize!
808
+
809
+ # convert config string to a map
810
+ # config = params['config']
811
+ # if config && config.is_a?(String)
812
+ # parse_result = parse_json_or_yaml(config)
813
+ # config_map = parse_result[:data]
814
+ # if config_map.nil?
815
+ # # todo: bubble up JSON.parse error message
816
+ # raise_command_error "Failed to parse config as YAML or JSON. Error: #{parse_result[:error]}"
817
+ # #raise_command_error "Failed to parse config as valid YAML or JSON."
818
+ # else
819
+ # params['config'] = config_map
820
+ # end
821
+ # end
822
+ # if params['config']
823
+ # config_map = params.delete('config')
824
+ # params['config'] = as_json(config_map, {:pretty_json => true})
825
+ # end
826
+ # if options[:interactive_config]
827
+ # print_h2 "App Config"
828
+ # config_map = prompt_app_config(options)
829
+ # params['config'] = config_map
830
+ # end
831
+
832
+ payload[integration_object_object_key].deep_merge!(params)
833
+ end
834
+ @integrations_interface.setopts(options)
835
+ if options[:dry_run]
836
+ print_dry_run @integrations_interface.dry.create_object(integration['id'], payload)
837
+ return 0, nil
838
+ end
839
+ json_response = @integrations_interface.create_object(integration['id'], payload)
840
+ integration_object = json_response[integration_object_object_key]
841
+ render_response(json_response, options, integration_object_object_key) do
842
+ print_green_success "Added integration_object #{integration_object['name']}"
843
+ return _get_object(integration, integration_object["id"], {}, options)
844
+ end
845
+ return 0, nil
846
+ end
847
+
848
+ # def update_object(args)
849
+ # options = {}
850
+ # params = {}
851
+ # optparse = MtnCloud::Cli::OptionParser.new do |opts|
852
+ # opts.banner = subcommand_usage("[integration] [object] [options]")
853
+ # build_option_type_options(opts, options, update_integration_option_types)
854
+ # build_option_type_options(opts, options, update_integration_advanced_option_types)
855
+ # build_standard_update_options(opts, options)
856
+ # opts.footer = <<-EOT
857
+ # Update an integration.
858
+ # [integration] is required. This is the name or id of an integration.
859
+ # [object] is required. This is the name or id of an integration object.
860
+ # EOT
861
+ # end
862
+ # optparse.parse!(args)
863
+ # verify_args!(args:args, optparse:optparse, count:2)
864
+ # connect(options)
865
+ # integration = find_integration_by_name_or_id(args[0])
866
+ # return 1, "integration not found for #{args[0]}" if integration.nil?
867
+ # integration_object = find_integration_object_by_name_or_id(integration['id'], args[1])
868
+ # return 1, "integration object not found for #{args[1]}" if integration_object.nil?
869
+ # payload = {}
870
+ # if options[:payload]
871
+ # payload = options[:payload]
872
+ # payload.deep_merge!({integration_object_object_key => parse_passed_options(options)})
873
+ # else
874
+ # payload.deep_merge!({integration_object_object_key => parse_passed_options(options)})
875
+ # # do not prompt on update
876
+ # v_prompt = MtnCloud::Cli::OptionTypes.no_prompt(update_integration_object_option_types, options[:options], @api_client, options[:params])
877
+ # v_prompt.deep_compact!
878
+ # params.deep_merge!(v_prompt)
879
+ # advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(update_integration_object_advanced_option_types, options[:options], @api_client, options[:params])
880
+ # advanced_config.deep_compact!
881
+ # params.deep_merge!(advanced_config)
882
+ # # convert checkbox "on" and "off" to true and false
883
+ # params.booleanize!
884
+ # # massage association params a bit
885
+
886
+ # payload.deep_merge!({integration_object_object_key => params})
887
+ # if payload[integration_object_object_key].empty? # || options[:no_prompt]
888
+ # raise_command_error "Specify at least one option to update.\n#{optparse}"
889
+ # end
890
+ # end
891
+ # @integrations_interface.setopts(options)
892
+ # if options[:dry_run]
893
+ # print_dry_run @integrations_interface.dry.update_object(integration['id'], integration_object['id'], payload)
894
+ # return
895
+ # end
896
+ # json_response = @integrations_interface.update_object(integration['id'], integration_object['id'], payload)
897
+ # integration_object = json_response[integration_object_object_key]
898
+ # render_response(json_response, options, integration_object_object_key) do
899
+ # print_green_success "Updated integration object #{integration_object['name']}"
900
+ # return _get_object(integration, integration_object["id"], {}, options)
901
+ # end
902
+ # return 0, nil
903
+ # end
904
+
905
+ def remove_object(args)
906
+ options = {}
907
+ params = {}
908
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
909
+ opts.banner = subcommand_usage("[integration] [options]")
910
+ build_standard_remove_options(opts, options)
911
+ opts.footer = <<-EOT
912
+ Delete an integration object.
913
+ [integration] is required. This is the name or id of an integration.
914
+ [object] is required. This is the name or id of an integration object.
915
+ EOT
916
+ end
917
+ optparse.parse!(args)
918
+ verify_args!(args:args, optparse:optparse, count:2)
919
+ connect(options)
920
+ integration = find_integration_by_name_or_id(args[0])
921
+ return 1, "integration not found for #{args[0]}" if integration.nil?
922
+ integration_object = find_integration_object_by_name_or_id(integration['id'], args[1])
923
+ return 1, "integration object not found for #{args[1]}" if integration_object.nil?
924
+ params.merge!(parse_query_options(options))
925
+ @integrations_interface.setopts(options)
926
+ if options[:dry_run]
927
+ print_dry_run @integrations_interface.dry.destroy_object(integration['id'], integration_object['id'], params)
928
+ return
929
+ end
930
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the integration object #{integration_object['name']}?")
931
+ return 9, "aborted command"
932
+ end
933
+ json_response = @integrations_interface.destroy_object(integration['id'], integration_object['id'], params)
934
+ render_response(json_response, options) do
935
+ print_green_success "Removed integration object #{integration_object['name']}"
936
+ end
937
+ return 0, nil
938
+ end
939
+
940
+ def list_inventory(args)
941
+ options = {}
942
+ params = {}
943
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
944
+ opts.banner = subcommand_usage("[integration] [search]")
945
+ build_standard_list_options(opts, options)
946
+ opts.footer = <<-EOT
947
+ List integration inventory.
948
+ [integration] is required. This is the name or id of an integration.
949
+ Only certain types of integrations support this operation, such as Ansible Tower.
950
+ EOT
951
+ end
952
+ optparse.parse!(args)
953
+ verify_args!(args:args, optparse:optparse, min:1)
954
+ connect(options)
955
+
956
+ integration = find_integration_by_name_or_id(args[0])
957
+ return 1, "integration not found for #{args[0]}" if integration.nil?
958
+
959
+ if args.count > 1
960
+ options[:phrase] = args[1..-1].join(" ")
961
+ end
962
+ params.merge!(parse_list_options(options))
963
+ @integrations_interface.setopts(options)
964
+ if options[:dry_run]
965
+ print_dry_run @integrations_interface.dry.list_inventory(integration['id'], params)
966
+ return 0, nil
967
+ end
968
+ json_response = @integrations_interface.list_inventory(integration['id'], params)
969
+ render_response(json_response, options, integration_inventory_list_key) do
970
+ integration_inventory = json_response[integration_inventory_list_key]
971
+ print_h1 "Integration Inventory [#{integration['name']}]", parse_list_subtitles(options), options
972
+ if integration_inventory.empty?
973
+ print cyan,"No inventory found.",reset,"\n"
974
+ else
975
+ list_columns = {
976
+ "ID" => 'id',
977
+ "Name" => 'name',
978
+ "Description" => 'description',
979
+ "Tenant Default" => lambda {|it| (format_list(it['tenants'].collect {|t| t['name'] }) rescue "") },
980
+ }
981
+ print as_pretty_table(integration_inventory, list_columns.upcase_keys!, options)
982
+ print_results_pagination(json_response)
983
+ end
984
+ print reset,"\n"
985
+ end
986
+ return 0, nil
987
+ end
988
+
989
+ def get_inventory(args)
990
+ params = {}
991
+ options = {}
992
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
993
+ opts.banner = subcommand_usage("[integration] [inventory]")
994
+ build_standard_get_options(opts, options)
995
+ opts.footer = <<-EOT
996
+ Get details about a specific integration inventory item.
997
+ [integration] is required. This is the name or id of an integration.
998
+ [inventory] is required. This is the name or id of an integration inventory item.
999
+ Only certain types of integrations support this operation, such as Ansible Tower.
1000
+ EOT
1001
+ end
1002
+ optparse.parse!(args)
1003
+ verify_args!(args:args, optparse:optparse, min:2)
1004
+ connect(options)
1005
+ integration = find_integration_by_name_or_id(args[0])
1006
+ return 1, "integration not found for #{args[0]}" if integration.nil?
1007
+ params.merge!(parse_query_options(options))
1008
+ id_list = parse_id_list(args[1..-1])
1009
+ return run_command_for_each_arg(id_list) do |arg|
1010
+ _get_inventory(integration, arg, params, options)
1011
+ end
1012
+ end
1013
+
1014
+ def _get_inventory(integration, id, params, options)
1015
+ integration_object = nil
1016
+ if id.to_s !~ /\A\d{1,}\Z/
1017
+ integration_inventory = find_integration_inventory_by_name_or_id(integration['id'], id)
1018
+ return 1, "integration inventory not found for #{id}" if integration_inventory.nil?
1019
+ id = integration_inventory['id']
1020
+ end
1021
+ @integrations_interface.setopts(options)
1022
+ if options[:dry_run]
1023
+ print_dry_run @integrations_interface.dry.get_inventory(integration['id'], id, params)
1024
+ return
1025
+ end
1026
+ json_response = @integrations_interface.get_inventory(integration['id'], id, params)
1027
+ integration_inventory = json_response[integration_inventory_object_key]
1028
+ render_response(json_response, options, integration_inventory_object_key) do
1029
+ print_h1 "Integration Inventory Details", [], options
1030
+ print cyan
1031
+ show_columns = {
1032
+ "ID" => 'id',
1033
+ "Name" => 'name',
1034
+ "Description" => 'description',
1035
+ "Tenant Default" => lambda {|it| (format_list(it['tenants'].collect {|t| t['name'] }) rescue "") },
1036
+ }
1037
+ print_description_list(show_columns, integration_inventory, options)
1038
+ print reset,"\n"
1039
+ end
1040
+ return 0, nil
1041
+ end
1042
+
1043
+ def update_inventory(args)
1044
+ options = {}
1045
+ params = {}
1046
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
1047
+ opts.banner = subcommand_usage("[integration] [inventory] [options]")
1048
+ opts.on('--tenants [LIST]', String, "Tenant Default, comma separated list of account IDs") do |val|
1049
+ options[:tenants] = parse_array(val)
1050
+ end
1051
+ build_standard_update_options(opts, options)
1052
+ opts.footer = <<-EOT
1053
+ Update an integration inventory item.
1054
+ [integration] is required. This is the name or id of an integration.
1055
+ [inventory] is required. This is the name or id of an integration inventory item.
1056
+ Only certain types of integrations support this operation, such as Ansible Tower.
1057
+ EOT
1058
+ end
1059
+ optparse.parse!(args)
1060
+ verify_args!(args:args, optparse:optparse, count:2)
1061
+ connect(options)
1062
+ integration = find_integration_by_name_or_id(args[0])
1063
+ return 1, "integration not found for #{args[0]}" if integration.nil?
1064
+ integration_inventory = find_integration_inventory_by_name_or_id(integration['id'], args[1])
1065
+ return 1, "integration inventory not found for #{args[1]}" if integration_inventory.nil?
1066
+ # construct payload
1067
+ object_key = integration_inventory_object_key
1068
+ payload = parse_payload(options, object_key)
1069
+ if payload.nil?
1070
+ if options[:tenants]
1071
+ #params['tenants'] = options[:tenants]
1072
+ params['tenants'] = options[:tenants].collect do |val|
1073
+ if val.to_s =~ /\A\d{1,}\Z/
1074
+ val.to_i
1075
+ else
1076
+ # todo: use /api/options/allTenants to avoid permission errors here..
1077
+ record = find_by_name_or_id(:account, val)
1078
+ if record.nil?
1079
+ exit 1 #return 1, "Tenant not found by '#{val}'"
1080
+ else
1081
+ record['id']
1082
+ end
1083
+ end
1084
+ end
1085
+ end
1086
+ payload.deep_merge!({object_key => params})
1087
+ if payload.empty? || payload[object_key].empty?
1088
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
1089
+ end
1090
+ end
1091
+ # make request
1092
+ @integrations_interface.setopts(options)
1093
+ if options[:dry_run]
1094
+ print_dry_run @integrations_interface.dry.update_inventory(integration['id'], integration_inventory['id'], payload)
1095
+ return
1096
+ end
1097
+ json_response = @integrations_interface.update_inventory(integration['id'], integration_inventory['id'], payload)
1098
+ integration_inventory = json_response[object_key]
1099
+ render_response(json_response, options, object_key) do
1100
+ print_green_success "Updated integration inventory #{integration_inventory['name']}"
1101
+ # return _get_inventory(integration, integration_inventory["id"], {}, options)
1102
+ end
1103
+ return 0, nil
1104
+ end
1105
+
1106
+ private
1107
+
1108
+ def format_integration_type(integration)
1109
+ (integration['integrationType']['name'] || integration['integrationType']['code']) rescue integration['integrationType'].to_s
1110
+ end
1111
+
1112
+ def add_integration_option_types
1113
+ [
1114
+ {'code' => 'integration.type', 'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
1115
+ # @integration_types_interface.list(max:-1)[integration_list_key].collect {|it|
1116
+ get_available_integration_types().collect {|it|
1117
+ {'name' => it['name'], 'value' => it['code']}
1118
+ } }, 'required' => true, 'description' => "Integration Type code, see `#{command_name} list-types` for available type codes"},
1119
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name of the integration'},
1120
+ # {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'},
1121
+ {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true, 'description' => 'Can be used to disable an integration'}
1122
+ ]
1123
+ end
1124
+
1125
+ def add_integration_advanced_option_types
1126
+ []
1127
+ end
1128
+
1129
+ def update_integration_option_types
1130
+ list = add_integration_option_types.collect {|it|
1131
+ it.delete('required')
1132
+ it.delete('defaultValue')
1133
+ it
1134
+ }
1135
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
1136
+ list
1137
+ end
1138
+
1139
+ def update_integration_advanced_option_types
1140
+ add_integration_advanced_option_types.collect {|it|
1141
+ it.delete('required')
1142
+ it.delete('defaultValue')
1143
+ it
1144
+ }
1145
+ end
1146
+
1147
+ def integration_object_key
1148
+ 'integration'
1149
+ end
1150
+
1151
+ def integration_list_key
1152
+ 'integrations'
1153
+ end
1154
+
1155
+ def find_integration_by_name_or_id(val)
1156
+ if val.to_s =~ /\A\d{1,}\Z/
1157
+ return find_integration_by_id(val)
1158
+ else
1159
+ return find_integration_by_name(val)
1160
+ end
1161
+ end
1162
+
1163
+ def find_integration_by_id(id)
1164
+ begin
1165
+ json_response = @integrations_interface.get(id.to_i)
1166
+ return json_response[integration_object_key]
1167
+ rescue RestClient::Exception => e
1168
+ if e.response && e.response.code == 404
1169
+ print_red_alert "Integration not found by id '#{id}'"
1170
+ else
1171
+ raise e
1172
+ end
1173
+ end
1174
+ end
1175
+
1176
+ def find_integration_by_name(name)
1177
+ json_response = @integrations_interface.list({name: name.to_s})
1178
+ integrations = json_response[integration_list_key]
1179
+ if integrations.empty?
1180
+ print_red_alert "Integration not found by name '#{name}'"
1181
+ return nil
1182
+ elsif integrations.size > 1
1183
+ print_red_alert "#{integrations.size} integrations found by name '#{name}'"
1184
+ puts_error as_pretty_table(integrations, [:id, :name], {color:red})
1185
+ print_red_alert "Try using ID instead"
1186
+ print reset,"\n"
1187
+ return nil
1188
+ else
1189
+ return integrations[0]
1190
+ end
1191
+ end
1192
+
1193
+ def format_integration_status(integration, return_color=cyan)
1194
+ out = ""
1195
+ status_string = integration['status']
1196
+ if status_string.nil? || status_string.empty? || status_string == "unknown"
1197
+ out << "#{white}UNKNOWN#{integration['statusMessage'] ? "#{return_color} - #{integration['statusMessage']}" : ''}#{return_color}"
1198
+ # elsif integration['enabled'] == false
1199
+ # out << "#{red}DISABLED#{integration['statusMessage'] ? "#{return_color} - #{integration['statusMessage']}" : ''}#{return_color}"
1200
+ elsif status_string == 'ok'
1201
+ out << "#{green}#{status_string.upcase}#{return_color}"
1202
+ elsif status_string == 'error' || status_string == 'offline'
1203
+ out << "#{red}#{status_string ? status_string.upcase : 'N/A'}#{integration['statusMessage'] ? "#{return_color} - #{integration['statusMessage']}" : ''}#{return_color}"
1204
+ else
1205
+ out << "#{yellow}#{status_string.upcase}#{return_color}"
1206
+ end
1207
+ out
1208
+ end
1209
+
1210
+
1211
+ def integration_type_column_definitions()
1212
+ {
1213
+ "ID" => 'id',
1214
+ "Code" => 'code',
1215
+ "Name" => 'name',
1216
+ # "Description" => 'description',
1217
+ "Category" => 'category',
1218
+ # "Enabled" => lambda {|it| format_boolean(it['enabled']) },
1219
+ "Creatable" => lambda {|it| format_boolean(it['creatable']) },
1220
+ }
1221
+ end
1222
+
1223
+ def integration_type_object_key
1224
+ 'integrationType'
1225
+ end
1226
+
1227
+ def integration_type_list_key
1228
+ 'integrationTypes'
1229
+ end
1230
+
1231
+ def find_integration_type_by_name_or_code_id(val, params={})
1232
+ if val.to_s =~ /\A\d{1,}\Z/
1233
+ return find_integration_type_by_id(val, params)
1234
+ else
1235
+ return find_integration_type_by_name_or_code(val)
1236
+ end
1237
+ end
1238
+
1239
+ def find_integration_type_by_id(id, params={})
1240
+ begin
1241
+ json_response = @integration_types_interface.get(id.to_i, params)
1242
+ return json_response[integration_object_key]
1243
+ rescue RestClient::Exception => e
1244
+ if e.response && e.response.code == 404
1245
+ print_red_alert "Integration not found by id '#{id}'"
1246
+ else
1247
+ raise e
1248
+ end
1249
+ end
1250
+ end
1251
+
1252
+ def find_integration_type_by_name(name, params={})
1253
+ json_response = @integration_types_interface.list(params.merge({name: name.to_s}))
1254
+ integration_types = json_response[integration_type_list_key]
1255
+ if integration_types.empty?
1256
+ print_red_alert "Integration type not found by name '#{name}'"
1257
+ return nil
1258
+ elsif integration_types.size > 1
1259
+ print_red_alert "#{integration_types.size} integration types found by name '#{name}'"
1260
+ puts_error as_pretty_table(integration_types, [:id, :code, :name], {color:red})
1261
+ print_red_alert "Try using ID instead"
1262
+ print reset,"\n"
1263
+ return nil
1264
+ else
1265
+ return integration_types[0]
1266
+ end
1267
+ end
1268
+
1269
+ def get_available_integration_types(refresh=false)
1270
+ if !@available_integration_types || refresh
1271
+ @available_integration_types = @integration_types_interface.list(max:10000)[integration_type_list_key]
1272
+ end
1273
+ return @available_integration_types
1274
+ end
1275
+
1276
+ def find_integration_type_by_name_or_code(name)
1277
+ records = get_available_integration_types()
1278
+ record = records.find { |z| z['name'].downcase == name.downcase || z['code'].downcase == name.downcase}
1279
+ record = record ? record : records.find { |z| z['id'].to_s == name.to_s }
1280
+ if record
1281
+ return record
1282
+ else
1283
+ print_red_alert "integration type not found by '#{name}'"
1284
+ return nil
1285
+ end
1286
+ end
1287
+
1288
+ ## Integration Object helpers
1289
+
1290
+ def add_integration_object_option_types
1291
+ [
1292
+ {'code' => 'integrationObject.type', 'shorthand' => '-t', 'switch' => 'type', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'optionSource' => 'integrationObjectTypes', 'required' => true, 'description' => "Integration Object Type eg. catalog", 'displayOrder' => 1},
1293
+ # {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => false, 'description' => 'Display Name of the integration object, default is the name of the referenced object', 'displayOrder' => 2},
1294
+ {'dependsOnCode' => 'integrationObject.type:catalog', 'switch' => 'catalog', 'fieldName' => 'catalog', 'fieldLabel' => 'Catalog Item', 'type' => 'select', 'optionSource' => 'catalogItemTypes', 'required' => true, 'description' => 'Catalog Item', 'displayOrder' => 13},
1295
+ ]
1296
+ end
1297
+
1298
+ def add_integration_object_advanced_option_types
1299
+ []
1300
+ end
1301
+
1302
+ def update_integration_object_option_types
1303
+ list = add_integration_object_option_types.collect {|it|
1304
+ it.delete('required')
1305
+ it.delete('defaultValue')
1306
+ it
1307
+ }
1308
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
1309
+ list
1310
+ end
1311
+
1312
+ def update_integration_object_advanced_option_types
1313
+ add_integration_advanced_option_types.collect {|it|
1314
+ it.delete('required')
1315
+ it.delete('defaultValue')
1316
+ it
1317
+ }
1318
+ end
1319
+
1320
+ def integration_object_object_key
1321
+ 'object'
1322
+ end
1323
+
1324
+ def integration_object_list_key
1325
+ 'objects'
1326
+ end
1327
+
1328
+ def find_integration_object_by_name_or_id(integration_id, val)
1329
+ if val.to_s =~ /\A\d{1,}\Z/
1330
+ return find_integration_object_by_id(integration_id, val)
1331
+ else
1332
+ return find_integration_object_by_name(integration_id, val)
1333
+ end
1334
+ end
1335
+
1336
+ def find_integration_object_by_id(integration_id, id)
1337
+ begin
1338
+ json_response = @integrations_interface.get_object(integration_id, id.to_i)
1339
+ return json_response[integration_object_object_key]
1340
+ rescue RestClient::Exception => e
1341
+ if e.response && e.response.code == 404
1342
+ print_red_alert "integration object not found by id '#{id}'"
1343
+ else
1344
+ raise e
1345
+ end
1346
+ end
1347
+ end
1348
+
1349
+ def find_integration_object_by_name(integration_id, name)
1350
+ json_response = @integrations_interface.list_objects(integration_id, {name: name.to_s})
1351
+ integration_objects = json_response[integration_object_list_key]
1352
+ if integration_objects.empty?
1353
+ print_red_alert "integration object not found by name '#{name}'"
1354
+ return nil
1355
+ elsif integration_objects.size > 1
1356
+ print_red_alert "#{integration_objects.size} integration object found by name '#{name}'"
1357
+ puts_error as_pretty_table(integration_objects, [:id, :name], {color:red})
1358
+ print_red_alert "Try using ID instead"
1359
+ print reset,"\n"
1360
+ return nil
1361
+ else
1362
+ return integration_objects[0]
1363
+ end
1364
+ end
1365
+
1366
+ def integration_inventory_object_key
1367
+ 'inventory'
1368
+ end
1369
+
1370
+ def integration_inventory_list_key
1371
+ 'inventory'
1372
+ end
1373
+
1374
+ def find_integration_inventory_by_name_or_id(integration_id, val)
1375
+ if val.to_s =~ /\A\d{1,}\Z/
1376
+ return find_integration_inventory_by_id(integration_id, val)
1377
+ else
1378
+ return find_integration_inventory_by_name(integration_id, val)
1379
+ end
1380
+ end
1381
+
1382
+ def find_integration_inventory_by_id(integration_id, id)
1383
+ begin
1384
+ json_response = @integrations_interface.get_inventory(integration_id, id.to_i)
1385
+ return json_response[integration_inventory_object_key]
1386
+ rescue RestClient::Exception => e
1387
+ if e.response && e.response.code == 404
1388
+ print_red_alert "Inventory not found by id '#{id}'"
1389
+ else
1390
+ raise e
1391
+ end
1392
+ end
1393
+ end
1394
+
1395
+ def find_integration_inventory_by_name(integration_id, name)
1396
+ json_response = @integrations_interface.list_inventory(integration_id, {name: name.to_s})
1397
+ integration_inventory = json_response[integration_inventory_list_key]
1398
+ if integration_inventory.empty?
1399
+ print_red_alert "Inventory not found by name '#{name}'"
1400
+ return nil
1401
+ elsif integration_inventory.size > 1
1402
+ print_red_alert "#{integration_inventory.size} inventory found by name '#{name}'"
1403
+ puts_error as_pretty_table(integration_inventory, [:id, :name], {color:red})
1404
+ print_red_alert "Try using ID instead"
1405
+ print reset,"\n"
1406
+ return nil
1407
+ else
1408
+ return integration_inventory[0]
1409
+ end
1410
+ end
1411
+
1412
+ end