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,858 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ # CLI command Catalog Item Types
4
+ # UI is Library > Blueprints > Catalog Items
5
+ # API is /api/catalog-item-types and returns catalogItemTypes
6
+ class MtnCloud::Cli::CatalogItemTypesCommand
7
+ include MtnCloud::Cli::CliCommand
8
+ include MtnCloud::Cli::LibraryHelper
9
+ include MtnCloud::Cli::OptionSourceHelper
10
+
11
+ set_command_name :'catalog-item-types'
12
+ set_command_description "View and manage catalog item types"
13
+
14
+ register_subcommands :list, :get, :add, :update, :remove
15
+ register_subcommands({:'update-logo' => :update_logo, :'update-dark-logo' => :update_dark_logo})
16
+
17
+ def connect(opts)
18
+ @api_client = establish_remote_appliance_connection(opts)
19
+ @catalog_item_types_interface = @api_client.catalog_item_types
20
+ @option_types_interface = @api_client.option_types
21
+ end
22
+
23
+ def handle(args)
24
+ handle_subcommand(args)
25
+ end
26
+
27
+ def list(args)
28
+ options = {}
29
+ params = {}
30
+ ref_ids = []
31
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
32
+ opts.banner = subcommand_usage("[search]")
33
+ opts.on( '--enabled [on|off]', String, "Filter by enabled" ) do |val|
34
+ params['enabled'] = (val.to_s != 'false' && val.to_s != 'off')
35
+ end
36
+ opts.on( '--featured [on|off]', String, "Filter by featured" ) do |val|
37
+ params['featured'] = (val.to_s != 'false' && val.to_s != 'off')
38
+ end
39
+ opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
40
+ add_query_parameter(params, 'labels', parse_labels(val))
41
+ end
42
+ opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
43
+ add_query_parameter(params, 'allLabels', parse_labels(val))
44
+ end
45
+ opts.on('--code CODE', String, "Filter by code" ) do |val|
46
+ params[:code] = val
47
+ end
48
+ opts.on('-c', '--category CATEGORY', String, "Filter by category") do |val|
49
+ add_query_parameter(params, 'category', val)
50
+ end
51
+ build_standard_list_options(opts, options)
52
+ opts.footer = "List catalog item types."
53
+ end
54
+ optparse.parse!(args)
55
+ connect(options)
56
+ # verify_args!(args:args, optparse:optparse, count:0)
57
+ if args.count > 0
58
+ options[:phrase] = args.join(" ")
59
+ end
60
+ params.merge!(parse_list_options(options))
61
+ @catalog_item_types_interface.setopts(options)
62
+ if options[:dry_run]
63
+ print_dry_run @catalog_item_types_interface.dry.list(params)
64
+ return
65
+ end
66
+ json_response = @catalog_item_types_interface.list(params)
67
+ catalog_item_types = json_response[catalog_item_type_list_key]
68
+ render_response(json_response, options, catalog_item_type_list_key) do
69
+ print_h1 "Catalog Item Types", parse_list_subtitles(options), options
70
+ if catalog_item_types.empty?
71
+ print cyan,"No catalog item types found.",reset,"\n"
72
+ else
73
+ list_columns = catalog_item_type_list_column_definitions.upcase_keys!
74
+ #list_columns["Config"] = lambda {|it| truncate_string(it['config'], 100) }
75
+ print as_pretty_table(catalog_item_types, list_columns.upcase_keys!, options)
76
+ print_results_pagination(json_response)
77
+ end
78
+ print reset,"\n"
79
+ end
80
+ if catalog_item_types.empty?
81
+ return 1, "no catalog item types found"
82
+ else
83
+ return 0, nil
84
+ end
85
+ end
86
+
87
+ def get(args)
88
+ params = {}
89
+ options = {}
90
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
91
+ opts.banner = subcommand_usage("[type]")
92
+ opts.on( '-c', '--config', "Display raw config only." ) do
93
+ options[:show_config] = true
94
+ end
95
+ # opts.on('--no-config', "Do not display Config YAML." ) do
96
+ # options[:no_config] = true
97
+ # end
98
+ opts.on('--no-content', "Do not display Content." ) do
99
+ options[:no_content] = true
100
+ end
101
+ build_standard_get_options(opts, options)
102
+ opts.footer = <<-EOT
103
+ Get details about a specific catalog item type.
104
+ [type] is required. This is the name or id of a catalog item type.
105
+ EOT
106
+ end
107
+ optparse.parse!(args)
108
+ verify_args!(args:args, optparse:optparse, min:1)
109
+ connect(options)
110
+ id_list = parse_id_list(args)
111
+ return run_command_for_each_arg(id_list) do |arg|
112
+ _get(arg, params, options)
113
+ end
114
+ end
115
+
116
+ def _get(id, params, options)
117
+ catalog_item_type = nil
118
+ if id.to_s !~ /\A\d{1,}\Z/
119
+ catalog_item_type = find_catalog_item_type_by_name(id)
120
+ return 1, "catalog item type not found for #{id}" if catalog_item_type.nil?
121
+ id = catalog_item_type['id']
122
+ end
123
+ @catalog_item_types_interface.setopts(options)
124
+ if options[:dry_run]
125
+ print_dry_run @catalog_item_types_interface.dry.get(id, params)
126
+ return
127
+ end
128
+ # skip extra query, list has same data as show right now
129
+ if catalog_item_type
130
+ json_response = {catalog_item_type_object_key => catalog_item_type}
131
+ else
132
+ json_response = @catalog_item_types_interface.get(id, params)
133
+ end
134
+ catalog_item_type = json_response[catalog_item_type_object_key]
135
+ # export just the config as json or yaml (default)
136
+ if options[:show_config]
137
+ if catalog_item_type['instanceSpec']
138
+ puts catalog_item_type['instanceSpec']
139
+ # print reset
140
+ return 0, nil
141
+ end
142
+ unless options[:json] || options[:yaml] || options[:csv]
143
+ options[:json] = true
144
+ end
145
+ return render_with_format(catalog_item_type['config'] || {}, options)
146
+ end
147
+ render_response(json_response, options, catalog_item_type_object_key) do
148
+ print_h1 "Catalog Item Type Details", [], options
149
+ print cyan
150
+ show_columns = catalog_item_type_column_definitions
151
+ show_columns.delete("Form") unless catalog_item_type['form']
152
+ show_columns.delete("Blueprint") unless catalog_item_type['blueprint']
153
+ show_columns.delete("Workflow") unless catalog_item_type['workflow']
154
+ show_columns.delete("Context") unless catalog_item_type['context'] # workflow context
155
+ print_description_list(show_columns, catalog_item_type)
156
+
157
+ option_type_form = catalog_item_type['form']
158
+ if option_type_form
159
+ print_h2 "Form Inputs"
160
+ form_inputs = (option_type_form['options'] || [])
161
+ if option_type_form['fieldGroups']
162
+ option_type_form['fieldGroups'].each { |field_group| form_inputs += (field_group['options'] || []) }
163
+ end
164
+ # print format_simple_option_types_table(form_inputs, options)
165
+ print format_option_types_table(form_inputs, options, 'config.customOptions')
166
+ print reset,"\n"
167
+ else
168
+ # print cyan,"No form inputs found for this catalog item.","\n",reset
169
+ end
170
+
171
+ if catalog_item_type['optionTypes'] && catalog_item_type['optionTypes'].size > 0
172
+ print_h2 "Inputs"
173
+ opt_columns = [
174
+ {"ID" => lambda {|it| it['id'] } },
175
+ {"NAME" => lambda {|it| it['name'] } },
176
+ {"TYPE" => lambda {|it| it['type'] } },
177
+ {"FIELD NAME" => lambda {|it| it['fieldName'] } },
178
+ {"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
179
+ {"DEFAULT" => lambda {|it| it['defaultValue'] } },
180
+ {"REQUIRED" => lambda {|it| format_boolean it['required'] } },
181
+ ]
182
+ print as_pretty_table(catalog_item_type['optionTypes'], opt_columns)
183
+ else
184
+ # print cyan,"No option types found for this catalog item.","\n",reset
185
+ end
186
+
187
+ item_type_code = catalog_item_type['type'].to_s.downcase
188
+ if options[:no_config] != true
189
+ if item_type_code == 'instance'
190
+ print_h2 "Config JSON"
191
+
192
+ #print reset,(JSON.pretty_generate(config) rescue config),"\n",reset
193
+ #print reset,(as_yaml(config, options) rescue config),"\n",reset
194
+ config_string = catalog_item_type['instanceSpec'] || (as_json(catalog_item_type['config'], options) rescue "")
195
+ config_lines = config_string.split("\n")
196
+ config_line_count = config_lines.size
197
+ max_lines = 10
198
+ if config_lines.size > max_lines
199
+ config_string = config_lines.first(max_lines).join("\n")
200
+ config_string << "\n\n"
201
+ config_string << "#{dark}(#{(config_line_count - max_lines)} more lines were not shown, use -c to show the config)#{reset}"
202
+ #config_string << "\n"
203
+ end
204
+ # strip --- yaml header
205
+ if config_string[0..3] == "---\n"
206
+ config_string = config_string[4..-1]
207
+ end
208
+ print reset,config_string.chomp("\n"),"\n",reset
209
+
210
+ elsif item_type_code == 'blueprint' || item_type_code == 'apptemplate' || item_type_code == 'app'
211
+ print_h2 "App Spec"
212
+ if catalog_item_type['appSpec']
213
+ #print reset,(JSON.pretty_generate(config) rescue config),"\n",reset
214
+ #print reset,(as_yaml(config, options) rescue config),"\n",reset
215
+ config_string = catalog_item_type['appSpec'] || ""
216
+ config_lines = config_string.split("\n")
217
+ config_line_count = config_lines.size
218
+ max_lines = 10
219
+ if config_lines.size > max_lines
220
+ config_string = config_lines.first(max_lines).join("\n")
221
+ config_string << "\n\n"
222
+ config_string << "#{dark}(#{(config_line_count - max_lines)} more lines were not shown, use -c to show the config)#{reset}"
223
+ #config_string << "\n"
224
+ end
225
+ # strip --- yaml header
226
+ if config_string[0..3] == "---\n"
227
+ config_string = config_string[4..-1]
228
+ end
229
+ print reset,config_string.chomp("\n"),"\n",reset
230
+ else
231
+ print reset,"(blank)","\n",reset
232
+ end
233
+ elsif item_type_code == 'workflow' || item_type_code == 'operationalworkflow' || item_type_code == 'taskset'
234
+ print_h2 "Workflow Config"
235
+ if catalog_item_type['workflowConfig']
236
+ #print reset,(JSON.pretty_generate(config) rescue config),"\n",reset
237
+ #print reset,(as_yaml(config, options) rescue config),"\n",reset
238
+ config_string = catalog_item_type['workflowConfig'] || ""
239
+ config_lines = config_string.split("\n")
240
+ config_line_count = config_lines.size
241
+ max_lines = 10
242
+ if config_lines.size > max_lines
243
+ config_string = config_lines.first(max_lines).join("\n")
244
+ config_string << "\n\n"
245
+ config_string << "#{dark}(#{(config_line_count - max_lines)} more lines were not shown, use -c to show the config)#{reset}"
246
+ end
247
+ print reset,config_string.chomp("\n"),"\n",reset
248
+ else
249
+ print reset,"(blank)","\n",reset
250
+ end
251
+ end
252
+ end
253
+
254
+ # Content (Wiki Page)
255
+ if !catalog_item_type["content"].to_s.empty? && options[:no_content] != true
256
+ print_h2 "Content"
257
+ print reset,catalog_item_type["content"].chomp("\n"),"\n",reset
258
+ end
259
+
260
+ print reset,"\n"
261
+ end
262
+ return 0, nil
263
+ end
264
+
265
+ def add(args)
266
+ options = {:option_types => add_catalog_item_type_option_types}
267
+ params = {}
268
+ logo_file = nil
269
+ dark_logo_file = nil
270
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
271
+ opts.banner = subcommand_usage("[name] [options]")
272
+ # opts.on('-t', '--type [instance|blueprint|workflow]', "Item Type, default is instance.") do |val|
273
+ # # params['type'] = val.to_s.downcase
274
+ # options[:options]['type'] = val.to_s.downcase
275
+ # end
276
+ build_option_type_options(opts, options, add_catalog_item_type_option_types)
277
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
278
+ options[:options]['labels'] = parse_labels(val)
279
+ end
280
+ opts.on('--logo FILE', String, "Upload a custom logo icon") do |val|
281
+ filename = val
282
+ logo_file = nil
283
+ if filename == 'null'
284
+ logo_file = 'null' # clear it
285
+ else
286
+ filename = File.expand_path(filename)
287
+ if !File.exist?(filename)
288
+ raise_command_error "File not found: #{filename}"
289
+ end
290
+ logo_file = File.new(filename, 'rb')
291
+ end
292
+ end
293
+ opts.on('--dark-logo FILE', String, "Upload a custom dark logo icon") do |val|
294
+ filename = val
295
+ dark_logo_file = nil
296
+ if filename == 'null'
297
+ dark_logo_file = 'null' # clear it
298
+ else
299
+ filename = File.expand_path(filename)
300
+ if !File.exist?(filename)
301
+ raise_command_error "File not found: #{filename}"
302
+ end
303
+ dark_logo_file = File.new(filename, 'rb')
304
+ end
305
+ end
306
+ opts.on('--config-file FILE', String, "Config from a local JSON or YAML file") do |val|
307
+ options[:config_file] = val.to_s
308
+ file_content = nil
309
+ full_filename = File.expand_path(options[:config_file])
310
+ if File.exist?(full_filename)
311
+ file_content = File.read(full_filename)
312
+ else
313
+ print_red_alert "File not found: #{full_filename}"
314
+ return 1
315
+ end
316
+ parse_result = parse_json_or_yaml(file_content)
317
+ config_map = parse_result[:data]
318
+ if config_map.nil?
319
+ params['config'] = file_content
320
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse config as JSON or YAML. Defaulting to String."
321
+ else
322
+ params['config'] = config_map
323
+ options[:options]['config'] = params['config'] # or file_content
324
+ end
325
+ end
326
+ opts.on('--form-type form|optionTypes', String, "Form Type determines if input comes from a Form or list of Option Types") do |val|
327
+ params['formType'] = val
328
+ end
329
+ opts.on('--form FORM', String, "Form Name or ID") do |val|
330
+ params['form'] = val
331
+ end
332
+ opts.on('--option-types [x,y,z]', Array, "List of Option Type IDs") do |val|
333
+ if list.nil?
334
+ params['optionTypes'] = []
335
+ else
336
+ params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
337
+ end
338
+ end
339
+ opts.on('--optionTypes [x,y,z]', Array, "List of Option Type IDs") do |list|
340
+ if list.nil?
341
+ params['optionTypes'] = []
342
+ else
343
+ params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
344
+ end
345
+ end
346
+ opts.add_hidden_option('--optionTypes')
347
+ build_option_type_options(opts, options, add_catalog_item_type_advanced_option_types)
348
+ build_standard_add_options(opts, options)
349
+ opts.footer = <<-EOT
350
+ Create a new catalog item type.
351
+ EOT
352
+ end
353
+ optparse.parse!(args)
354
+ verify_args!(args:args, optparse:optparse, min:0, max:1)
355
+ options[:options]['name'] = args[0] if args[0]
356
+ connect(options)
357
+ payload = {}
358
+ if options[:payload]
359
+ payload = options[:payload]
360
+ payload.deep_merge!({catalog_item_type_object_key => parse_passed_options(options)})
361
+ else
362
+ payload.deep_merge!({catalog_item_type_object_key => parse_passed_options(options)})
363
+ # Type prompt first
364
+ #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']
365
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(add_catalog_item_type_option_types(), options[:options], @api_client, options[:params])
366
+ params.deep_merge!(v_prompt)
367
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(add_catalog_item_type_advanced_option_types, options[:options], @api_client, options[:params])
368
+ advanced_config.deep_compact!
369
+ params.deep_merge!(advanced_config)
370
+ # convert checkbox "on" and "off" to true and false
371
+ params.booleanize!
372
+ # convert type to refType until api accepts type
373
+ # if params['type'] && !params['refType']
374
+ # if params['type'].to_s.downcase == 'instance'
375
+ # params['refType'] = 'InstanceType'
376
+ # elsif params['type'].to_s.downcase == 'blueprint'
377
+ # params['refType'] = 'AppTemplate'
378
+ # elsif params['type'].to_s.downcase == 'workflow'
379
+ # params['refType'] = 'OperationalWorkflow'
380
+ # end
381
+ # end
382
+ # convert config string to a map
383
+ config = params['config']
384
+ if config && config.is_a?(String)
385
+ parse_result = parse_json_or_yaml(config)
386
+ config_map = parse_result[:data]
387
+ if config_map.nil?
388
+ params['config'] = config
389
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse config as JSON or YAML. Defaulting to String."
390
+ else
391
+ params['config'] = config_map
392
+ end
393
+ end
394
+ # massage association params a bit
395
+ params['workflow'] = {'id' => params['workflow']} if params['workflow'] && !params['workflow'].is_a?(Hash)
396
+ params['blueprint'] = {'id' => params['blueprint']} if params['blueprint'] && !params['blueprint'].is_a?(Hash)
397
+ if params['formType'].to_s.empty?
398
+ params['formType'] = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'formType', 'fieldLabel' => 'Form Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Form', 'value' => 'form'}, {'name' => 'Inputs', 'value' => 'optionTypes'}], 'defaultValue' => 'optionTypes', 'required' => true}], options[:options], @api_client, options[:params])['formType']
399
+ end
400
+ if params['formType'] == 'form'
401
+ # using formType = 'form'
402
+ # prompt for Form
403
+ options[:options]['form'] = params['form'] if params['form']
404
+ form_id = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'form', 'fieldLabel' => 'Form', 'type' => 'select', 'optionSource' => 'forms', 'required' => true}], options[:options], @api_client, options[:params])['form']
405
+ params['form'] = {'id' => form_id}
406
+ else
407
+ # using formType = 'optionTypes'
408
+ # prompt for Option Types
409
+ prompt_results = prompt_for_option_types(params, options, @api_client)
410
+ if prompt_results[:success]
411
+ params['optionTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
412
+ else
413
+ return 1, "failed to parse optionTypes"
414
+ end
415
+ end
416
+ payload[catalog_item_type_object_key].deep_merge!(params)
417
+ end
418
+ @catalog_item_types_interface.setopts(options)
419
+ if options[:dry_run]
420
+ print_dry_run @catalog_item_types_interface.dry.create(payload)
421
+ return 0, nil
422
+ end
423
+ json_response = @catalog_item_types_interface.create(payload)
424
+ if json_response['success']
425
+ if logo_file || dark_logo_file
426
+ begin
427
+ @catalog_item_types_interface.update_logo(json_response['catalogItemType']['id'], logo_file, dark_logo_file)
428
+ rescue RestClient::Exception => e
429
+ print_red_alert "Failed to save logo!"
430
+ print_rest_exception(e, options)
431
+ end
432
+ end
433
+ end
434
+ catalog_item_type = json_response[catalog_item_type_object_key]
435
+ render_response(json_response, options, catalog_item_type_object_key) do
436
+ print_green_success "Added catalog item type #{catalog_item_type['name']}"
437
+ return _get(catalog_item_type["id"], {}, options)
438
+ end
439
+ return 0, nil
440
+ end
441
+
442
+ def update(args)
443
+ options = {}
444
+ params = {}
445
+ payload = {}
446
+ logo_file = nil
447
+ dark_logo_file = nil
448
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
449
+ opts.banner = subcommand_usage("[type] [options]")
450
+ build_option_type_options(opts, options, update_catalog_item_type_option_types)
451
+ opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
452
+ options[:options]['labels'] = parse_labels(val)
453
+ end
454
+ opts.on('--config-file FILE', String, "Config from a local JSON or YAML file") do |val|
455
+ options[:config_file] = val.to_s
456
+ file_content = nil
457
+ full_filename = File.expand_path(options[:config_file])
458
+ if File.exist?(full_filename)
459
+ file_content = File.read(full_filename)
460
+ else
461
+ print_red_alert "File not found: #{full_filename}"
462
+ return 1
463
+ end
464
+ parse_result = parse_json_or_yaml(file_content)
465
+ config_map = parse_result[:data]
466
+ if config_map.nil?
467
+ params['config'] = file_content
468
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse config as JSON or YAML. Defaulting to String."
469
+ else
470
+ params['config'] = config_map
471
+ options[:options]['config'] = params['config'] # or file_content
472
+ end
473
+ end
474
+ opts.on('--form-type form|optionTypes', String, "Form Type determines if input comes from a Form or list of Option Types") do |val|
475
+ params['formType'] = val
476
+ end
477
+ opts.on('--form FORM', String, "Form Name or ID") do |val|
478
+ params['form'] = val
479
+ end
480
+ opts.on('--option-types [x,y,z]', Array, "List of Option Type IDs") do |list|
481
+ if list.nil?
482
+ params['optionTypes'] = []
483
+ else
484
+ params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
485
+ end
486
+ end
487
+ opts.on('--optionTypes [x,y,z]', Array, "List of Option Type IDs") do |list|
488
+ if list.nil?
489
+ params['optionTypes'] = []
490
+ else
491
+ params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
492
+ end
493
+ end
494
+ opts.add_hidden_option('--optionTypes')
495
+ build_option_type_options(opts, options, update_catalog_item_type_advanced_option_types)
496
+ build_standard_update_options(opts, options)
497
+ opts.footer = <<-EOT
498
+ Update a catalog item type.
499
+ [type] is required. This is the name or id of a catalog item type.
500
+ EOT
501
+ end
502
+ optparse.parse!(args)
503
+ verify_args!(args:args, optparse:optparse, count:1)
504
+ connect(options)
505
+ catalog_item_type = find_catalog_item_type_by_name_or_id(args[0])
506
+ return 1 if catalog_item_type.nil?
507
+ payload = {}
508
+ if options[:payload]
509
+ payload = options[:payload]
510
+ payload.deep_merge!({catalog_item_type_object_key => parse_passed_options(options)})
511
+ else
512
+ payload.deep_merge!({catalog_item_type_object_key => parse_passed_options(options)})
513
+ # do not prompt on update
514
+ v_prompt = MtnCloud::Cli::OptionTypes.no_prompt(update_catalog_item_type_option_types, options[:options], @api_client, options[:params])
515
+ v_prompt.deep_compact!
516
+ params.deep_merge!(v_prompt)
517
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(update_catalog_item_type_advanced_option_types, options[:options], @api_client, options[:params])
518
+ advanced_config.deep_compact!
519
+ params.deep_merge!(advanced_config)
520
+ # convert checkbox "on" and "off" to true and false
521
+ params.booleanize!
522
+
523
+ # convert config string to a map
524
+ config = params['config']
525
+ if config && config.is_a?(String)
526
+ parse_result = parse_json_or_yaml(config)
527
+ config_map = parse_result[:data]
528
+ if config_map.nil?
529
+ params['config'] = config
530
+ MtnCloud::Logging::DarkPrinter.puts "Failed to parse config as JSON or YAML. Defaulting to String."
531
+ else
532
+ params['config'] = config_map
533
+ end
534
+ end
535
+ if params['optionTypes']
536
+ # todo: move to optionSource, so it will be /api/options/optionTypes lol
537
+ prompt_results = prompt_for_option_types(params, options, @api_client)
538
+ if prompt_results[:success]
539
+ params['optionTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
540
+ else
541
+ return 1, "failed to parse optionTypes"
542
+ end
543
+ end
544
+ # massage association params a bit
545
+ params['workflow'] = {'id' => params['workflow']} if params['workflow'] && !params['workflow'].is_a?(Hash)
546
+ params['blueprint'] = {'id' => params['blueprint']} if params['blueprint'] && !params['blueprint'].is_a?(Hash)
547
+ payload.deep_merge!({catalog_item_type_object_key => params})
548
+ if payload[catalog_item_type_object_key].empty? && (!logo_file && !dark_logo_file)# || options[:no_prompt]
549
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
550
+ end
551
+ end
552
+ @catalog_item_types_interface.setopts(options)
553
+ if options[:dry_run]
554
+ print_dry_run @catalog_item_types_interface.dry.update(catalog_item_type['id'], payload)
555
+ return
556
+ end
557
+ json_response = @catalog_item_types_interface.update(catalog_item_type['id'], payload)
558
+ if json_response['success']
559
+ if logo_file || dark_logo_file
560
+ begin
561
+ @catalog_item_types_interface.update_logo(json_response['catalogItemType']['id'], logo_file, dark_logo_file)
562
+ rescue RestClient::Exception => e
563
+ print_red_alert "Failed to save logo!"
564
+ print_rest_exception(e, options)
565
+ end
566
+ end
567
+ end
568
+ catalog_item_type = json_response[catalog_item_type_object_key]
569
+ render_response(json_response, options, catalog_item_type_object_key) do
570
+ print_green_success "Updated catalog item type #{catalog_item_type['name']}"
571
+ return _get(catalog_item_type["id"], {}, options)
572
+ end
573
+ return 0, nil
574
+ end
575
+
576
+ def update_logo(args)
577
+ options = {}
578
+ params = {}
579
+ filename = nil
580
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
581
+ opts.banner = subcommand_usage("[type] [file]")
582
+ build_common_options(opts, options, [:json, :dry_run, :remote])
583
+ opts.footer = "Update the logo for a catalog item type." + "\n" +
584
+ "[type] is required. This is the name or id of a catalog item type." + "\n" +
585
+ "[file] is required. This is the path of the logo file"
586
+ end
587
+ optparse.parse!(args)
588
+ verify_args!(args:args, optparse:optparse, count:2)
589
+ connect(options)
590
+ catalog_item_type = find_catalog_item_type_by_name_or_id(args[0])
591
+ return 1 if catalog_item_type.nil?
592
+ filename = args[1]
593
+ logo_file = nil
594
+ if filename == 'null'
595
+ logo_file = 'null' # clear it
596
+ else
597
+ filename = File.expand_path(filename)
598
+ if !File.exist?(filename)
599
+ raise_command_error "File not found: #{filename}"
600
+ end
601
+ logo_file = File.new(filename, 'rb')
602
+ end
603
+ @catalog_item_types_interface.setopts(options)
604
+ if options[:dry_run]
605
+ print_dry_run @catalog_item_types_interface.dry.update_logo(catalog_item_type['id'], logo_file)
606
+ return
607
+ end
608
+ json_response = @catalog_item_types_interface.update_logo(catalog_item_type['id'], logo_file)
609
+ render_response(json_response, options, catalog_item_type_object_key) do
610
+ print_green_success "Updated catalog item type #{catalog_item_type['name']} logo"
611
+ return _get(catalog_item_type["id"], {}, options)
612
+ end
613
+ end
614
+
615
+ def update_dark_logo(args)
616
+ options = {}
617
+ params = {}
618
+ filename = nil
619
+ optparse = MtnCloud::Cli::OptionParser.new do|opts|
620
+ opts.banner = subcommand_usage("[type] [file]")
621
+ build_common_options(opts, options, [:json, :dry_run, :remote])
622
+ opts.footer = "Update the dark logo for a catalog item type." + "\n" +
623
+ "[type] is required. This is the name or id of a catalog item type." + "\n" +
624
+ "[file] is required. This is the path of the dark logo file"
625
+ end
626
+ optparse.parse!(args)
627
+ verify_args!(args:args, optparse:optparse, count:2)
628
+ connect(options)
629
+ catalog_item_type = find_catalog_item_type_by_name_or_id(args[0])
630
+ return 1 if catalog_item_type.nil?
631
+ filename = args[1]
632
+ dark_logo_file = nil
633
+ if filename == 'null'
634
+ dark_logo_file = 'null' # clear it
635
+ else
636
+ filename = File.expand_path(filename)
637
+ if !File.exist?(filename)
638
+ raise_command_error "File not found: #{filename}"
639
+ end
640
+ dark_logo_file = File.new(filename, 'rb')
641
+ end
642
+ @catalog_item_types_interface.setopts(options)
643
+ if options[:dry_run]
644
+ print_dry_run @catalog_item_types_interface.dry.update_logo(catalog_item_type['id'], nil, dark_logo_file)
645
+ return
646
+ end
647
+ json_response = @catalog_item_types_interface.update_logo(catalog_item_type['id'], nil, dark_logo_file)
648
+ render_response(json_response, options, catalog_item_type_object_key) do
649
+ print_green_success "Updated catalog item type #{catalog_item_type['name']} logo"
650
+ return _get(catalog_item_type["id"], {}, options)
651
+ end
652
+ end
653
+
654
+ def remove(args)
655
+ options = {}
656
+ params = {}
657
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
658
+ opts.banner = subcommand_usage("[type] [options]")
659
+ build_standard_remove_options(opts, options)
660
+ opts.footer = <<-EOT
661
+ Delete a catalog item type.
662
+ [type] is required. This is the name or id of a catalog item type.
663
+ EOT
664
+ end
665
+ optparse.parse!(args)
666
+ verify_args!(args:args, optparse:optparse, count:1)
667
+ connect(options)
668
+ catalog_item_type = find_catalog_item_type_by_name_or_id(args[0])
669
+ return 1 if catalog_item_type.nil?
670
+ @catalog_item_types_interface.setopts(options)
671
+ if options[:dry_run]
672
+ print_dry_run @catalog_item_types_interface.dry.destroy(catalog_item_type['id'], params)
673
+ return
674
+ end
675
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the catalog item type #{catalog_item_type['name']}?")
676
+ return 9, "aborted command"
677
+ end
678
+ json_response = @catalog_item_types_interface.destroy(catalog_item_type['id'], params)
679
+ render_response(json_response, options) do
680
+ print_green_success "Removed catalog item type #{catalog_item_type['name']}"
681
+ end
682
+ return 0, nil
683
+ end
684
+
685
+ private
686
+
687
+ def catalog_item_type_list_column_definitions()
688
+ {
689
+ "ID" => 'id',
690
+ "Name" => 'name',
691
+ "Code" => 'code',
692
+ "Category" => 'category',
693
+ "Labels" => lambda {|it| format_list(it['labels'], '', 3) },
694
+ "Description" => 'description',
695
+ "Type" => lambda {|it| format_catalog_type(it) },
696
+ "Visibility" => 'visibility',
697
+ #"Layout Code" => 'layoutCode',
698
+ "Blueprint" => lambda {|it| it['blueprint'] ? it['blueprint']['name'] : nil },
699
+ "Workflow" => lambda {|it| it['workflow'] ? it['workflow']['name'] : nil },
700
+ # "Context" => lambda {|it| it['context'] },
701
+ # "Content" => lambda {|it| it['content'] },
702
+ "Form Type" => lambda {|it| it['formType'] == 'form' ? "Form" : "Inputs" },
703
+ "Form" => lambda {|it| it['form'] ? it['form']['name'] : nil },
704
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
705
+ "Featured" => lambda {|it| format_boolean(it['featured']) },
706
+ #"Config" => lambda {|it| it['config'] },
707
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
708
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
709
+ }
710
+ end
711
+
712
+ def catalog_item_type_column_definitions()
713
+ {
714
+ "ID" => 'id',
715
+ "Name" => 'name',
716
+ "Labels" => lambda {|it| format_list(it['labels']) },
717
+ "Description" => 'description',
718
+ "Code" => 'code',
719
+ "Category" => 'category',
720
+ "Type" => lambda {|it| format_catalog_type(it) },
721
+ "Visibility" => 'visibility',
722
+ "Layout Code" => 'layoutCode',
723
+ "Blueprint" => lambda {|it| it['blueprint'] ? it['blueprint']['name'] : nil },
724
+ "Workflow" => lambda {|it| it['workflow'] ? it['workflow']['name'] : nil },
725
+ "Context" => lambda {|it| it['context'] },
726
+ # "Content" => lambda {|it| it['content'] },
727
+ "Form Type" => lambda {|it| it['formType'] == 'form' ? "Form" : "Inputs" },
728
+ "Form" => lambda {|it| it['form'] ? it['form']['name'] : nil },
729
+ "Enabled" => lambda {|it| format_boolean(it['enabled']) },
730
+ "Featured" => lambda {|it| format_boolean(it['featured']) },
731
+ "Allow Quantity" => lambda {|it| format_boolean(it['allowQuantity']) },
732
+ #"Config" => lambda {|it| it['config'] },
733
+ "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
734
+ "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
735
+ }
736
+ end
737
+
738
+ def format_catalog_type(catalog_item_type)
739
+ out = ""
740
+ # api "blueprint": {"name":my blueprint"} }
741
+ # instead of cryptic refType
742
+ if catalog_item_type['type']
743
+ if catalog_item_type['type'].is_a?(String)
744
+ out << catalog_item_type['type'].to_s.capitalize
745
+ else
746
+ out << (catalog_item_type['type']['name'] || catalog_item_type['type']['code']) rescue catalog_item_type['type'].to_s
747
+ end
748
+ else
749
+ # refType is not returned
750
+ ref_type = catalog_item_type['refType']
751
+ if ref_type == 'InstanceType'
752
+ out << "Instance"
753
+ elsif ref_type == 'AppTemplate'
754
+ out << "Blueprint"
755
+ elsif ref_type
756
+ out << ref_type
757
+ else
758
+ "(none)"
759
+ end
760
+ end
761
+ out
762
+ end
763
+
764
+ def add_catalog_item_type_option_types
765
+ [
766
+ {'code' => 'catalogItemType.type', 'shorthand' => '-t', 'fieldName' => 'type', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Instance', 'value' => 'instance'}, {'name' => 'Blueprint', 'value' => 'blueprint'}, {'name' => 'Workflow', 'value' => 'workflow'}], 'defaultValue' => 'instance', 'required' => true, 'displayOrder' => 1},
767
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 2},
768
+ {'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'displayOrder' => 3},
769
+ {'fieldName' => 'category', 'fieldLabel' => 'Category', 'type' => 'text', 'displayOrder' => 3.5},
770
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 4},
771
+ {'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true, 'displayOrder' => 5},
772
+ {'fieldName' => 'featured', 'fieldLabel' => 'Featured', 'type' => 'checkbox', 'defaultValue' => false, 'displayOrder' => 6},
773
+ {'fieldName' => 'allowQuantity', 'fieldLabel' => 'Allow Quantity', 'type' => 'checkbox', 'defaultValue' => false, 'displayOrder' => 7},
774
+ {'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'required' => true, 'displayOrder' => 8},
775
+ {'fieldName' => 'layoutCode', 'fieldLabel' => 'Layout Code', 'type' => 'text', 'required' => false, 'displayOrder' => 9},
776
+ {'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => 'iconList', 'displayOrder' => 10},
777
+ #{'fieldName' => 'optionTypes', 'fieldLabel' => 'Option Types', 'type' => 'text', 'description' => 'Option Types to include, comma separated list of names or IDs.', 'displayOrder' => 8},
778
+ {'dependsOnCode' => 'catalogItemType.type:instance', 'fieldName' => 'config', 'fieldLabel' => 'Config', 'type' => 'code-editor', 'description' => 'JSON or YAML', 'required' => true, 'displayOrder' => 11},
779
+ {'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'workflowConfig', 'fieldLabel' => 'Config', 'type' => 'textarea', 'description' => 'Enter configuration for the Workflow', 'required' => false, 'noParse' => true, 'displayOrder' => 11},
780
+ {'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'blueprint', 'fieldLabel' => 'Blueprint', 'type' => 'select', 'optionSource' => 'blueprints', 'description' => 'Choose a blueprint to apply to the catalog item.', 'required' => true, 'noParams' => true, 'displayOrder' => 12},
781
+ {'dependsOnCode' => 'catalogItemType.type:blueprint', 'fieldName' => 'appSpec', 'fieldLabel' => 'App Spec', 'type' => 'code-editor', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'required' => true, 'displayOrder' => 13},
782
+ {'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'workflow', 'fieldLabel' => 'Workflow', 'type' => 'select', 'optionSource' => 'operationWorkflows', 'description' => 'Enter a spec in the for the App, the Scribe YAML format', 'required' => true, 'noParams' => true, 'displayOrder' => 14},
783
+ {'dependsOnCode' => 'catalogItemType.type:workflow', 'fieldName' => 'context', 'fieldLabel' => 'Context Type', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
784
+ [{'name' => "Select", 'value' => ""}, {'name' => "None", 'value' => "appliance"}, {'name' => "Instance", 'value' => "instance"}, {'name' => "Server", 'value' => "server"}]
785
+ }, 'description' => 'Context for operational workflow, determines target type', 'defaultValue' => 'Select', 'required' => false},
786
+ {'fieldName' => 'content', 'fieldLabel' => 'Content', 'type' => 'code-editor', 'description' => 'Wiki Page Content describing the catalog item', 'displayOrder' => 15}
787
+ ]
788
+ end
789
+
790
+ def add_catalog_item_type_advanced_option_types
791
+ []
792
+ end
793
+
794
+ def update_catalog_item_type_option_types
795
+ list = add_catalog_item_type_option_types.collect {|it|
796
+ it.delete('required')
797
+ it.delete('defaultValue')
798
+ it
799
+ }
800
+ list = list.reject {|it| ["type"].include? it['fieldName'] }
801
+ list
802
+ end
803
+
804
+ def update_catalog_item_type_advanced_option_types
805
+ add_catalog_item_type_advanced_option_types.collect {|it|
806
+ it.delete('required')
807
+ it.delete('defaultValue')
808
+ it
809
+ }
810
+ end
811
+
812
+ def catalog_item_type_object_key
813
+ 'catalogItemType'
814
+ end
815
+
816
+ def catalog_item_type_list_key
817
+ 'catalogItemTypes'
818
+ end
819
+
820
+ def find_catalog_item_type_by_name_or_id(val)
821
+ if val.to_s =~ /\A\d{1,}\Z/
822
+ return find_catalog_item_type_by_id(val)
823
+ else
824
+ return find_catalog_item_type_by_name(val)
825
+ end
826
+ end
827
+
828
+ def find_catalog_item_type_by_id(id)
829
+ begin
830
+ json_response = @catalog_item_types_interface.get(id.to_i)
831
+ return json_response[catalog_item_type_object_key]
832
+ rescue RestClient::Exception => e
833
+ if e.response && e.response.code == 404
834
+ print_red_alert "catalog item type not found by id '#{id}'"
835
+ else
836
+ raise e
837
+ end
838
+ end
839
+ end
840
+
841
+ def find_catalog_item_type_by_name(name)
842
+ json_response = @catalog_item_types_interface.list({name: name.to_s})
843
+ catalog_item_types = json_response[catalog_item_type_list_key]
844
+ if catalog_item_types.empty?
845
+ print_red_alert "catalog item type not found by name '#{name}'"
846
+ return nil
847
+ elsif catalog_item_types.size > 1
848
+ print_red_alert "#{catalog_item_types.size} catalog item types found by name '#{name}'"
849
+ puts_error as_pretty_table(catalog_item_types, [:id, :name], {color:red})
850
+ print_red_alert "Try using ID instead"
851
+ print reset,"\n"
852
+ return nil
853
+ else
854
+ return catalog_item_types[0]
855
+ end
856
+ end
857
+
858
+ end