morpheus-cli 5.3.2.3 → 5.4.1

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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/account_users_interface.rb +68 -0
  4. data/lib/morpheus/api/api_client.rb +75 -8
  5. data/lib/morpheus/api/audit_interface.rb +9 -0
  6. data/lib/morpheus/api/clouds_interface.rb +4 -11
  7. data/lib/morpheus/api/health_interface.rb +37 -3
  8. data/lib/morpheus/api/instances_interface.rb +39 -5
  9. data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
  10. data/lib/morpheus/api/load_balancer_profiles_interface.rb +9 -0
  11. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +9 -0
  12. data/lib/morpheus/api/load_balancers_interface.rb +5 -0
  13. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  14. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  15. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  16. data/lib/morpheus/api/network_routers_interface.rb +30 -0
  17. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  18. data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
  19. data/lib/morpheus/api/read_interface.rb +4 -3
  20. data/lib/morpheus/api/rest_interface.rb +5 -4
  21. data/lib/morpheus/api/roles_interface.rb +7 -0
  22. data/lib/morpheus/api/secondary_read_interface.rb +1 -1
  23. data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
  24. data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
  25. data/lib/morpheus/api/storage_servers_interface.rb +9 -0
  26. data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
  27. data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
  28. data/lib/morpheus/api/users_interface.rb +16 -63
  29. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  30. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  31. data/lib/morpheus/cli/cli_command.rb +274 -19
  32. data/lib/morpheus/cli/cli_registry.rb +56 -2
  33. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  34. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  35. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  36. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +1 -4
  37. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  38. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  39. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +17 -89
  40. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  41. data/lib/morpheus/cli/commands/audit.rb +188 -0
  42. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  43. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  44. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  45. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  46. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +1 -1
  47. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  48. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  49. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  50. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  51. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  52. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  53. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  54. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  55. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
  56. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  57. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +86 -49
  58. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  59. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  60. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  61. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  62. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  63. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  64. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  65. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  66. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  67. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  68. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  69. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  70. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  71. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  72. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  73. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  74. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  75. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  76. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  77. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  78. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  79. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  80. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  81. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  82. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +15 -25
  83. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
  84. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  85. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +473 -150
  86. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
  87. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
  88. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  89. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  90. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
  91. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  92. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  93. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  94. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  95. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  96. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  97. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  98. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  99. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  100. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  101. data/lib/morpheus/cli/commands/load_balancer_monitors.rb +71 -0
  102. data/lib/morpheus/cli/commands/load_balancer_pools.rb +91 -0
  103. data/lib/morpheus/cli/commands/load_balancer_profiles.rb +65 -0
  104. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +9 -8
  105. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +156 -0
  106. data/lib/morpheus/cli/commands/load_balancers.rb +176 -0
  107. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  108. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  109. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  110. data/lib/morpheus/cli/commands/logout.rb +63 -0
  111. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  112. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  113. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  114. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  115. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
  116. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  117. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  118. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  119. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  120. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  121. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  122. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  123. data/lib/morpheus/cli/commands/network_firewalls_command.rb +823 -0
  124. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  125. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  126. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  127. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  128. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +387 -57
  129. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  130. data/lib/morpheus/cli/commands/network_static_routes_command.rb +446 -0
  131. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  132. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
  133. data/lib/morpheus/cli/commands/open_command.rb +30 -0
  134. data/lib/morpheus/cli/commands/options.rb +98 -0
  135. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  136. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  137. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +1 -8
  138. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  139. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  140. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  141. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +7 -7
  142. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  143. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  144. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  145. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  146. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  147. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +5 -9
  148. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  149. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  150. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +245 -40
  151. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  152. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  153. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  154. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  155. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  156. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  157. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  158. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +4 -105
  159. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  160. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  161. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  162. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  163. data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
  164. data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
  165. data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
  166. data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
  167. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  168. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  169. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  170. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +1 -8
  171. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  172. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  173. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +1 -2
  174. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +2 -1
  175. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +1 -2
  176. data/lib/morpheus/cli/{users.rb → commands/users.rb} +28 -35
  177. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  178. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  179. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  180. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  181. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
  182. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  183. data/lib/morpheus/cli/commands/view.rb +102 -0
  184. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
  185. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  186. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  187. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  188. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  189. data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
  190. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +26 -6
  191. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  192. data/lib/morpheus/cli/mixins/print_helper.rb +51 -18
  193. data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
  194. data/lib/morpheus/cli/mixins/provisioning_helper.rb +167 -110
  195. data/lib/morpheus/cli/mixins/rest_command.rb +268 -94
  196. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +668 -0
  197. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
  198. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
  199. data/lib/morpheus/cli/option_parser.rb +25 -17
  200. data/lib/morpheus/cli/option_types.rb +137 -52
  201. data/lib/morpheus/cli/version.rb +1 -1
  202. data/lib/morpheus/cli.rb +6 -128
  203. data/lib/morpheus/ext/string.rb +29 -6
  204. data/lib/morpheus/routes.rb +238 -0
  205. data/lib/morpheus/terminal.rb +5 -6
  206. data/lib/morpheus/util.rb +6 -1
  207. data/morpheus-cli.gemspec +1 -1
  208. metadata +183 -149
  209. data/lib/morpheus/cli/change_password_command.rb +0 -147
  210. data/lib/morpheus/cli/library.rb +0 -1
  211. data/lib/morpheus/cli/load_balancers.rb +0 -245
  212. data/lib/morpheus/cli/logout.rb +0 -81
@@ -1,12 +1,9 @@
1
- require 'rest_client'
2
- require 'optparse'
3
- require 'filesize'
4
1
  require 'morpheus/cli/cli_command'
5
- require 'morpheus/cli/mixins/infrastructure_helper'
6
2
 
7
3
  class Morpheus::Cli::CloudResourcePoolsCommand
8
4
  include Morpheus::Cli::CliCommand
9
5
  include Morpheus::Cli::InfrastructureHelper
6
+ include Morpheus::Cli::OptionSourceHelper
10
7
 
11
8
  #set_command_name :'cloud-resource-pools'
12
9
  set_command_name :'resource-pools'
@@ -191,6 +188,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
191
188
  "Status" => lambda {|it| it['status'].to_s.capitalize },
192
189
  "Tenants" => lambda {|it| it['tenants'] ? it['tenants'].collect {|it| it['name'] }.uniq.join(', ') : '' }
193
190
  }
191
+
192
+ if cloud['zoneType']['code'] == 'openstack'
193
+ role = resource_pool['config']['roleId'] ? load_option_source_data('openstackRoles', {zoneId: cloud['id']}).find {|it| it['value'] == resource_pool['config']['roleId']} : nil
194
+ description_cols['Role'] = lambda {|it| role ? role['name'] : ''}
195
+ end
196
+
194
197
  print_description_list(description_cols, resource_pool)
195
198
 
196
199
  if resource_pool['resourcePermission'].nil?
@@ -329,8 +332,14 @@ class Morpheus::Cli::CloudResourcePoolsCommand
329
332
  opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
330
333
  options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
331
334
  end
332
- build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
333
- opts.footer = "Update a resource pool." + "\n" +
335
+ opts.on("--description [TEXT]", String, "Description") do |val|
336
+ options['description'] = val.to_s
337
+ end
338
+ opts.on( '--role ROLE', String, "Role Name or ID (applicable to select resource pools)" ) do |val|
339
+ options[:role] = val
340
+ end
341
+ build_standard_add_options(opts, options)
342
+ opts.footer = "Add a resource pool." + "\n" +
334
343
  "[cloud] is required. This is the name or id of the cloud."
335
344
  end
336
345
  optparse.parse!(args)
@@ -349,151 +358,156 @@ class Morpheus::Cli::CloudResourcePoolsCommand
349
358
 
350
359
  connect(options)
351
360
 
352
- begin
353
- # load cloud
354
- if cloud_id.nil?
355
- puts_error "#{Morpheus::Terminal.angry_prompt}missing required option: [cloud]\n#{optparse}"
356
- return 1
357
- end
358
- cloud = find_cloud_by_name_or_id(cloud_id)
359
- return 1 if cloud.nil?
360
-
361
- # merge -O options into normally parsed options
362
- options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
361
+ # load cloud
362
+ if cloud_id.nil?
363
+ puts_error "#{Morpheus::Terminal.angry_prompt}missing required option: [cloud]\n#{optparse}"
364
+ return 1
365
+ end
366
+ cloud = find_cloud_by_name_or_id(cloud_id)
367
+ return 1 if cloud.nil?
363
368
 
364
- # construct payload
365
- payload = nil
366
- if options[:payload]
367
- payload = options[:payload]
368
- else
369
- # prompt for resource pool options
370
- payload = {
371
- 'resourcePool' => {
372
- }
369
+ # merge -O options into normally parsed options
370
+ options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
371
+
372
+ # construct payload
373
+ payload = nil
374
+ if options[:payload]
375
+ payload = options[:payload]
376
+ else
377
+ # prompt for resource pool options
378
+ payload = {
379
+ 'resourcePool' => {
373
380
  }
374
-
375
- # allow arbitrary -O options
376
- payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
381
+ }
377
382
 
383
+ # allow arbitrary -O options
384
+ payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
378
385
 
379
- # Name
380
- if options['name']
381
- payload['resourcePool']['name'] = options['name']
382
- else
383
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options)
384
- payload['resourcePool']['name'] = v_prompt['name']
385
- end
386
+ # Name
387
+ if options['name']
388
+ payload['resourcePool']['name'] = options['name']
389
+ else
390
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Name'}], options)
391
+ payload['resourcePool']['name'] = v_prompt['name']
392
+ end
386
393
 
387
- # Group Access
388
- if group_access_all != nil
394
+ # Group Access
395
+ if group_access_all != nil
396
+ payload['resourcePermissions'] ||= {}
397
+ payload['resourcePermissions']['all'] = group_access_all
398
+ else
399
+ # default to all
400
+ if payload['resourcePermissions'].nil? || payload['resourcePermissions']['all'].nil?
389
401
  payload['resourcePermissions'] ||= {}
390
- payload['resourcePermissions']['all'] = group_access_all
391
- else
392
- # default to all
393
- if payload['resourcePermissions'].nil? || payload['resourcePermissions']['all'].nil?
394
- payload['resourcePermissions'] ||= {}
395
- payload['resourcePermissions']['all'] = true
396
- end
402
+ payload['resourcePermissions']['all'] = true
397
403
  end
398
- if group_access_list != nil
399
- payload['resourcePermissions'] ||= {}
400
- payload['resourcePermissions']['sites'] = group_access_list.collect do |site_id|
401
- site = {"id" => site_id.to_i}
402
- if group_defaults_list && group_defaults_list.include?(site_id)
403
- site["default"] = true
404
- end
405
- site
404
+ end
405
+ if group_access_list != nil
406
+ payload['resourcePermissions'] ||= {}
407
+ payload['resourcePermissions']['sites'] = group_access_list.collect do |site_id|
408
+ site = {"id" => site_id.to_i}
409
+ if group_defaults_list && group_defaults_list.include?(site_id)
410
+ site["default"] = true
406
411
  end
412
+ site
407
413
  end
414
+ end
408
415
 
409
- # Service Plan Access
410
- if plan_access_all != nil
416
+ # Service Plan Access
417
+ if plan_access_all != nil
418
+ payload['resourcePermissions'] ||= {}
419
+ payload['resourcePermissions']['allPlans'] = plan_access_all
420
+ else
421
+ # default to all
422
+ if payload['resourcePermissions'].nil? || payload['resourcePermissions']['allPlans'].nil?
411
423
  payload['resourcePermissions'] ||= {}
412
- payload['resourcePermissions']['allPlans'] = plan_access_all
413
- else
414
- # default to all
415
- if payload['resourcePermissions'].nil? || payload['resourcePermissions']['allPlans'].nil?
416
- payload['resourcePermissions'] ||= {}
417
- payload['resourcePermissions']['allPlans'] = true
418
- end
424
+ payload['resourcePermissions']['allPlans'] = true
419
425
  end
420
- if plan_access_list != nil
421
- payload['resourcePermissions'] ||= {}
422
- payload['resourcePermissions']['plans'] = plan_access_list.collect do |site_id|
423
- site = {"id" => site_id.to_i}
424
- if plan_defaults_list && plan_defaults_list.include?(site_id)
425
- site["default"] = true
426
- end
427
- site
426
+ end
427
+ if plan_access_list != nil
428
+ payload['resourcePermissions'] ||= {}
429
+ payload['resourcePermissions']['plans'] = plan_access_list.collect do |site_id|
430
+ site = {"id" => site_id.to_i}
431
+ if plan_defaults_list && plan_defaults_list.include?(site_id)
432
+ site["default"] = true
428
433
  end
434
+ site
429
435
  end
436
+ end
430
437
 
431
- # Tenants
432
- if options['tenants']
433
- payload['tenantPermissions'] = {}
434
- payload['tenantPermissions']['accounts'] = options['tenants']
435
- end
436
-
437
- # Active
438
- if options['active'] != nil
439
- payload['resourcePool']['active'] = options['active']
440
- else
441
- payload['resourcePool']['active'] = true
442
- end
438
+ # Tenants
439
+ if options['tenants']
440
+ payload['tenantPermissions'] = {}
441
+ payload['tenantPermissions']['accounts'] = options['tenants']
442
+ end
443
443
 
444
- # Default
445
- if options['defaultPool'] != nil
446
- payload['resourcePool']['defaultPool'] = options['defaultPool']
447
- end
448
-
449
- # Visibility
450
- if options['visibility'] != nil
451
- payload['resourcePool']['visibility'] = options['visibility']
452
- else
453
- payload['resourcePool']['visibility'] = 'private'
454
- end
455
-
456
-
457
- # Config options depend on type (until api returns these as optionTypes)
458
- zone_type = cloud['zoneType'] ? cloud['zoneType']['code'] : ''
459
- if zone_type == 'amazon'
460
- payload['resourcePool']['config'] ||= {}
461
- # CIDR
462
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'cidrBlock', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => true, 'description' => 'Provide the base CIDR Block to use for this VPC (must be between a /16 and /28 Block)'}], options)
463
- payload['resourcePool']['config']['cidrBlock'] = v_prompt['config']['cidrBlock']
464
- # Tenancy
465
- v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'tenancy', 'fieldLabel' => 'Tenancy', 'type' => 'select', 'selectOptions' => [{'name' => 'Default', 'value' => 'default'}, {'name' => 'Dedicated', 'value' => 'dedicated'}], 'defaultValue' => 'default'}], options)
466
- payload['resourcePool']['config']['tenancy'] = v_prompt['config']['tenancy']
467
-
468
- elsif zone_type == 'azure'
469
- # no options
470
- elsif zone_type == 'cloudFoundry' || zone_type == 'bluemixCloudFoundry'
471
-
472
- elsif zone_type == 'standard'
473
- # no options
474
- else
475
- #raise_command_error "Cloud type '#{zone_type}' does not allow creating resource pools"
476
- end
444
+ # Active
445
+ if options['active'] != nil
446
+ payload['resourcePool']['active'] = options['active']
447
+ else
448
+ payload['resourcePool']['active'] = true
449
+ end
477
450
 
451
+ # Default
452
+ if options['defaultPool'] != nil
453
+ payload['resourcePool']['defaultPool'] = options['defaultPool']
478
454
  end
479
- @cloud_resource_pools_interface.setopts(options)
480
- if options[:dry_run]
481
- print_dry_run @cloud_resource_pools_interface.dry.create(cloud['id'], payload)
482
- return
455
+
456
+ # Visibility
457
+ if options['visibility'] != nil
458
+ payload['resourcePool']['visibility'] = options['visibility']
459
+ else
460
+ payload['resourcePool']['visibility'] = 'private'
483
461
  end
484
- json_response = @cloud_resource_pools_interface.create(cloud['id'], payload)
485
- if options[:json]
486
- puts as_json(json_response)
462
+
463
+
464
+ # Config options depend on type (until api returns these as optionTypes)
465
+ zone_type = cloud['zoneType'] ? cloud['zoneType']['code'] : ''
466
+ if zone_type == 'amazon'
467
+ payload['resourcePool']['config'] ||= {}
468
+ # CIDR
469
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'cidrBlock', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => true, 'description' => 'Provide the base CIDR Block to use for this VPC (must be between a /16 and /28 Block)'}], options)
470
+ payload['resourcePool']['config']['cidrBlock'] = v_prompt['config']['cidrBlock']
471
+ # Tenancy
472
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'tenancy', 'fieldLabel' => 'Tenancy', 'type' => 'select', 'selectOptions' => [{'name' => 'Default', 'value' => 'default'}, {'name' => 'Dedicated', 'value' => 'dedicated'}], 'defaultValue' => 'default'}], options)
473
+ payload['resourcePool']['config']['tenancy'] = v_prompt['config']['tenancy']
474
+
475
+ elsif zone_type == 'azure'
476
+ # no options
477
+ elsif zone_type == 'cloudFoundry' || zone_type == 'bluemixCloudFoundry'
478
+
479
+ elsif zone_type == 'openstack'
480
+ payload['resourcePool']['config'] ||= {}
481
+ # Description
482
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text'}], options)
483
+ payload['resourcePool']['description'] = v_prompt['description']
484
+ # Role
485
+ role_options = load_option_source_data('openstackRoles', {zoneId: cloud['id']})
486
+ if role = options[:role] ? role_options.find {|it| [it['name'], it['value']].include?(options[:role])} : nil
487
+ payload['resourcePool']['config']['roleId'] = role['value']
488
+ else
489
+ v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'config', 'fieldName' => 'roleId', 'fieldLabel' => 'Role', 'type' => 'select', 'selectOptions' => role_options, 'required' => true}], options, @api_client,{zoneId: cloud['id']})
490
+ payload['resourcePool']['config']['roleId'] = v_prompt['config']['roleId']
491
+ end
492
+ elsif zone_type == 'standard'
493
+ # no options
487
494
  else
488
- resource_pool = json_response['resourcePool']
489
- print_green_success "Created resource pool #{resource_pool['name']}"
490
- get([cloud['id'].to_s, resource_pool['id'].to_s])
495
+ #raise_command_error "Cloud type '#{zone_type}' does not allow creating resource pools"
491
496
  end
492
- return 0
493
- rescue RestClient::Exception => e
494
- print_rest_exception(e, options)
495
- return 1
496
497
  end
498
+
499
+ @cloud_resource_pools_interface.setopts(options)
500
+ if options[:dry_run]
501
+ print_dry_run @cloud_resource_pools_interface.dry.create(cloud['id'], payload)
502
+ return
503
+ end
504
+ json_response = @cloud_resource_pools_interface.create(cloud['id'], payload)
505
+ render_response(json_response, options, 'resourcePool') do
506
+ resource_pool = json_response['resourcePool']
507
+ print_green_success "Created resource pool #{resource_pool['name']}"
508
+ get([cloud['id'].to_s, resource_pool['id'].to_s])
509
+ end
510
+ return 0, nil
497
511
  end
498
512
 
499
513
  def update(args)
@@ -563,6 +577,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
563
577
  opts.on('--default-pool [on|off]', String, "Set resource pool as the default") do |val|
564
578
  options['defaultPool'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
565
579
  end
580
+ opts.on("--description [TEXT]", String, "Description") do |val|
581
+ options['description'] = val.to_s
582
+ end
583
+ opts.on( '--role ROLE', String, "Role Name or ID (applicable to select resource pools)" ) do |val|
584
+ options['role'] = val
585
+ end
566
586
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
567
587
  opts.footer = "Update a resource pool." + "\n" +
568
588
  "[cloud] is required. This is the name or id of the cloud." + "\n"
@@ -591,7 +611,7 @@ class Morpheus::Cli::CloudResourcePoolsCommand
591
611
 
592
612
  resource_pool = find_resource_pool_by_name_or_id(cloud['id'], resource_pool_id)
593
613
  return 1 if resource_pool.nil?
594
-
614
+
595
615
  # merge -O options into normally parsed options
596
616
  options.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
597
617
 
@@ -605,11 +625,11 @@ class Morpheus::Cli::CloudResourcePoolsCommand
605
625
  'resourcePool' => {
606
626
  }
607
627
  }
608
-
628
+
609
629
  # allow arbitrary -O options
610
630
  payload['resourcePool'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
611
631
 
612
-
632
+
613
633
  # Group Access
614
634
  if group_access_all != nil
615
635
  payload['resourcePermissions'] ||= {}
@@ -657,12 +677,26 @@ class Morpheus::Cli::CloudResourcePoolsCommand
657
677
  if options['defaultPool'] != nil
658
678
  payload['resourcePool']['defaultPool'] = options['defaultPool']
659
679
  end
660
-
680
+
661
681
  # Visibility
662
682
  if options['visibility'] != nil
663
683
  payload['resourcePool']['visibility'] = options['visibility']
664
684
  end
665
685
 
686
+ # Description
687
+ if options['description'] != nil
688
+ payload['resourcePool']['description'] = options['description']
689
+ end
690
+
691
+ # Role
692
+ if options['role'] != nil
693
+ role_options = load_option_source_data('openstackRoles', {zoneId: cloud['id']})
694
+ if role = role_options.find {|it| [it['name'], it['value']].include?(options['role'])}
695
+ payload['resourcePool']['config'] ||= {}
696
+ payload['resourcePool']['config']['roleId'] = role['value']
697
+ end
698
+ end
699
+
666
700
  if payload['resourcePool'].empty? && payload['resourcePermissions'].nil? && payload['tenantPermissions'].nil?
667
701
  raise_command_error "Specify at least one option to update.\n#{optparse}"
668
702
  end
@@ -674,14 +708,12 @@ class Morpheus::Cli::CloudResourcePoolsCommand
674
708
  return
675
709
  end
676
710
  json_response = @cloud_resource_pools_interface.update(cloud['id'], resource_pool["id"], payload)
677
- if options[:json]
678
- puts as_json(json_response)
679
- else
711
+ render_response(json_response, options, 'resourcePool') do
680
712
  resource_pool = json_response['resourcePool']
681
713
  print_green_success "Updated resource pool #{resource_pool['name']}"
682
714
  get([cloud['id'].to_s, resource_pool['id'].to_s])
683
715
  end
684
- return 0
716
+ return 0, nil
685
717
  rescue RestClient::Exception => e
686
718
  print_rest_exception(e, options)
687
719
  return 1
@@ -783,7 +815,7 @@ class Morpheus::Cli::CloudResourcePoolsCommand
783
815
  print_red_alert "Resource Pool not found by name #{name}"
784
816
  return nil
785
817
  elsif resource_pools.size > 1
786
- matching_resource_pools = folders.select { |it| name && (it['name'] == name || it['externalId'] == name) }
818
+ matching_resource_pools = resource_pools.select { |it| name && (it['name'] == name || it['externalId'] == name) }
787
819
  if matching_resource_pools.size == 1
788
820
  return matching_resource_pools[0]
789
821
  end
@@ -1,11 +1,4 @@
1
- # require 'yaml'
2
- require 'io/console'
3
- require 'rest_client'
4
- require 'optparse'
5
1
  require 'morpheus/cli/cli_command'
6
- require 'morpheus/cli/mixins/infrastructure_helper'
7
- require 'morpheus/cli/mixins/provisioning_helper'
8
- require 'morpheus/cli/option_types'
9
2
 
10
3
  class Morpheus::Cli::Clouds
11
4
  include Morpheus::Cli::CliCommand
@@ -27,8 +20,6 @@ class Morpheus::Cli::Clouds
27
20
  @clouds_interface = @api_client.clouds
28
21
  @groups_interface = @api_client.groups
29
22
  @active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
30
- # preload stuff
31
- get_available_cloud_types()
32
23
  end
33
24
 
34
25
  def handle(args)
@@ -134,38 +125,36 @@ class Morpheus::Cli::Clouds
134
125
 
135
126
  def get(args)
136
127
  options = {}
128
+ params = {}
137
129
  optparse = Morpheus::Cli::OptionParser.new do |opts|
138
130
  opts.banner = subcommand_usage("[name]")
139
- build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
131
+ build_standard_list_options(opts, options)
140
132
  opts.footer = "Get details about a cloud.\n" +
141
133
  "[name] is required. This is the name or id of a cloud."
142
134
  end
143
135
  optparse.parse!(args)
144
- if args.count < 1
145
- puts optparse
146
- exit 1
147
- end
136
+ verify_args!(args:args, optparse:optparse, min:1)
148
137
  connect(options)
138
+ params.merge!(parse_query_options(options))
149
139
  id_list = parse_id_list(args)
150
140
  return run_command_for_each_arg(id_list) do |arg|
151
- _get(arg, options)
141
+ _get(arg, params, options)
152
142
  end
153
143
  end
154
144
 
155
- def _get(arg, options={})
156
- begin
157
- if options[:dry_run]
158
- @clouds_interface.setopts(options)
159
- if arg.to_s =~ /\A\d{1,}\Z/
160
- print_dry_run @clouds_interface.dry.get(arg.to_i)
161
- else
162
- print_dry_run @clouds_interface.dry.list({name:arg})
163
- end
164
- return
165
- end
166
- cloud = find_cloud_by_name_or_id(arg)
167
- @clouds_interface.setopts(options)
168
- json_response = @clouds_interface.get(cloud['id'])
145
+ def _get(id, params, options={})
146
+ cloud = nil
147
+ if id.to_s !~ /\A\d{1,}\Z/
148
+ cloud = find_cloud_by_name_or_id(id)
149
+ id = cloud['id']
150
+ end
151
+ @clouds_interface.setopts(options)
152
+ if options[:dry_run]
153
+ print_dry_run @clouds_interface.dry.get(id.to_i, params)
154
+ return
155
+ end
156
+ json_response = @clouds_interface.get(id, params)
157
+ render_response(json_response, options, 'zone') do
169
158
  cloud = json_response['zone']
170
159
  cloud_stats = cloud['stats']
171
160
  # serverCounts moved to zone.stats.serverCounts
@@ -175,17 +164,6 @@ class Morpheus::Cli::Clouds
175
164
  else
176
165
  server_counts = json_response['serverCounts'] # legacy
177
166
  end
178
- if options[:json]
179
- puts as_json(json_response, options, 'zone')
180
- return 0
181
- elsif options[:yaml]
182
- puts as_yaml(json_response, options, 'zone')
183
- return 0
184
- end
185
- if options[:csv]
186
- puts records_as_csv([json_response['zone']], options)
187
- return 0
188
- end
189
167
  cloud_type = cloud_type_for_id(cloud['zoneTypeId'])
190
168
  print_h1 "Cloud Details"
191
169
  print cyan
@@ -195,6 +173,7 @@ class Morpheus::Cli::Clouds
195
173
  "Type" => lambda {|it| cloud_type ? cloud_type['name'] : '' },
196
174
  "Code" => 'code',
197
175
  "Location" => 'location',
176
+ "Region Code" => 'regionCode',
198
177
  "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
199
178
  "Groups" => lambda {|it| it['groups'].collect {|g| g.instance_of?(Hash) ? g['name'] : g.to_s }.join(', ') },
200
179
  #"Owner" => lambda {|it| it['owner'].instance_of?(Hash) ? it['owner']['name'] : it['ownerId'] },
@@ -214,14 +193,9 @@ class Morpheus::Cli::Clouds
214
193
  print "Unmanaged: #{server_counts['unmanaged']}".center(20)
215
194
  print "\n"
216
195
  end
217
-
218
196
  print reset,"\n"
219
-
220
- #puts instance
221
- rescue RestClient::Exception => e
222
- print_rest_exception(e, options)
223
- exit 1
224
197
  end
198
+ return 0, nil
225
199
  end
226
200
 
227
201
  def add(args)
@@ -954,13 +928,14 @@ class Morpheus::Cli::Clouds
954
928
  name: cloud['name'],
955
929
  type: cloud_type ? cloud_type['name'] : '',
956
930
  location: cloud['location'],
931
+ "REGION CODE": cloud['regionCode'],
957
932
  groups: (cloud['groups'] || []).collect {|it| it.instance_of?(Hash) ? it['name'] : it.to_s }.join(', '),
958
933
  servers: cloud['serverCount'],
959
934
  status: format_cloud_status(cloud)
960
935
  }
961
936
  end
962
937
  columns = [
963
- :id, :name, :type, :location, :groups, :servers, :status
938
+ :id, :name, :type, :location, "REGION CODE", :groups, :servers, :status
964
939
  ]
965
940
  print as_pretty_table(rows, columns, opts)
966
941
  end