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,897 @@
1
+ require 'mtncloud/cli/cli_command'
2
+
3
+ class MtnCloud::Cli::Users
4
+ include MtnCloud::Cli::CliCommand
5
+ include MtnCloud::Cli::AccountsHelper
6
+ include MtnCloud::Cli::WhoamiHelper
7
+ register_subcommands :list, :count, :get, :add, :update, :remove, :permissions
8
+ register_subcommands :'passwd' => :change_password
9
+ alias_subcommand :details, :get
10
+ set_default_subcommand :list
11
+
12
+ def initialize()
13
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
14
+ end
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @account_users_interface = @api_client.account_users
19
+ @accounts_interface = @api_client.accounts
20
+ @roles_interface = @api_client.roles
21
+ end
22
+
23
+ def handle(args)
24
+ handle_subcommand(args)
25
+ end
26
+
27
+ def list(args)
28
+ params = {}
29
+ options = {}
30
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
31
+ opts.banner = subcommand_usage()
32
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
33
+ options[:global] = true
34
+ end
35
+ opts.on('--role AUTHORITY', String, "Role Name (authority)") do |val|
36
+ params['role'] ||= []
37
+ val.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }.each do |v|
38
+ params['role'] << v
39
+ end
40
+ end
41
+ opts.on('--role-id ID', String, "Role ID") do |val|
42
+ params['roleId'] ||= []
43
+ val.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }.each do |v|
44
+ params['roleId'] << v
45
+ end
46
+ end
47
+ build_standard_list_options(opts, options, [:account])
48
+ opts.footer = "List users."
49
+ end
50
+ optparse.parse!(args)
51
+ # verify_args!(args:args, optparse:optparse, count:0)
52
+ options[:phrase] = args.join(" ") if args.count > 0
53
+ connect(options)
54
+ account = find_account_from_options(options)
55
+ account_id = account ? account['id'] : nil
56
+ params['global'] = true if options[:global]
57
+ params.merge!(parse_list_options(options))
58
+ @account_users_interface.setopts(options)
59
+ if options[:dry_run]
60
+ print_dry_run @account_users_interface.dry.list(account_id, params)
61
+ return 0, nil
62
+ end
63
+ json_response = @account_users_interface.list(account_id, params)
64
+ render_response(json_response, options, "users") do
65
+ users = json_response['users']
66
+ title = "Users"
67
+ subtitles = []
68
+ if account
69
+ subtitles << "Tenant: #{account['name']}".strip
70
+ end
71
+ if params['global'] && json_response['global']
72
+ subtitles << "(All Tenants)"
73
+ end
74
+ subtitles += parse_list_subtitles(options)
75
+ print_h1 title, subtitles, options
76
+ if users.empty?
77
+ print cyan,"No users found.",reset,"\n"
78
+ else
79
+ print cyan
80
+ print as_pretty_table(users, list_user_column_definitions, options)
81
+ print_results_pagination(json_response)
82
+ end
83
+ print reset,"\n"
84
+ end
85
+ return 0, nil
86
+ end
87
+
88
+ def count(args)
89
+ params = {}
90
+ options = {}
91
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
92
+ opts.banner = subcommand_usage("[options]")
93
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
94
+ options[:global] = true
95
+ end
96
+ build_common_options(opts, options, [:account, :query, :remote, :dry_run])
97
+ opts.footer = "Get the number of users."
98
+ end
99
+ optparse.parse!(args)
100
+ connect(options)
101
+ begin
102
+ account = find_account_from_options(options)
103
+ account_id = account ? account['id'] : nil
104
+ params['global'] = true if options[:global]
105
+ params.merge!(parse_list_options(options))
106
+ @account_users_interface.setopts(options)
107
+ if options[:dry_run]
108
+ print_dry_run @account_users_interface.dry.list(account_id, params)
109
+ return
110
+ end
111
+ json_response = @account_users_interface.list(account_id, params)
112
+ # print number only
113
+ if json_response['meta'] && json_response['meta']['total']
114
+ print cyan, json_response['meta']['total'], reset, "\n"
115
+ else
116
+ print yellow, "unknown", reset, "\n"
117
+ end
118
+ rescue RestClient::Exception => e
119
+ print_rest_exception(e, options)
120
+ exit 1
121
+ end
122
+ end
123
+
124
+ def get(args)
125
+ options = {}
126
+ params = {}
127
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
128
+ opts.banner = subcommand_usage("[user]")
129
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
130
+ options[:global] = true
131
+ end
132
+ opts.on('-p','--permissions', "Display Permissions [deprecated]") do |val|
133
+ options[:include_features_access] = true
134
+ params['includeAccess'] = true
135
+ end
136
+ opts.add_hidden_option('-p,')
137
+ opts.on(nil,'--feature-access', "Display Feature Access") do |val|
138
+ options[:include_features_access] = true
139
+ params['includeAccess'] = true
140
+ end
141
+ opts.on(nil,'--group-access', "Display Group Access") do
142
+ options[:include_sites_access] = true
143
+ params['includeAccess'] = true
144
+ end
145
+ opts.on(nil,'--cloud-access', "Display Cloud Access") do
146
+ options[:include_zones_access] = true
147
+ params['includeAccess'] = true
148
+ end
149
+ opts.on(nil,'--instance-type-access', "Display Instance Type Access") do
150
+ options[:include_instance_types_access] = true
151
+ params['includeAccess'] = true
152
+ end
153
+ opts.on(nil,'--blueprint-access', "Display Blueprint Access") do
154
+ options[:include_app_templates_access] = true
155
+ params['includeAccess'] = true
156
+ end
157
+ opts.on(nil,'--catalog-item-type-access', "Display Catalog Item Type Access") do
158
+ options[:include_catalog_item_types_access] = true
159
+ params['includeAccess'] = true
160
+ end
161
+ opts.on(nil,'--personas', "Display Persona Access") do
162
+ options[:include_personas_access] = true
163
+ params['includeAccess'] = true
164
+ end
165
+ opts.on(nil,'--vdi-pool-access', "Display VDI Pool Access") do
166
+ options[:include_vdi_pools_access] = true
167
+ params['includeAccess'] = true
168
+ end
169
+ opts.on(nil,'--report-type-access', "Display Report Type Access") do
170
+ options[:include_report_types_access] = true
171
+ params['includeAccess'] = true
172
+ end
173
+ opts.on(nil,'--workflow-access', "Display Workflow Access") do
174
+ options[:include_task_sets_access] = true
175
+ params['includeAccess'] = true
176
+ end
177
+ opts.on(nil,'--task-access', "Display Task Access") do
178
+ options[:include_tasks_access] = true
179
+ params['includeAccess'] = true
180
+ end
181
+ opts.on(nil,'--all', "Display All Access Lists") do
182
+ options[:include_features_access] = true
183
+ options[:include_sites_access] = true
184
+ options[:include_zones_access] = true
185
+ options[:include_instance_types_access] = true
186
+ options[:include_app_templates_access] = true
187
+ options[:include_catalog_item_types_access] = true
188
+ options[:include_personas_access] = true
189
+ options[:include_vdi_pools_access] = true
190
+ options[:include_report_types_access] = true
191
+ options[:include_task_sets_access] = true
192
+ options[:include_tasks_access] = true
193
+ params['includeAccess'] = true
194
+ end
195
+ opts.on(nil, '--hide-none-access', "Hide records with 'none' access") do
196
+ options[:hide_none_access] = true
197
+ end
198
+ build_standard_get_options(opts, options, [:account])
199
+ opts.footer = <<-EOT
200
+ Get details about a user.
201
+ [user] is required. This is the username or id of a user. Supports 1-N arguments.
202
+ EOT
203
+ end
204
+ optparse.parse!(args)
205
+ verify_args!(args:args, optparse:optparse, min:1)
206
+ connect(options)
207
+ id_list = parse_id_list(args)
208
+ params.merge!(parse_query_options(options))
209
+ return run_command_for_each_arg(id_list) do |arg|
210
+ _get(arg, params, options)
211
+ end
212
+ end
213
+
214
+ def _get(id, params, options={})
215
+ args = [id] # heh
216
+ account = find_account_from_options(options)
217
+ account_id = account ? account['id'] : nil
218
+ params['global'] = true if options[:global]
219
+ @account_users_interface.setopts(options)
220
+ if options[:dry_run]
221
+ if args[0].to_s =~ /\A\d{1,}\Z/
222
+ print_dry_run @account_users_interface.dry.get(account_id, args[0].to_i, params)
223
+ else
224
+ print_dry_run @account_users_interface.dry.list(account_id, params.merge({username: args[0]}))
225
+ end
226
+ return
227
+ end
228
+
229
+ if args[0].to_s =~ /\A\d{1,}\Z/
230
+ user_id = args[0].to_i
231
+ else
232
+ user = find_user_by_username(account_id, args[0], params)
233
+ return 1 if user.nil?
234
+ user_id = user['id']
235
+ end
236
+ # always get by id, index does not return 'access'
237
+ json_response = @account_users_interface.get(account_id, user_id, params)
238
+ user = json_response['user']
239
+ render_response(json_response, options, "user") do
240
+ is_tenant_account = current_account['id'] != user['account']['id']
241
+ print_h1 "User Details", options
242
+ print cyan
243
+ print_description_list(user_column_definitions, user)
244
+
245
+ # backward compatibility
246
+ if user['access'].nil? && options[:include_features_access]
247
+ user_feature_permissions_json = @account_users_interface.feature_permissions(account_id, user['id'])
248
+ user_feature_permissions = user_feature_permissions_json['permissions'] || user_feature_permissions_json['featurePermissions']
249
+
250
+ if user_feature_permissions
251
+ print_h2 "Feature Permissions", options
252
+ print cyan
253
+ if user_feature_permissions.is_a?(Array)
254
+ rows = user_feature_permissions.collect do |it|
255
+ {name: it['name'], code: it['code'], access: format_access_string(it['access']) }
256
+ end
257
+ print as_pretty_table(rows, [:name, :code, :access], options)
258
+ else
259
+ rows = user_feature_permissions.collect do |code, access|
260
+ {code: code, access: format_access_string(access) }
261
+ end
262
+ print as_pretty_table(rows, [:code, :access], options)
263
+ end
264
+ else
265
+ puts yellow,"No permissions found.",reset
266
+ end
267
+ else
268
+ available_field_options = {
269
+ 'features' => 'Feature', 'sites' => 'Group', 'zones' => 'Cloud', 'instance_types' => 'Instance Type',
270
+ 'app_templates' => 'Blueprint', 'report_types' => 'Report Type', 'personas' => 'Persona',
271
+ 'catalog_item_types' => 'Catalog Item Type', 'vdi_pools' => 'VDI Pool', 'task_sets' => 'Workflow', 'tasks' => 'Task'
272
+ }
273
+
274
+ if is_tenant_account
275
+ available_field_options.delete("sites")
276
+ else
277
+ available_field_options.delete("zones")
278
+ end
279
+
280
+ available_field_options.each do |field, label|
281
+ if options["include_#{field}_access".to_sym]
282
+ access = user['access'][field.to_s.camelcase] || []
283
+ access = access.reject {|it| it['access'] == 'none'} if options[:hide_none_access]
284
+
285
+ if field == "features"
286
+ print_h2 "#{label} Access", options
287
+ else
288
+ print_h2 "#{label} Access", options
289
+ end
290
+ print cyan
291
+
292
+ # access levels vary, default is none,read,user,full
293
+ available_access_levels = ["none","read","user","full"]
294
+ if field == 'sites' || field == 'zones' || field == 'instance_types' || field == 'app_templates'
295
+ available_access_levels = ["none","read","full"]
296
+ end
297
+ if access.count > 0
298
+ access.each {|it| it['access'] = format_access_string(it['access'], available_access_levels)}
299
+
300
+ if ['features'].include?(field)
301
+ if access.find {|it| !it['subCategory'].to_s.empty? }
302
+ rows = access.collect do |it|
303
+ {
304
+ code: it['code'],
305
+ name: it['name'],
306
+ category: it['subCategory'].to_s.titleize,
307
+ access: format_access_string(it['access']),
308
+ }
309
+ end
310
+ if options[:sort]
311
+ rows.sort! {|a,b| a[options[:sort]] <=> b[options[:sort]] }
312
+ else
313
+ rows.sort! {|a,b| [a[:category],a[:name],a[:code]] <=> [b[:category],b[:name],b[:code]] }
314
+ end
315
+ if options[:direction] == 'desc'
316
+ rows.reverse!
317
+ end
318
+ print as_pretty_table(rows, [:category, :name, :code, :access], options)
319
+ else
320
+ print as_pretty_table(access, [:name, :code, :access], options)
321
+ end
322
+ elsif ['instance_types','report_types'].include?(field)
323
+ print as_pretty_table(access, [:name, :code, :access], options)
324
+ else
325
+ print as_pretty_table(access, [:name, :access], options)
326
+ end
327
+ else
328
+ println yellow,"No #{label} Access Found.",reset
329
+ end
330
+ end
331
+ end
332
+ end
333
+ print reset,"\n"
334
+ end
335
+ return 0
336
+ end
337
+
338
+ def permissions(args)
339
+ params = {}
340
+ options = {}
341
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
342
+ opts.banner = subcommand_usage("[user]")
343
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
344
+ options[:global] = true
345
+ end
346
+ opts.on('--hide-none-access', "Hide records with 'none' access") do
347
+ options[:hide_none_access] = true
348
+ end
349
+ build_common_options(opts, options, [:account, :json, :yaml, :csv, :fields, :dry_run, :remote])
350
+ opts.footer = "Display Access for a user." + "\n" +
351
+ "[user] is required. This is the username or id of a user."
352
+ end
353
+ optparse.parse!(args)
354
+ verify_args!(args:args, optparse:optparse, count:1)
355
+
356
+ connect(options)
357
+ begin
358
+ account = find_account_from_options(options)
359
+ account_id = account ? account['id'] : nil
360
+ params['global'] = true if options[:global]
361
+ user = find_user_by_username_or_id(account_id, args[0], params)
362
+ return 1 if user.nil?
363
+ @account_users_interface.setopts(options)
364
+ if options[:dry_run]
365
+ print_dry_run @account_users_interface.dry.permissions(account_id, user['id'])
366
+ return
367
+ end
368
+
369
+ is_tenant_account = current_account['id'] != user['account']['id']
370
+
371
+ json_response = @account_users_interface.permissions(account_id, user['id'])
372
+
373
+ # backward compatibility
374
+ if !json_response['permissions'].nil?
375
+ if options[:json]
376
+ puts as_json(json_response, options, 'permissions')
377
+ return 0
378
+ elsif options[:yaml]
379
+ puts as_yaml(json_response, options, 'permissions')
380
+ return 0
381
+ elsif options[:csv]
382
+ puts records_as_csv(json_response['permissions'], options)
383
+ return 0
384
+ else
385
+ user_feature_permissions = nil
386
+ # permissions (Array) has replaced featurePermissions (map)
387
+ user_feature_permissions = json_response['permissions'] || json_response['featurePermissions']
388
+ print_h1 "User Permissions: #{user['username']}", options
389
+ if user_feature_permissions
390
+ print cyan
391
+ if user_feature_permissions.is_a?(Array)
392
+ rows = user_feature_permissions.collect do |it|
393
+ {name: it['name'], code: it['code'], access: format_access_string(it['access']) }
394
+ end
395
+ print as_pretty_table(rows, [:name, :code, :access], options)
396
+ else
397
+ rows = user_feature_permissions.collect do |code, access|
398
+ {code: code, access: format_access_string(access) }
399
+ end
400
+ print as_pretty_table(rows, [:code, :access], options)
401
+ end
402
+
403
+ else
404
+ print yellow,"No permissions found.",reset,"\n"
405
+ end
406
+ end
407
+ else
408
+ if options[:json]
409
+ puts as_json(json_response, options, 'access')
410
+ return 0
411
+ elsif options[:yaml]
412
+ puts as_yaml(json_response, options, 'access')
413
+ return 0
414
+ elsif options[:csv]
415
+ puts records_as_csv(json_response['access'], options)
416
+ return 0
417
+ end
418
+
419
+ print_h1 "User Permissions: #{user['username']}", options
420
+
421
+ available_field_options = {
422
+ 'features' => 'Feature', 'sites' => 'Group', 'zones' => 'Cloud', 'instance_types' => 'Instance Type',
423
+ 'app_templates' => 'Blueprint', 'report_types' => 'Report Type', 'personas' => 'Persona',
424
+ 'catalog_item_types' => 'Catalog Item Type', 'vdi_pools' => 'VDI Pool', 'task_sets' => 'Workflow', 'tasks' => 'Task'
425
+ }
426
+
427
+ if is_tenant_account
428
+ available_field_options.reject! {|k| k == 'sites'}
429
+ else
430
+ available_field_options.reject! {|k| k == 'zones'}
431
+ end
432
+
433
+ available_field_options.each do |field, label|
434
+ if !(field == 'sites' && is_tenant_account)
435
+ access = json_response['access'][field.split('_').enum_for(:each_with_index).collect {|word, idx| idx == 0 ? word : word.capitalize}.join]
436
+ access = access.reject {|it| it['access'] == 'none'} if options[:hide_none_access]
437
+
438
+ print_h2 "#{label} Access", options
439
+ print cyan
440
+ available_access_levels = ["full","user","read","none"]
441
+ if field == 'sites' || field == 'zones' || field == 'instance_types' || field == 'app_templates'
442
+ available_access_levels = ["full","custom","none"]
443
+ end
444
+ if access.count > 0
445
+ access.each {|it| it['access'] = format_access_string(it['access'], available_access_levels)}
446
+
447
+ if ['features'].include?(field)
448
+ if access.find {|it| !it['subCategory'].to_s.empty? }
449
+ rows = access.collect do |it|
450
+ {
451
+ code: it['code'],
452
+ name: it['name'],
453
+ category: it['subCategory'].to_s.titleize,
454
+ access: format_access_string(it['access']),
455
+ }
456
+ end
457
+ if options[:sort]
458
+ rows.sort! {|a,b| a[options[:sort]] <=> b[options[:sort]] }
459
+ else
460
+ rows.sort! {|a,b| [a[:category],a[:name],a[:code]] <=> [b[:category],b[:name],b[:code]] }
461
+ end
462
+ if options[:direction] == 'desc'
463
+ rows.reverse!
464
+ end
465
+ print as_pretty_table(rows, [:category, :name, :code, :access], options)
466
+ else
467
+ print as_pretty_table(access, [:name, :code, :access], options)
468
+ end
469
+ elsif ['instance_types','report_types'].include?(field)
470
+ print as_pretty_table(access, [:name, :code, :access], options)
471
+ else
472
+ print as_pretty_table(access, [:name, :access], options)
473
+ end
474
+ else
475
+ println cyan,"No #{label} Access Found.",reset
476
+ end
477
+ end
478
+ end
479
+ end
480
+ print cyan
481
+ print reset,"\n"
482
+ rescue RestClient::Exception => e
483
+ print_rest_exception(e, options)
484
+ return 1
485
+ end
486
+ end
487
+
488
+ def add(args)
489
+ options = {}
490
+ params = {}
491
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
492
+ opts.banner = subcommand_usage("[username] [email] [first] [last] [options]")
493
+ build_option_type_options(opts, options, add_user_option_types)
494
+ build_option_type_options(opts, options, add_user_advanced_option_types)
495
+ build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
496
+ opts.footer = <<-EOT
497
+ Create a new user.
498
+ [user] is required. Username of the new user
499
+ [email] is required. Email address
500
+ [first] is optional. First Name
501
+ [last] is optional. Last Name
502
+ EOT
503
+ end
504
+ optparse.parse!(args)
505
+ verify_args!(args:args, optparse:optparse, min:0, max:4)
506
+ options[:options]['username'] = args[0] if args[0]
507
+ options[:options]['email'] = args[1] if args[1]
508
+ options[:options]['firstName'] = args[2] if args[2]
509
+ options[:options]['lastName'] = args[3] if args[3]
510
+ if options[:options]['password']
511
+ options[:options]['passwordConfirmation'] = options[:options]['password']
512
+ end
513
+ connect(options)
514
+ begin
515
+
516
+ account = find_account_from_options(options)
517
+ account_id = account ? account['id'] : nil
518
+
519
+ payload = {}
520
+ if options[:payload]
521
+ payload = options[:payload]
522
+ payload.deep_merge!({'user' => parse_passed_options(options)})
523
+ else
524
+ payload.deep_merge!({'user' => parse_passed_options(options)})
525
+ # remove role option_type, it is just for help display, the role prompt is separate down below
526
+ prompt_option_types = add_user_option_types().reject {|it| 'roles' == it['fieldName'] }
527
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt(prompt_option_types, options[:options], @api_client, options[:params])
528
+ params.deep_merge!(v_prompt)
529
+ # do not prompt for advanced options
530
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(add_user_advanced_option_types, options[:options], @api_client, options[:params])
531
+ advanced_config.deep_compact!
532
+ params.deep_merge!(advanced_config)
533
+ # prompt for roles
534
+ selected_roles = []
535
+ selected_roles += payload['user'].delete('roleId').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['roleId']
536
+ selected_roles += payload['user'].delete('role').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['role']
537
+ selected_roles += payload['user'].delete('roles').split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['roles']
538
+ roles = prompt_user_roles(account_id, nil, selected_roles, options)
539
+ if !roles.empty?
540
+ params['roles'] = roles.collect {|r| {id: r['id']} }
541
+ end
542
+ payload['user'].deep_merge!(params)
543
+ end
544
+ if options[:dry_run] && options[:json]
545
+ puts as_json(payload, options)
546
+ return 0
547
+ end
548
+ @account_users_interface.setopts(options)
549
+ if options[:dry_run]
550
+ print_dry_run @account_users_interface.dry.create(account_id, payload)
551
+ return
552
+ end
553
+ json_response = @account_users_interface.create(account_id, payload)
554
+ if options[:json]
555
+ print JSON.pretty_generate(json_response)
556
+ print "\n"
557
+ else
558
+ user = json_response['user']
559
+ username = "" # json_response['user']['username']
560
+ username = user['username'] if user
561
+ if account
562
+ print_green_success "Added user #{username} to account #{account['name']}"
563
+ else
564
+ print_green_success "Added user #{username}"
565
+ end
566
+ return _get(user['id'], {}, options)
567
+ end
568
+ rescue RestClient::Exception => e
569
+ print_rest_exception(e, options)
570
+ return 1
571
+ end
572
+ end
573
+
574
+ def update(args)
575
+ options = {}
576
+ params = {}
577
+ payload = {}
578
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
579
+ opts.banner = subcommand_usage("[user] [options]")
580
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
581
+ options[:global] = true
582
+ end
583
+ build_option_type_options(opts, options, update_user_option_types)
584
+ build_option_type_options(opts, options, update_user_advanced_option_types)
585
+ build_common_options(opts, options, [:account, :options, :payload, :json, :dry_run])
586
+ end
587
+ optparse.parse!(args)
588
+ verify_args!(args:args, optparse:optparse, count:1)
589
+ connect(options)
590
+ begin
591
+
592
+ account = find_account_from_options(options)
593
+ account_id = account ? account['id'] : nil
594
+ params['global'] = true if options[:global]
595
+ user = find_user_by_username_or_id(account_id, args[0], params)
596
+ return 1 if user.nil?
597
+
598
+ # use --payload
599
+ payload = {}
600
+ if options[:payload]
601
+ payload = options[:payload]
602
+ payload.deep_merge!({'user' => parse_passed_options(options)})
603
+ else
604
+ payload.deep_merge!({'user' => parse_passed_options(options)})
605
+
606
+ # remove role option_type, it is just for help display, the role prompt is separate down below
607
+ prompt_option_types = update_user_option_types().reject {|it| 'roles' == it['fieldName'] }
608
+ v_prompt = MtnCloud::Cli::OptionTypes.no_prompt(prompt_option_types, options[:options], @api_client, options[:params])
609
+ v_prompt.deep_compact!
610
+ params.deep_merge!(v_prompt)
611
+ # do not prompt for advanced options
612
+ advanced_config = MtnCloud::Cli::OptionTypes.no_prompt(update_user_advanced_option_types, options[:options], @api_client, options[:params])
613
+ advanced_config.deep_compact!
614
+ params.deep_merge!(advanced_config)
615
+
616
+ selected_roles = []
617
+ selected_roles += payload['user'].delete('roleId').to_s.split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['roleId']
618
+ selected_roles += payload['user'].delete('role').to_s.split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['role']
619
+ selected_roles += payload['user'].delete('roles').to_s.split(',').collect {|r| r.strip.empty? ? nil : r.strip}.uniq if payload['user']['roles']
620
+ if !selected_roles.empty?
621
+ roles = prompt_user_roles(account_id, user['id'], selected_roles, options.merge(no_prompt: true))
622
+ # should it allow [] (no roles) ?
623
+ if !roles.empty?
624
+ params['roles'] = roles.collect {|r| {id: r['id']} }
625
+ end
626
+ end
627
+ payload.deep_merge!({'user' => params})
628
+ if payload['user'].empty? # || options[:no_prompt]
629
+ raise_command_error "Specify at least one option to update.\n#{optparse}"
630
+ end
631
+ end
632
+
633
+ @account_users_interface.setopts(options)
634
+ if options[:dry_run]
635
+ print_dry_run @account_users_interface.dry.update(account_id, user['id'], payload)
636
+ return
637
+ end
638
+ json_response = @account_users_interface.update(account_id, user['id'], payload)
639
+ user = json_response['user']
640
+ if options[:json]
641
+ print JSON.pretty_generate(json_response)
642
+ print "\n"
643
+ else
644
+ username = user['username'] # json_response['user']['username']
645
+ if payload['user'] && payload['user']['username']
646
+ username = payload['user']['username']
647
+ end
648
+ print_green_success "Updated user #{username}"
649
+ # details_options = [username]
650
+ # if account
651
+ # details_options.push "--account-id", account['id'].to_s
652
+ # end
653
+ # get(details_options + (options[:remote] ? ["-r",options[:remote]] : []))
654
+ return _get(user["id"], {}, options)
655
+ end
656
+ rescue RestClient::Exception => e
657
+ print_rest_exception(e, options)
658
+ return 1
659
+ end
660
+ end
661
+
662
+ def change_password(args)
663
+ params = {}
664
+ options = {}
665
+ payload = {}
666
+ new_password = nil
667
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
668
+ opts.banner = subcommand_usage("[user] [password] [options]")
669
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
670
+ options[:global] = true
671
+ end
672
+ # opts.on('--password VALUE', String, "New password") do |val|
673
+ # new_password = val
674
+ # end
675
+ build_standard_update_options(opts, options, [:account])
676
+ end
677
+ optparse.parse!(args)
678
+ verify_args!(args:args, optparse:optparse, min:1,max:2) # [user] [password]
679
+ connect(options)
680
+ exit_code, err = 0, nil
681
+
682
+ # user can be scoped to account (tenant)
683
+ account = find_account_from_options(options)
684
+ account_id = account ? account['id'] : nil
685
+ params['global'] = true if options[:global]
686
+ # fetch the user to update
687
+ user = find_user_by_username_or_id(account_id, args[0], params)
688
+ return 1 if user.nil?
689
+
690
+ new_password = args[1] if args[1]
691
+
692
+ # print a warning or important info
693
+ if !options[:quiet]
694
+ print cyan, "Changing password for #{user['username']}", reset, "\n"
695
+ end
696
+ # construct change_password payload
697
+
698
+ # use --payload
699
+ if options[:payload]
700
+ payload = options[:payload]
701
+ payload.deep_merge!(parse_passed_options(options))
702
+ else
703
+ # inject -O key=value options
704
+ payload.deep_merge!(parse_passed_options(options))
705
+
706
+ # prompt for password input
707
+ current_input_attempt = 1
708
+ still_prompting = new_password ? false : true
709
+ while still_prompting do
710
+ # New Password
711
+ password_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'password', 'fieldLabel' => 'New Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
712
+ new_password = password_prompt['password']
713
+
714
+ # could validate password is "strong"
715
+ # Confirm New Password
716
+ confirm_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true}], options[:options], @api_client)
717
+ confirm_password = confirm_prompt['passwordConfirmation']
718
+ if confirm_password != new_password
719
+ print_red_alert "Confirm password did not match."
720
+ new_password = nil
721
+ unless ::MtnCloud::Cli::OptionTypes::confirm("Would you like to try again?", options.merge({default: true}))
722
+ return 9, "aborted login"
723
+ end
724
+ end
725
+ still_prompting = !!new_password
726
+ end
727
+ payload = {
728
+ 'user' => {
729
+ 'password' => new_password
730
+ }
731
+ }
732
+
733
+ end
734
+ @account_users_interface.setopts(options)
735
+ if options[:dry_run]
736
+ print_dry_run @account_users_interface.dry.update(account_id, user['id'], payload)
737
+ return
738
+ end
739
+ json_response = @account_users_interface.update(account_id, user['id'], payload)
740
+ render_response(json_response, options, "user") do
741
+ print_green_success "Updated password for user #{user['username']}"
742
+ end
743
+ return exit_code, err
744
+ end
745
+
746
+ def remove(args)
747
+ params = {}
748
+ options = {}
749
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
750
+ opts.banner = subcommand_usage("[user]")
751
+ opts.on('-g','--global', "Global (All Tenants). Find users across all tenants. Default is your own tenant only.") do
752
+ options[:global] = true
753
+ end
754
+ build_standard_remove_options(opts, options, [:account])
755
+ end
756
+ optparse.parse!(args)
757
+
758
+ if args.count < 1
759
+ puts optparse
760
+ return 1
761
+ end
762
+
763
+ connect(options)
764
+ begin
765
+ account = find_account_from_options(options)
766
+ account_id = account ? account['id'] : nil
767
+ params['global'] = true if options[:global]
768
+ user = find_user_by_username_or_id(account_id, args[0], params)
769
+ return 1 if user.nil?
770
+ unless options[:yes] || MtnCloud::Cli::OptionTypes.confirm("Are you sure you want to delete the user #{user['username']}?")
771
+ exit 9, "arborted"
772
+ end
773
+ @account_users_interface.setopts(options)
774
+ if options[:dry_run]
775
+ print_dry_run @account_users_interface.dry.destroy(account_id, user['id'])
776
+ return 0
777
+ end
778
+ json_response = @account_users_interface.destroy(account_id, user['id'])
779
+
780
+ if options[:json]
781
+ print JSON.pretty_generate(json_response)
782
+ print "\n"
783
+ else
784
+ print_green_success "User #{user['username']} removed"
785
+ # list([])
786
+ end
787
+ rescue RestClient::Exception => e
788
+ print_rest_exception(e, options)
789
+ return 1
790
+ end
791
+ end
792
+
793
+ private
794
+
795
+ def add_user_option_types
796
+ [
797
+ {'fieldName' => 'firstName', 'fieldLabel' => 'First Name', 'type' => 'text', 'required' => false, 'displayOrder' => 1},
798
+ {'fieldName' => 'lastName', 'fieldLabel' => 'Last Name', 'type' => 'text', 'required' => false, 'displayOrder' => 2},
799
+ {'fieldName' => 'username', 'fieldLabel' => 'Username', 'type' => 'text', 'required' => true, 'displayOrder' => 3},
800
+ {'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text', 'required' => true, 'displayOrder' => 4},
801
+ {'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'required' => true, 'displayOrder' => 5},
802
+ {'fieldName' => 'passwordConfirmation', 'fieldLabel' => 'Confirm Password', 'type' => 'password', 'required' => true, 'displayOrder' => 6},
803
+ {'fieldName' => 'roles', 'fieldLabel' => 'Roles', 'type' => 'text', 'description' => "Role authorities or IDs (comma separated)", 'displayOrder' => 7},
804
+ {'fieldName' => 'receiveNotifications', 'fieldLabel' => 'Receive Notifications?', 'type' => 'checkbox', 'required' => false, 'defaultValue' => true, 'displayOrder' => 8}
805
+ ]
806
+ end
807
+
808
+ def add_user_advanced_option_types
809
+ [
810
+ {'fieldName' => 'linuxUsername', 'fieldLabel' => 'Linux Username', 'type' => 'text', 'required' => false, 'displayOrder' => 9},
811
+ {'fieldName' => 'linuxPassword', 'fieldLabel' => 'Linux Password', 'type' => 'password', 'required' => false, 'displayOrder' => 10},
812
+ {'fieldName' => 'linuxKeyPairId', 'fieldLabel' => 'SSH Key', 'type' => 'select', 'optionSource' => 'keyPairs', 'required' => false, 'displayOrder' => 11},
813
+ {'fieldName' => 'windowsUsername', 'fieldLabel' => 'Windows Username', 'type' => 'text', 'required' => false, 'displayOrder' => 12},
814
+ {'fieldName' => 'windowsPassword', 'fieldLabel' => 'Windows Password', 'type' => 'text', 'required' => false, 'displayOrder' => 13},
815
+ ]
816
+ end
817
+
818
+ def update_user_option_types
819
+ add_user_option_types.collect {|it|
820
+ it.delete('required')
821
+ it.delete('defaultValue')
822
+ it
823
+ }
824
+ end
825
+
826
+ def update_user_advanced_option_types
827
+ add_user_advanced_option_types.collect {|it|
828
+ it.delete('required')
829
+ it.delete('defaultValue')
830
+ it
831
+ }
832
+ end
833
+
834
+ # prompt user to select roles for a new or existing user
835
+ # options['role'] can be passed as comma separated role names
836
+ # if so, it will be used instead of prompting
837
+ # returns array of role objects
838
+ def prompt_user_roles(account_id, user_id, selected_roles=[], options={})
839
+ passed_role_names = []
840
+ if !selected_roles.empty?
841
+ if selected_roles.is_a?(String)
842
+ passed_role_names = selected_roles.split(',').uniq.compact.collect {|r| r.strip}
843
+ else
844
+ passed_role_names = selected_roles
845
+ end
846
+ end
847
+
848
+ available_roles = @account_users_interface.available_roles(account_id, user_id)['roles']
849
+
850
+ if available_roles.empty?
851
+ print_red_alert "No available roles found."
852
+ exit 1
853
+ end
854
+ role_options = available_roles.collect {|role|
855
+ {'name' => role['authority'], 'value' => role['id']}
856
+ }
857
+
858
+ roles = []
859
+
860
+ if !passed_role_names.empty?
861
+ invalid_role_names = []
862
+ passed_role_names.each do |role_name|
863
+ found_role = available_roles.find {|ar| ar['authority'] == role_name || ar['id'] == role_name.to_i}
864
+ if found_role
865
+ roles << found_role
866
+ else
867
+ invalid_role_names << role_name
868
+ end
869
+ end
870
+ if !invalid_role_names.empty?
871
+ print_red_alert "Invalid Roles: #{invalid_role_names.join(', ')}"
872
+ exit 1
873
+ end
874
+ else
875
+ no_prompt = (options[:no_prompt] || (options[:options] && options[:options][:no_prompt]))
876
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'roles', 'fieldLabel' => 'Role', 'type' => 'select', 'selectOptions' => role_options, 'required' => true}], options[:options])
877
+ role_id = v_prompt['roles']
878
+ roles << available_roles.find {|r| r['id'].to_i == role_id.to_i }
879
+ add_another_role = !no_prompt
880
+ while add_another_role do
881
+ v_prompt = MtnCloud::Cli::OptionTypes.prompt([{'fieldName' => 'roles', 'fieldLabel' => 'Another Role', 'type' => 'select', 'selectOptions' => role_options, 'required' => false}], options[:options])
882
+ if v_prompt['roles'].to_s.empty?
883
+ add_another_role = false
884
+ else
885
+ role_id = v_prompt['roles']
886
+ roles << available_roles.find {|r| r['id'].to_i == role_id.to_i }
887
+ end
888
+ end
889
+
890
+ end
891
+
892
+ roles = roles.compact
893
+ return roles
894
+
895
+ end
896
+
897
+ end