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,990 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::PoliciesCommand
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::InfrastructureHelper
6
+ include MtnCloud::Cli::AccountsHelper
7
+
8
+ set_command_name :policies
9
+
10
+ register_subcommands :list, :get, :add, :update, :remove #, :generate_pool
11
+ register_subcommands :'list-types' => :list_types
12
+ register_subcommands :'get-type' => :get_type
13
+
14
+ # set_default_subcommand :list
15
+
16
+ def initialize()
17
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
18
+ end
19
+
20
+ def connect(opts)
21
+ @api_client = establish_remote_appliance_connection(opts)
22
+ @policies_interface = @api_client.policies
23
+ @group_policies_interface = @api_client.group_policies
24
+ @cloud_policies_interface = @api_client.cloud_policies
25
+ @clouds_interface = @api_client.clouds
26
+ @groups_interface = @api_client.groups
27
+ @account_users_interface = @api_client.account_users
28
+ @roles_interface = @api_client.roles
29
+ @active_group_id = MtnCloud::Cli::Groups.active_groups[@appliance_name]
30
+ end
31
+
32
+ def handle(args)
33
+ handle_subcommand(args)
34
+ end
35
+
36
+ def list(args)
37
+ options = {}
38
+ params = {}
39
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
40
+ opts.banner = subcommand_usage()
41
+ opts.on( '-g', '--group GROUP', "Group Name or ID" ) do |val|
42
+ options[:group] = val
43
+ end
44
+ opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID" ) do |val|
45
+ options[:cloud] = val
46
+ end
47
+ opts.on( '-u', '--user USER', "Username or ID" ) do |val|
48
+ options[:user] = val
49
+ end
50
+ opts.on( '--role ROLE', String, "Role Authority or ID" ) do |val|
51
+ options[:role] = val
52
+ end
53
+ opts.on( '-G', '--global', "Global policies only" ) do
54
+ params[:global] = true
55
+ end
56
+ build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
57
+ opts.footer = "List policies."
58
+ end
59
+ optparse.parse!(args)
60
+ connect(options)
61
+ begin
62
+ group, cloud, user = nil, nil, nil
63
+ if options[:group]
64
+ group = find_group_by_name_or_id(options[:group])
65
+ elsif options[:cloud]
66
+ cloud = find_cloud_by_name_or_id(options[:cloud])
67
+ elsif options[:user]
68
+ user = find_user_by_username_or_id(nil, options[:user])
69
+ return 1 if user.nil?
70
+ elsif options[:role]
71
+ role = find_role_by_name_or_id(nil, options[:role])
72
+ return 1 if role.nil?
73
+ end
74
+ params.merge!(parse_list_options(options))
75
+ if user
76
+ params['refType'] = 'User'
77
+ params['refId'] = user['id']
78
+ end
79
+ if role
80
+ params['refType'] = 'Role'
81
+ params['refId'] = role['id']
82
+ end
83
+ @policies_interface.setopts(options)
84
+ @group_policies_interface.setopts(options)
85
+ @cloud_policies_interface.setopts(options)
86
+ if options[:dry_run]
87
+ if group
88
+ print_dry_run @group_policies_interface.dry.list(group['id'], params)
89
+ elsif cloud
90
+ print_dry_run @cloud_policies_interface.dry.list(cloud['id'], params)
91
+ else
92
+ print_dry_run @policies_interface.dry.list(params)
93
+ end
94
+ return 0
95
+ end
96
+ json_response = nil
97
+ if group
98
+ json_response = @group_policies_interface.list(group['id'], params)
99
+ elsif cloud
100
+ json_response = @cloud_policies_interface.list(cloud['id'], params)
101
+ else
102
+ json_response = @policies_interface.list(params)
103
+ end
104
+ policies = json_response["policies"]
105
+ if options[:json]
106
+ puts as_json(json_response, options, "policies")
107
+ return 0
108
+ elsif options[:yaml]
109
+ puts as_yaml(json_response, options, "policies")
110
+ return 0
111
+ elsif options[:csv]
112
+ puts records_as_csv(policies, options)
113
+ return 0
114
+ end
115
+ title = "Policies"
116
+ subtitles = []
117
+ if group
118
+ subtitles << "Group: #{group['name']}".strip
119
+ end
120
+ if cloud
121
+ subtitles << "Cloud: #{cloud['name']}".strip
122
+ end
123
+ if user
124
+ subtitles << "User: #{user['username']}".strip
125
+ end
126
+ if role
127
+ subtitles << "Role: #{role['authority']}".strip
128
+ end
129
+ if params[:global]
130
+ subtitles << "(Global)".strip
131
+ end
132
+ subtitles += parse_list_subtitles(options)
133
+ print_h1 title, subtitles
134
+ if policies.empty?
135
+ print cyan,"No policies found.",reset,"\n"
136
+ else
137
+ rows = policies.collect {|policy|
138
+ # we got a policy.site and policy.zone now!
139
+ # ref_type, ref_id = policy['refType'], policy['refId']
140
+ # ref_str = ""
141
+ # if ref_type == 'ComputeZone'
142
+ # ref_str = "Cloud #{ref_id}"
143
+ # elsif ref_type == 'ComputeSite'
144
+ # ref_str = "Group #{ref_id}"
145
+ # end
146
+ config_str = JSON.generate(policy['config'] || {})
147
+ row = {
148
+ id: policy['id'],
149
+ name: policy['name'], # always blank right now?
150
+ description: policy['description'], # always blank right now?
151
+ type: policy['policyType'] ? policy['policyType']['name'] : '',
152
+ #for: ref_str,
153
+ group: policy['site'] ? policy['site']['name'] : '',
154
+ cloud: policy['zone'] ? policy['zone']['name'] : '',
155
+ user: policy['user'] ? policy['user']['username'] : '',
156
+ role: policy['role'] ? policy['role']['authority'] : '',
157
+ tenants: truncate_string(format_tenants(policy['accounts']), 15),
158
+ config: truncate_string(config_str, 50),
159
+ enabled: policy['enabled'] ? 'Yes' : 'No',
160
+ }
161
+ row
162
+ }
163
+ columns = [:id, :name, :description, :group, :cloud, :user, :role, :tenants, :type, :config, :enabled]
164
+ if group || cloud || user
165
+ columns = columns - [:group, :cloud, :user]
166
+ end
167
+ if options[:include_fields]
168
+ columns = options[:include_fields]
169
+ end
170
+ print cyan
171
+ print as_pretty_table(rows, columns, options)
172
+ print reset
173
+ print_results_pagination(json_response, {:label => "policy", :n_label => "policies"})
174
+ end
175
+ print reset,"\n"
176
+ return 0
177
+ rescue RestClient::Exception => e
178
+ print_rest_exception(e, options)
179
+ exit 1
180
+ end
181
+ end
182
+
183
+ def get(args)
184
+ options = {}
185
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
186
+ opts.banner = subcommand_usage("[policy]")
187
+ opts.on( '-g', '--group GROUP', "Group Name or ID" ) do |val|
188
+ options[:group] = val
189
+ end
190
+ opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID" ) do |val|
191
+ options[:cloud] = val
192
+ end
193
+ # opts.on( '-u', '--user USER', "Username or ID" ) do |val|
194
+ # options[:user] = val
195
+ # end
196
+ build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
197
+ opts.footer = "Get details about a policy." + "\n" +
198
+ "[policy] is required. This is the id of a policy."
199
+ end
200
+ optparse.parse!(args)
201
+ if args.count != 1
202
+ print_error MtnCloud::Terminal.angry_prompt
203
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
204
+ return 1
205
+ end
206
+ connect(options)
207
+ begin
208
+ group, cloud, user = nil, nil, nil
209
+ if options[:group]
210
+ group = find_group_by_name_or_id(options[:group])
211
+ return 1 if group.nil?
212
+ elsif options[:cloud]
213
+ cloud = find_cloud_by_name_or_id(options[:cloud])
214
+ return 1 if cloud.nil?
215
+ elsif options[:user]
216
+ user = find_user_by_username_or_id(nil, options[:user])
217
+ return 1 if user.nil?
218
+ end
219
+ @policies_interface.setopts(options)
220
+ @group_policies_interface.setopts(options)
221
+ @cloud_policies_interface.setopts(options)
222
+ if options[:dry_run]
223
+ if args[0].to_s =~ /\A\d{1,}\Z/
224
+ if group
225
+ print_dry_run @group_policies_interface.dry.get(group['id'], args[0].to_i)
226
+ elsif cloud
227
+ print_dry_run @cloud_policies_interface.dry.get(cloud['id'], args[0].to_i)
228
+ else
229
+ print_dry_run @policies_interface.dry.get(args[0].to_i)
230
+ end
231
+ else
232
+ if group
233
+ print_dry_run @group_policies_interface.dry.list(group['id'], {name:args[0]})
234
+ elsif cloud
235
+ print_dry_run @cloud_policies_interface.dry.list(cloud['id'], {name:args[0]})
236
+ else
237
+ print_dry_run @policies_interface.dry.list({name:args[0]})
238
+ end
239
+ end
240
+ return
241
+ end
242
+ policy = find_policy_by_name_or_id(args[0], {cloud:cloud,group:group})
243
+ return 1 if policy.nil?
244
+ json_response = {'policy' => policy} # skip redundant request
245
+ # json_response = @policies_interface.get(policy['id'])
246
+ policy = json_response['policy']
247
+ if options[:json]
248
+ puts as_json(json_response, options, "policy")
249
+ return 0
250
+ elsif options[:yaml]
251
+ puts as_yaml(json_response, options, "policy")
252
+ return 0
253
+ elsif options[:csv]
254
+ puts records_as_csv([policy], options)
255
+ return 0
256
+ end
257
+ print_h1 "Policy Details"
258
+ print cyan
259
+ description_cols = {
260
+ "ID" => 'id',
261
+ "Name" => 'name',
262
+ "Description" => 'description',
263
+ "Type" => lambda {|it| it['policyType'] ? it['policyType']['name'] : '' },
264
+ "Group" => lambda {|it| it['site'] ? it['site']['name'] : '' },
265
+ "Cloud" => lambda {|it| it['zone'] ? it['zone']['name'] : '' },
266
+ "User" => lambda {|it| it['user'] ? it['user']['username'] : '' },
267
+ "Role" => lambda {|it|
268
+ str = ""
269
+ if it['role']
270
+ str << it['role']['authority']
271
+ end
272
+ str
273
+ },
274
+ "Each User" => lambda {|it|
275
+ #format_boolean it['eachUser']
276
+ if it['eachUser']
277
+ 'Yes, Apply individually to each user in role'
278
+ else
279
+ 'No'
280
+ end
281
+ },
282
+ # "All Accounts" => lambda {|it| it['allAccounts'] ? 'Yes' : 'No' },
283
+ # "Ref Type" => 'refType',
284
+ # "Ref ID" => 'refId',
285
+ # "Owner" => lambda {|it| it['owner'] ? it['owner']['name'] : '' },
286
+ "Tenants" => lambda {|it| format_tenants(policy["accounts"]) },
287
+ "Enabled" => lambda {|it| it['enabled'] ? 'Yes' : 'No' }
288
+ }
289
+ if policy['site'].nil?
290
+ description_cols.delete("Group")
291
+ end
292
+ if policy['zone'].nil?
293
+ description_cols.delete("Cloud")
294
+ end
295
+ if policy['user'].nil?
296
+ description_cols.delete("User")
297
+ end
298
+ if policy['role'].nil?
299
+ description_cols.delete("Role")
300
+ description_cols.delete("Each User")
301
+ end
302
+ print_description_list(description_cols, policy)
303
+ # print reset,"\n"
304
+
305
+ print_h2 "Policy Config"
306
+ print cyan
307
+ puts as_json(policy['config'])
308
+ print reset, "\n"
309
+ return 0
310
+ rescue RestClient::Exception => e
311
+ print_rest_exception(e, options)
312
+ return 1
313
+ end
314
+ end
315
+
316
+ def add(args)
317
+ options = {}
318
+ policy_type_id = nil
319
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
320
+ opts.banner = subcommand_usage("-t TYPE")
321
+ opts.on( '-g', '--group GROUP', "Group Name or ID, for scoping the policy to a group." ) do |val|
322
+ options[:group] = val
323
+ end
324
+ opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID, for scoping the policy to a cloud" ) do |val|
325
+ options[:cloud] = val
326
+ end
327
+ opts.on( '-u', '--user USER', "Username or ID, for scoping the policy to a user" ) do |val|
328
+ options[:user] = val
329
+ end
330
+ opts.on( '--role ROLE', String, "Role Authority or ID, for scoping the policy to a role" ) do |val|
331
+ options[:role] = val
332
+ end
333
+ opts.on('--each-user [on|off]', String, "Apply individually to each user in role, for use with policy scoped by role.") do |val|
334
+ options['eachUser'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
335
+ end
336
+
337
+ opts.on('-t', '--type ID', "Policy Type Name, Code or ID") do |val|
338
+ options['type'] = val
339
+ end
340
+ opts.on('--name VALUE', String, "Name for this policy") do |val|
341
+ options['name'] = val
342
+ end
343
+ opts.on('--description VALUE', String, "Description of policy") do |val|
344
+ options['description'] = val
345
+ end
346
+ opts.on('--accounts LIST', Array, "Tenant accounts, comma separated list of account IDs") do |list|
347
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
348
+ options['accounts'] = []
349
+ else
350
+ options['accounts'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
351
+ end
352
+ end
353
+ opts.on('--enabled [on|off]', String, "Can be used to disable a policy") do |val|
354
+ options['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
355
+ end
356
+ opts.on('--config JSON', String, "Policy Config JSON") do |val|
357
+ options['config'] = JSON.parse(val.to_s)
358
+ end
359
+ opts.on('--config-yaml YAML', String, "Policy Config YAML") do |val|
360
+ options['config'] = YAML.load(val.to_s)
361
+ end
362
+ opts.on('--config-file FILE', String, "Policy Config from a local JSON or YAML file") do |val|
363
+ options['configFile'] = val.to_s
364
+ end
365
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :quiet, :remote])
366
+ opts.footer = "Create a new policy." + "\n" +
367
+ "[name] is optional and can be passed as --name instead."
368
+ end
369
+ optparse.parse!(args)
370
+ if args.count > 1
371
+ print_error MtnCloud::Terminal.angry_prompt
372
+ puts_error "wrong number of arguments, expected 0-1 and got #{args.count}\n#{optparse}"
373
+ return 1
374
+ end
375
+ connect(options)
376
+ begin
377
+ payload = nil
378
+ if options[:payload]
379
+ payload = options[:payload]
380
+ # support -O OPTION switch on top of --payload
381
+ payload.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
382
+ else
383
+ group, cloud, user, role = nil, nil, nil, nil
384
+ if options[:group]
385
+ group = find_group_by_name_or_id(options[:group])
386
+ elsif options[:cloud]
387
+ cloud = find_cloud_by_name_or_id(options[:cloud])
388
+ elsif options[:user]
389
+ user = find_user_by_username_or_id(nil, options[:user])
390
+ return 1 if user.nil?
391
+ elsif options[:role]
392
+ role = find_role_by_name_or_id(nil, options[:role])
393
+ return 1 if role.nil?
394
+ end
395
+
396
+ # merge -O options into normally parsed options
397
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && options[:options].keys.size > 0
398
+
399
+ # support [name] as first argument
400
+ if args[0]
401
+ options['name'] = args[0]
402
+ end
403
+
404
+ # construct payload
405
+ payload = {
406
+ 'policy' => {
407
+ 'config' => {}
408
+ }
409
+ }
410
+
411
+ # prompt for policy options
412
+
413
+ # Policy Type
414
+ # allow user as id, name or code
415
+ available_policy_types = @policies_interface.list_policy_types({})['policyTypes']
416
+ if available_policy_types.empty?
417
+ print_red_alert "No available policy types found!"
418
+ return 1
419
+ end
420
+ policy_types_dropdown = available_policy_types.collect {|it| {'name' => it['name'], 'value' => it['code'], 'id' => it['id']} }
421
+ policy_type_id = nil
422
+ policy_type = nil
423
+ if options['type']
424
+ policy_type_id = options['type']
425
+ else
426
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Policy Type', 'type' => 'select', 'selectOptions' => policy_types_dropdown, 'required' => true, 'description' => 'Choose a policy type.'}], options[:options])
427
+ policy_type_id = v_prompt['type']
428
+ end
429
+ if !policy_type_id.to_s.empty?
430
+ policy_type = available_policy_types.find {|it|
431
+ it['id'] == policy_type_id.to_i || it['name'] == policy_type_id.to_s || it['code'] == policy_type_id.to_s
432
+ }
433
+ end
434
+ if !policy_type
435
+ print_red_alert "Policy Type not found by id '#{policy_type_id}'"
436
+ return 1
437
+ end
438
+ # payload['policy']['policyTypeId'] = policy_type['id']
439
+ # payload['policy']['policyType'] = {'id' => policy_type['id']}
440
+ payload['policy']['policyType'] = {'code' => policy_type['code']}
441
+
442
+ # Scope
443
+ if user
444
+ payload['policy']['refType'] = 'User'
445
+ payload['policy']['refId'] = user['id']
446
+ elsif role
447
+ payload['policy']['refType'] = 'Role'
448
+ payload['policy']['refId'] = role['id']
449
+ end
450
+
451
+ # Apply To aach user (Role only)
452
+ if payload['policy']['refType'] == 'Role'
453
+ if options['eachUser'] != nil
454
+ payload['policy']['eachUser'] = ['true','on'].include?(options['eachUser'].to_s)
455
+ else
456
+ #ref_apply_dropdown = [{'name' => 'Apply cumulatively to all users in role', 'value' => ''}, {'name' => "Apply individually to each user in role", 'value' => 'user'}]
457
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'eachUser', 'fieldLabel' => 'Apply individually to each user in role', 'type' => 'checkbox', 'required' => false, 'defaultValue' => false, 'Description' => 'Apply individually to each user in role. The default is to apply cumulatively to all users in the role.'}], options)
458
+ payload['policy']['eachUser'] = ['true','on'].include?(v_prompt['eachUser'].to_s)
459
+ end
460
+ end
461
+
462
+ # Name (this is not even used at the moment!)
463
+ if options['name']
464
+ payload['policy']['name'] = options['name']
465
+ else
466
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => false, 'description' => 'Name for this policy.'}], options)
467
+ payload['policy']['name'] = v_prompt['name']
468
+ end
469
+
470
+ # Description (this is not even used at the moment!)
471
+ if options['description']
472
+ payload['policy']['description'] = options['description']
473
+ else
474
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'required' => false, 'description' => 'Description of policy.'}], options)
475
+ payload['policy']['description'] = v_prompt['description']
476
+ end
477
+
478
+ # Enabled
479
+ if options['enabled']
480
+ payload['policy']['enabled'] = options['enabled']
481
+ else
482
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'required' => false, 'description' => 'Can be used to disable a policy', 'defaultValue' => true}], options)
483
+ payload['policy']['enabled'] = v_prompt['enabled']
484
+ end
485
+
486
+ # Tenants
487
+ if options['accounts']
488
+ # payload['policy']['accounts'] = options['accounts'].collect {|it| {'id' => it } }
489
+ payload['policy']['accounts'] = options['accounts']
490
+ else
491
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'accounts', 'fieldLabel' => 'Tenants', 'type' => 'text', 'required' => false, 'description' => 'Tenant accounts, comma separated list of account IDs'}], options)
492
+ payload['policy']['accounts'] = v_prompt['accounts']
493
+ end
494
+
495
+ # Config
496
+ if options['config']
497
+ payload['policy']['config'] = options['config']
498
+ elsif options['configFile']
499
+ config_file = File.expand_path(options['configFile'])
500
+ if !File.exist?(config_file) || !File.file?(config_file)
501
+ print_red_alert "File not found: #{config_file}"
502
+ return false
503
+ end
504
+ if config_file =~ /\.ya?ml\Z/
505
+ payload['policy']['config'] = YAML.load_file(config_file)
506
+ else
507
+ payload['policy']['config'] = JSON.parse(File.read(config_file))
508
+ end
509
+ else
510
+ # prompt for policy specific options
511
+ policy_type_option_types = policy_type['optionTypes']
512
+ # puts "POLICY OPTION TYPES:\n #{policy_type_option_types.inspect}"
513
+ if policy_type_option_types
514
+ config_prompt = MtnCloud::Cli::OptionTypes.prompt(policy_type_option_types, options, @api_client, {}, false, true, true)
515
+ # everything should be under fieldContext:'config'
516
+ # payload['policy'].deep_merge!(config_prompt)
517
+ if config_prompt['config']
518
+ payload['policy']['config'].deep_merge!(config_prompt['config'])
519
+ end
520
+ else
521
+ puts "No options found for policy type! Proceeding without config options..."
522
+ end
523
+ end
524
+ end
525
+
526
+ @policies_interface.setopts(options)
527
+ @group_policies_interface.setopts(options)
528
+ @cloud_policies_interface.setopts(options)
529
+ if options[:dry_run]
530
+ if group
531
+ print_dry_run @group_policies_interface.dry.create(group['id'], payload)
532
+ elsif cloud
533
+ print_dry_run @cloud_policies_interface.dry.create(cloud['id'], payload)
534
+ else
535
+ # global
536
+ print_dry_run @policies_interface.dry.create(payload)
537
+ end
538
+ return
539
+ end
540
+ json_response = nil
541
+ if group
542
+ json_response = @group_policies_interface.create(group['id'], payload)
543
+ elsif cloud
544
+ json_response = @cloud_policies_interface.create(cloud['id'], payload)
545
+ else
546
+ # global
547
+ json_response = @policies_interface.create(payload)
548
+ end
549
+ if options[:json]
550
+ print JSON.pretty_generate(json_response)
551
+ print "\n"
552
+ elsif !options[:quiet]
553
+ print_green_success "Added policy"
554
+ # list([])
555
+ policy = json_response['policy']
556
+ get([policy['id']])
557
+ end
558
+ return 0
559
+ rescue RestClient::Exception => e
560
+ print_rest_exception(e, options)
561
+ exit 1
562
+ end
563
+ end
564
+
565
+ def update(args)
566
+ options = {}
567
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
568
+ opts.banner = subcommand_usage("[policy] [options]")
569
+ # opts.on('-t', '--type ID', "Policy Type Name or ID") do |val|
570
+ # options['type'] = val
571
+ # end
572
+ opts.on('--name VALUE', String, "Name for this policy") do |val|
573
+ options['name'] = val
574
+ end
575
+ opts.on('--description VALUE', String, "Description of policy") do |val|
576
+ options['description'] = val
577
+ end
578
+ opts.on('--accounts LIST', Array, "Tenant accounts, comma separated list of account IDs") do |list|
579
+ if list.size == 1 && list[0] == 'null' # hacky way to clear it
580
+ options['accounts'] = []
581
+ else
582
+ options['accounts'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
583
+ end
584
+ end
585
+ opts.on('--each-user [on|off]', String, "Apply individually to each user in role, for use with policy scoped by role.") do |val|
586
+ options['eachUser'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
587
+ end
588
+ opts.on('--enabled [on|off]', String, "Can be used to disable a policy") do |val|
589
+ options['enabled'] = val.to_s == 'on' || val.to_s == 'true'
590
+ end
591
+ opts.on('--config JSON', String, "Policy Config JSON") do |val|
592
+ options['config'] = JSON.parse(val.to_s)
593
+ end
594
+ opts.on('--config-yaml YAML', String, "Policy Config YAML") do |val|
595
+ options['config'] = YAML.load(val.to_s)
596
+ end
597
+ opts.on('--config-file FILE', String, "Policy Config from a local JSON or YAML file") do |val|
598
+ options['configFile'] = val.to_s
599
+ end
600
+ build_common_options(opts, options, [:options, :json, :dry_run, :remote])
601
+ opts.footer = "Update a policy." + "\n" +
602
+ "[policy] is required. This is the id of a policy."
603
+ end
604
+ optparse.parse!(args)
605
+ if args.count != 1
606
+ print_error MtnCloud::Terminal.angry_prompt
607
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
608
+ return 1
609
+ end
610
+ connect(options)
611
+
612
+ begin
613
+ policy = find_policy_by_name_or_id(args[0])
614
+ return 1 if policy.nil?
615
+ group = policy['site'] || policy['group']
616
+ cloud = policy['zone'] || policy['cloud']
617
+
618
+ payload = {
619
+ 'policy' => {}
620
+ }
621
+
622
+ # no prompting, just collect all user passed options
623
+ params = {}
624
+ params.deep_merge!(options.reject {|k,v| k.is_a?(Symbol) })
625
+ params.deep_merge!(options[:options]) if options[:options]
626
+
627
+ if params.empty?
628
+ print_error MtnCloud::Terminal.angry_prompt
629
+ puts_error "Specify at least one option to update\n#{optparse}"
630
+ return 1
631
+ end
632
+ payload['policy'].deep_merge!(params)
633
+
634
+
635
+ # Config
636
+ if options['config']
637
+ payload['policy']['config'] = options['config']
638
+ elsif options['configFile']
639
+ config_file = File.expand_path(options['configFile'])
640
+ if !File.exist?(config_file) || !File.file?(config_file)
641
+ print_red_alert "File not found: #{config_file}"
642
+ return false
643
+ end
644
+ if config_file =~ /\.ya?ml\Z/
645
+ payload['policy']['config'] = YAML.load_file(config_file)
646
+ else
647
+ payload['policy']['config'] = JSON.parse(File.read(config_file))
648
+ end
649
+ else
650
+ # this allows adding/updating a single config setting.
651
+ # use --config or --configFile to overwrite the entire config
652
+ if policy['config'] && payload['policy']['config']
653
+ payload['policy']['config'] = policy['config'].merge(payload['policy']['config'])
654
+ end
655
+ end
656
+
657
+ # if options[:dry_run]
658
+ # print_dry_run @policies_interface.dry.update(policy["id"], payload)
659
+ # return
660
+ # end
661
+ # json_response = @policies_interface.update(policy["id"], payload)
662
+ @policies_interface.setopts(options)
663
+ @group_policies_interface.setopts(options)
664
+ @cloud_policies_interface.setopts(options)
665
+ if options[:dry_run]
666
+ if group
667
+ print_dry_run @group_policies_interface.dry.update(group['id'], policy["id"], payload)
668
+ elsif cloud
669
+ print_dry_run @cloud_policies_interface.dry.update(cloud['id'], policy["id"], payload)
670
+ else
671
+ print_dry_run @policies_interface.dry.update(policy["id"], payload)
672
+ end
673
+ return
674
+ end
675
+ json_response = nil
676
+ if group
677
+ json_response = @group_policies_interface.update(group['id'], policy["id"], payload)
678
+ elsif cloud
679
+ json_response = @cloud_policies_interface.update(cloud['id'], policy["id"], payload)
680
+ else
681
+ json_response = @policies_interface.update(policy["id"], payload)
682
+ end
683
+ if options[:json]
684
+ puts as_json(json_response)
685
+ else
686
+ print_green_success "Updated policy #{policy['id']}"
687
+ get([policy['id']])
688
+ end
689
+ return 0
690
+ rescue RestClient::Exception => e
691
+ print_rest_exception(e, options)
692
+ return 1
693
+ end
694
+ end
695
+
696
+ def remove(args)
697
+ options = {}
698
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
699
+ opts.banner = subcommand_usage("[policy]")
700
+ build_common_options(opts, options, [:account, :auto_confirm, :json, :dry_run, :remote])
701
+ opts.footer = "Delete a policy." + "\n" +
702
+ "[policy] is required. This is the id of a policy."
703
+ end
704
+ optparse.parse!(args)
705
+
706
+ if args.count != 1
707
+ print_error MtnCloud::Terminal.angry_prompt
708
+ puts_error "wrong number of arguments, expected 1 and got #{args.count}\n#{optparse}"
709
+ return 1
710
+ end
711
+
712
+ connect(options)
713
+ begin
714
+ policy = find_policy_by_name_or_id(args[0])
715
+ return 1 if policy.nil?
716
+ group = policy['site'] || policy['group']
717
+ cloud = policy['zone'] || policy['cloud']
718
+
719
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the policy: #{policy['id']}?")
720
+ return 9, "aborted command"
721
+ end
722
+ # if options[:dry_run]
723
+ # print_dry_run @policies_interface.dry.destroy(policy['id'])
724
+ # return 0
725
+ # end
726
+ # json_response = @policies_interface.destroy(policy['id'])
727
+ @policies_interface.setopts(options)
728
+ @group_policies_interface.setopts(options)
729
+ @cloud_policies_interface.setopts(options)
730
+ if options[:dry_run]
731
+ if group
732
+ print_dry_run @group_policies_interface.dry.destroy(group['id'], policy["id"])
733
+ elsif cloud
734
+ print_dry_run @cloud_policies_interface.dry.destroy(cloud['id'], policy["id"])
735
+ else
736
+ print_dry_run @policies_interface.dry.destroy(policy["id"])
737
+ end
738
+ return
739
+ end
740
+ json_response = nil
741
+ if group
742
+ json_response = @group_policies_interface.destroy(group['id'], policy["id"])
743
+ elsif cloud
744
+ json_response = @cloud_policies_interface.destroy(cloud['id'], policy["id"])
745
+ else
746
+ json_response = @policies_interface.destroy(policy["id"])
747
+ end
748
+ if options[:json]
749
+ print JSON.pretty_generate(json_response)
750
+ print "\n"
751
+ else
752
+ print_green_success "Deleted policy #{policy['id']}"
753
+ # list([])
754
+ end
755
+ return 0
756
+ rescue RestClient::Exception => e
757
+ print_rest_exception(e, options)
758
+ return 1
759
+ end
760
+ end
761
+
762
+ def list_types(args)
763
+ params = {}
764
+ options = {}
765
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
766
+ opts.banner = subcommand_usage("[search]")
767
+ build_standard_list_options(opts, options, [], [:search])
768
+ opts.footer = <<-EOT
769
+ Get details about a policy type.
770
+ [policy-type] is required. This is Name or ID of a policy type.
771
+ EOT
772
+ opts.footer = "List policy types."
773
+ end
774
+ optparse.parse!(args)
775
+ verify_args!(args:args, optparse:optparse, count:0)
776
+ # if args.count > 0
777
+ # options[:phrase] = args.join(" ")
778
+ # end
779
+ params.merge!(parse_list_options(options))
780
+ connect(options)
781
+ @policies_interface.setopts(options)
782
+ if options[:dry_run]
783
+ print_dry_run @policies_interface.dry.list_policy_types(params)
784
+ return 0
785
+ end
786
+ json_response = @policies_interface.list_policy_types(params)
787
+ render_response(json_response, options, 'policyTypes') do
788
+ policy_types = json_response['policyTypes']
789
+ print_h1 "Policy Types"
790
+ rows = policy_types.collect {|policy_type|
791
+ row = {
792
+ id: policy_type['id'],
793
+ name: policy_type['name'],
794
+ code: policy_type['code'],
795
+ description: policy_type['description']
796
+ }
797
+ row
798
+ }
799
+ columns = [:id, :name]
800
+ if options[:include_fields]
801
+ columns = options[:include_fields]
802
+ end
803
+ print cyan
804
+ print as_pretty_table(rows, columns, options)
805
+ print_results_pagination(json_response)
806
+ print reset, "\n"
807
+ end
808
+ return 0
809
+ end
810
+
811
+ def get_type(args)
812
+ params = {}
813
+ options = {}
814
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
815
+ opts.banner = subcommand_usage("[policy-type]")
816
+ build_standard_get_options(opts, options)
817
+ opts.footer = <<-EOT
818
+ Get details about a policy type.
819
+ [policy-type] is required. This is Name or ID of a policy type.
820
+ EOT
821
+ end
822
+ optparse.parse!(args)
823
+ verify_args!(args:args, optparse:optparse, count: 1)
824
+ connect(options)
825
+ params.merge!(parse_query_options(options))
826
+ policy_type_id = args[0]
827
+ if policy_type_id.to_s !~ /\A\d{1,}\Z/
828
+ policy_type = find_policy_type_by_name_or_id(args[0])
829
+ return [1, "Policy Type not found for #{args[0]}"] if policy_type.nil?
830
+ policy_type_id = policy_type['id']
831
+ end
832
+ @policies_interface.setopts(options)
833
+ if options[:dry_run]
834
+ print_dry_run @policies_interface.dry.get_policy_type(policy_type_id, params)
835
+ return 0
836
+ end
837
+ json_response = @policies_interface.get_policy_type(policy_type_id, params)
838
+ render_response(json_response, options, 'policyType') do
839
+ policy_type = json_response['policyType']
840
+ print_h1 "Policy Type Details"
841
+ print cyan
842
+ description_cols = {
843
+ "ID" => 'id',
844
+ "Name" => 'name',
845
+ # "Description" => 'description',
846
+ "Code" => 'code',
847
+ "Category" => 'category',
848
+ # "Load Method" => 'loadMethod',
849
+ # "Enforce Method" => 'enforceMethod',
850
+ # "Prepare Method" => 'prepareMethod',
851
+ # "Validate Method" => 'validateMethod',
852
+ "Provision Enforced" => lambda {|it| it['enforceOnProvision'] ? 'Yes' : 'No' },
853
+ "Managed Enforced" => lambda {|it| it['enforceOnManaged'] ? 'Yes' : 'No' },
854
+ }
855
+ print_description_list(description_cols, policy_type)
856
+ print reset,"\n"
857
+
858
+ # show option types
859
+ print_h2 "Policy Type Options"
860
+ print format_option_types_table(policy_type['optionTypes'], options, 'policy')
861
+ print reset,"\n"
862
+ end
863
+ return 0
864
+ end
865
+
866
+ private
867
+
868
+ def find_policy_by_name_or_id(val, scope_by={})
869
+ if val.to_s =~ /\A\d{1,}\Z/
870
+ return find_policy_by_id(val, scope_by)
871
+ else
872
+ return find_policy_by_name(val, scope_by)
873
+ end
874
+ end
875
+
876
+ def find_policy_by_id(id, scope_by={})
877
+ begin
878
+ group = scope_by[:group]
879
+ cloud = scope_by[:cloud]
880
+ json_response = nil
881
+ if group
882
+ json_response = @group_policies_interface.get(group['id'], id.to_i)
883
+ elsif cloud
884
+ json_response = @cloud_policies_interface.get(cloud['id'], id.to_i)
885
+ else
886
+ json_response = @policies_interface.get(id.to_i)
887
+ end
888
+ return json_response['policy']
889
+ rescue RestClient::Exception => e
890
+ if e.response && e.response.code == 404
891
+ print_red_alert "Policy not found by id #{id}"
892
+ return nil
893
+ else
894
+ raise e
895
+ end
896
+ end
897
+ end
898
+
899
+ def find_policy_by_name(name, scope_by={})
900
+ group = scope_by[:group]
901
+ cloud = scope_by[:cloud]
902
+ json_response = nil
903
+ if group
904
+ json_response = @group_policies_interface.list(group['id'], {name: name.to_s})
905
+ elsif cloud
906
+ json_response = @cloud_policies_interface.list(cloud['id'], {name: name.to_s})
907
+ else
908
+ json_response = @policies_interface.list({name: name.to_s})
909
+ end
910
+ policies = json_response['policies']
911
+ if policies.empty?
912
+ print_red_alert "Policy not found by name #{name}"
913
+ return nil
914
+ elsif policies.size > 1
915
+ print_red_alert "#{policies.size} policies found by name #{name}"
916
+ # print_policies_table(policies, {color: red})
917
+ rows = policies.collect do |policy|
918
+ {id: policy['id'], name: policy['name']}
919
+ end
920
+ puts as_pretty_table(rows, [:id, :name], {color:red})
921
+ return nil
922
+ else
923
+ policy = policies[0]
924
+ # merge in tenants map
925
+ if json_response['tenants'] && json_response['tenants'][policy['id']]
926
+ policy['tenants'] = json_response['tenants'][policy['id']]
927
+ end
928
+ return policy
929
+ end
930
+ end
931
+
932
+ def find_policy_type_by_name_or_id(val)
933
+ if val.to_s =~ /\A\d{1,}\Z/
934
+ return find_policy_type_by_id(val)
935
+ else
936
+ return find_policy_type_by_name(val)
937
+ end
938
+ end
939
+
940
+ def find_policy_type_by_name(name)
941
+ json_response = nil
942
+
943
+ # json_response = @policies_interface.list_policy_types({name: name.to_s})
944
+ json_response = @policies_interface.list_policy_types({max: 10000})
945
+ policy_types = json_response['policyTypes']
946
+ match_value = name.to_s.downcase
947
+ policy_types = policy_types.select {|it| it['name'].to_s.downcase == match_value || it['code'].to_s.downcase == match_value }
948
+ if policy_types.empty?
949
+ print_red_alert "Policy not found by name #{name}"
950
+ return nil
951
+ elsif policy_types.size > 1
952
+ print_red_alert "#{policy_types.size} policy types found by name or code #{name}"
953
+ # print_policies_table(policy_types, {color: red})
954
+ rows = policy_types.collect do |it|
955
+ {id: it['id'], name: it['name'], code: it['code']}
956
+ end
957
+ puts as_pretty_table(rows, [:id, :name], {color:red})
958
+ return nil
959
+ else
960
+ policy_type = policy_types[0]
961
+ return policy_type
962
+ end
963
+ end
964
+
965
+ def find_policy_type_by_id(id)
966
+ begin
967
+ json_response = @policies_interface.get_policy_type(id.to_s)
968
+ return json_response['policyType']
969
+ rescue RestClient::Exception => e
970
+ if e.response && e.response.code == 404
971
+ print_red_alert "Policy Type not found by id #{id}"
972
+ return nil
973
+ else
974
+ raise e
975
+ end
976
+ end
977
+ end
978
+
979
+ def format_tenants(accounts)
980
+ if accounts && accounts.size > 0
981
+ accounts = accounts.sort {|a,b| a['name'] <=> b['name'] }.uniq {|it| it['id'] }
982
+ account_ids = accounts.collect {|it| it['id'] }
983
+ account_names = accounts.collect {|it| it['name'] }
984
+ "(#{account_ids.join(',')}) #{account_names.join(',')}"
985
+ else
986
+ ""
987
+ end
988
+ end
989
+
990
+ end