morpheus-cli 5.3.2.2 → 5.4.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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +26 -1
  4. data/lib/morpheus/api/clouds_interface.rb +4 -11
  5. data/lib/morpheus/api/health_interface.rb +37 -3
  6. data/lib/morpheus/api/instances_interface.rb +18 -5
  7. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  8. data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
  9. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
  10. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  11. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  12. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  13. data/lib/morpheus/api/network_routers_interface.rb +21 -0
  14. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  15. data/lib/morpheus/api/rest_interface.rb +2 -1
  16. data/lib/morpheus/api/roles_interface.rb +7 -0
  17. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  18. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  19. data/lib/morpheus/cli/cli_command.rb +21 -14
  20. data/lib/morpheus/cli/cli_registry.rb +56 -2
  21. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  22. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  23. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  24. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +0 -3
  25. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  26. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  27. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +3 -11
  28. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  29. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  30. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  31. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  32. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  33. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +0 -0
  34. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  35. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  36. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  37. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  38. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  39. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  40. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  41. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  42. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
  43. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  44. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +51 -39
  45. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  46. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  47. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  48. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  49. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  50. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  51. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  52. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  53. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  54. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  55. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  56. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  57. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  58. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  59. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  60. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  61. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  62. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  63. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  64. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  65. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  66. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  67. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  68. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  69. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +0 -10
  70. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
  71. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  72. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +364 -148
  73. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
  74. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
  75. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  76. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  77. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
  78. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  79. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  80. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  81. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  82. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  83. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  84. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  85. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  86. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  87. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  88. data/lib/morpheus/cli/commands/load_balancer_pools.rb +111 -0
  89. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +0 -4
  90. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +136 -0
  91. data/lib/morpheus/cli/commands/load_balancers.rb +89 -0
  92. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  93. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  94. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  95. data/lib/morpheus/cli/commands/logout.rb +63 -0
  96. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  97. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  98. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  99. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  100. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
  101. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  102. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  103. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  104. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  105. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  106. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  107. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  108. data/lib/morpheus/cli/commands/network_firewalls_command.rb +806 -0
  109. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  110. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  111. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  112. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  113. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +291 -12
  114. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  115. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  116. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
  117. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  118. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  119. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +0 -7
  120. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  121. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  122. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  123. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +0 -0
  124. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  125. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  126. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  127. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  128. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  129. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +1 -7
  130. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  131. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  132. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +244 -39
  133. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  134. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  135. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  136. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  137. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  138. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  139. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  140. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +2 -103
  141. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  142. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  143. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  144. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  145. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  146. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  147. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  148. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +0 -7
  149. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  150. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  151. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +0 -1
  152. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +0 -0
  153. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +0 -1
  154. data/lib/morpheus/cli/{users.rb → commands/users.rb} +0 -7
  155. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  156. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  157. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  158. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  159. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
  160. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  161. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
  162. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  163. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  164. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  165. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  166. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
  167. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  168. data/lib/morpheus/cli/mixins/print_helper.rb +1 -0
  169. data/lib/morpheus/cli/mixins/provisioning_helper.rb +155 -112
  170. data/lib/morpheus/cli/mixins/rest_command.rb +154 -52
  171. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +575 -0
  172. data/lib/morpheus/cli/option_parser.rb +25 -17
  173. data/lib/morpheus/cli/option_types.rb +96 -32
  174. data/lib/morpheus/cli/version.rb +1 -1
  175. data/lib/morpheus/cli.rb +5 -128
  176. data/lib/morpheus/terminal.rb +5 -6
  177. data/morpheus-cli.gemspec +1 -1
  178. metadata +156 -143
  179. data/lib/morpheus/cli/change_password_command.rb +0 -147
  180. data/lib/morpheus/cli/library.rb +0 -1
  181. data/lib/morpheus/cli/load_balancers.rb +0 -245
  182. data/lib/morpheus/cli/logout.rb +0 -81
@@ -33,14 +33,21 @@ module Morpheus
33
33
  end
34
34
  end
35
35
 
36
+ # supresses prompting unless --prompt has been passed
36
37
  def self.no_prompt(option_types, options={}, api_client=nil,api_params={})
37
- prompt(option_types, options, api_client, api_params, true)
38
+ if options[:always_prompt]
39
+ prompt(option_types, options, api_client, api_params)
40
+ else
41
+ prompt(option_types, options, api_client, api_params, true)
42
+ end
38
43
  end
39
44
 
40
45
  def self.prompt(option_types, options={}, api_client=nil, api_params={}, no_prompt=false, paging_enabled=false)
41
46
  paging_enabled = false if Morpheus::Cli.windows?
47
+ no_prompt = no_prompt || options[:no_prompt]
42
48
  results = {}
43
49
  options = options || {}
50
+
44
51
  # inject cli only stuff into option_types (should clone() here)
45
52
  option_types.each do |option_type|
46
53
  if options[:help_field_prefix]
@@ -54,19 +61,17 @@ module Morpheus
54
61
  # puts "Options Prompt #{options}"
55
62
  # Sort options by default, group, advanced
56
63
  cur_field_group = 'default'
57
- (
58
- option_types.reject {|it| (it['fieldGroup'] || 'default') != 'default'}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i} +
59
- option_types.reject {|it| ['default', 'advanced'].include?(it['fieldGroup'] || 'default')}.sort{|a,b| a['displayOrder'] <=> b['displayOrder']}.group_by{|it| it['fieldGroup']}.values.collect { |it| it.sort{|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}}.flatten +
60
- option_types.reject {|it| it['fieldGroup'] != 'advanced'}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}
61
- ).each do |option_type|
64
+ self.sorted_option_types(option_types).each do |option_type|
62
65
  context_map = results
63
66
  value = nil
64
- value_found=false
67
+ value_found = false
68
+ field_group = (option_type['fieldGroup'] || 'default').to_s.sub(/options\Z/i, "").strip # avoid "ADVANCED OPTION OPTIONS"
65
69
 
66
- if cur_field_group != (option_type['fieldGroup'] || 'default')
67
- cur_field_group = option_type['fieldGroup']
68
- cur_field_group = cur_field_group.to_s.sub(/options\Z/i, "").strip # avoid "ADVANCED OPTION OPTIONS"
69
- print "\n#{cur_field_group.upcase} OPTIONS\n#{"=" * ("#{cur_field_group} OPTIONS".length)}\n\n"
70
+ if cur_field_group != field_group
71
+ cur_field_group = field_group
72
+ if !no_prompt
73
+ print "\n#{cur_field_group.upcase} OPTIONS\n#{"=" * ("#{cur_field_group} OPTIONS".length)}\n\n"
74
+ end
70
75
  end
71
76
 
72
77
  # How about this instead?
@@ -102,10 +107,10 @@ module Morpheus
102
107
  end
103
108
 
104
109
  found_dep_value = match_type == 'all' ? true : false
105
- visible_option_check_value.split(',').each do |value|
110
+ visible_option_check_value.sub(',', ' ').split(' ').each do |value|
106
111
  parts = value.split(':')
107
112
  depends_on_code = parts[0]
108
- depends_on_value = parts.count > 1 ? parts[1].to_s.strip : '.'
113
+ depends_on_value = parts.count > 1 ? parts[1].to_s.strip : nil
109
114
  depends_on_option_type = option_types.find {|it| it["code"] == depends_on_code }
110
115
  if !depends_on_option_type
111
116
  depends_on_option_type = option_types.find {|it|
@@ -115,13 +120,18 @@ module Morpheus
115
120
 
116
121
  if depends_on_option_type
117
122
  depends_on_field_key = depends_on_option_type['fieldContext'].nil? || depends_on_option_type['fieldContext'].empty? ? "#{depends_on_option_type['fieldName']}" : "#{depends_on_option_type['fieldContext']}.#{depends_on_option_type['fieldName']}"
118
- field_value = get_object_value(results, depends_on_field_key) || get_object_value(options, depends_on_field_key)
123
+ else
124
+ depends_on_field_key = depends_on_code
125
+ end
119
126
 
120
- if !field_value.nil? && field_value.match?(depends_on_value)
121
- found_dep_value = true if match_type != 'all'
122
- else
123
- found_dep_value = false if match_type == 'all'
124
- end
127
+ field_value = get_object_value(results, depends_on_field_key) ||
128
+ get_object_value(options, depends_on_field_key) ||
129
+ get_object_value(api_params, depends_on_field_key)
130
+
131
+ if !field_value.nil? && (depends_on_value.nil? || depends_on_value.empty? || field_value.match?(depends_on_value))
132
+ found_dep_value = true if match_type != 'all'
133
+ else
134
+ found_dep_value = false if match_type == 'all'
125
135
  end
126
136
  end
127
137
  next if !found_dep_value
@@ -185,7 +195,6 @@ module Morpheus
185
195
  end
186
196
  # no_prompt means skip prompting and instead
187
197
  # use default value or error if a required option is not present
188
- no_prompt = no_prompt || options[:no_prompt]
189
198
  if no_prompt
190
199
  if !value_found
191
200
  if option_type['defaultValue'] != nil && !['select', 'multiSelect','typeahead','multiTypeahead'].include?(option_type['type'])
@@ -237,7 +246,7 @@ module Morpheus
237
246
  # I suppose the entered value should take precedence
238
247
  # api_params = api_params.merge(options) # this might be good enough
239
248
  # dup it
240
- value = select_prompt(option_type, api_client, (option_type['noParams'] ? {} : (api_params || {}).merge(results)), options[:no_prompt], nil, paging_enabled)
249
+ value = select_prompt(option_type, api_client, (option_type['noParams'] ? {} : (api_params || {}).deep_merge(results)), options[:no_prompt], nil, paging_enabled)
241
250
  if value && option_type['type'] == 'multiSelect'
242
251
  value = [value]
243
252
  while self.confirm("Add another #{option_type['fieldLabel']}?", {:default => false}) do
@@ -261,8 +270,11 @@ module Morpheus
261
270
  end
262
271
  end
263
272
  elsif option_type['type'] == 'hidden'
264
- value = option_type['defaultValue']
265
- input = value
273
+ if option_type['optionSource'].nil?
274
+ value = option_type['defaultValue']
275
+ else
276
+ value = load_source_options(option_type['optionSource'], option_type['optionSourceType'], api_client, api_params || {})
277
+ end
266
278
  elsif option_type['type'] == 'file'
267
279
  value = file_prompt(option_type)
268
280
  elsif option_type['type'] == 'file-content'
@@ -276,7 +288,8 @@ module Morpheus
276
288
  value = [value] if !value.nil? && !value.is_a?(Array)
277
289
  # parent_context_map[parent_ns] = value
278
290
  end
279
- context_map[field_name] = value
291
+ context_map[field_name] = value if !(value.nil? || (value.is_a?(Hash) && value.empty?))
292
+ parent_context_map.reject! {|k,v| k == parent_ns && (v.nil? || (v.is_a?(Hash) && v.empty?))}
280
293
  end
281
294
  results
282
295
  end
@@ -504,7 +517,9 @@ module Morpheus
504
517
  # this works like select_prompt, but refreshes options with ?query=value between inputs
505
518
  # paging_enabled is ignored right now
506
519
  def self.typeahead_prompt(option_type,api_client, api_params={}, no_prompt=false, use_value=nil, paging_enabled=false)
507
- select_options = []
520
+ paging_enabled = false if Morpheus::Cli.windows?
521
+ paging = nil
522
+ select_options = nil
508
523
  field_key = [option_type['fieldContext'], option_type['fieldName']].select {|it| it && it != '' }.join('.')
509
524
  help_field_key = option_type[:help_field_prefix] ? "#{option_type[:help_field_prefix]}.#{field_key}" : field_key
510
525
  input = ""
@@ -538,7 +553,8 @@ module Morpheus
538
553
  matches
539
554
  }
540
555
  # prompt for typeahead input value
541
- input = Readline.readline("#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{!default_value.to_s.empty? ? ' ['+default_value.to_s+']' : ''} ['?' for options]: ", false).to_s
556
+ has_more_pages = paging && ((paging[:cur_page] + 1) * paging[:page_size]) < paging[:total]
557
+ input = Readline.readline("#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{!default_value.to_s.empty? ? ' ['+default_value.to_s+']' : ''} ['?' for#{has_more_pages ? ' more ' : ' '}options]: ", false).to_s
542
558
  input = input.chomp.strip
543
559
  end
544
560
 
@@ -565,8 +581,22 @@ module Morpheus
565
581
  # looking for help with this input
566
582
  if input == '?'
567
583
  help_prompt(option_type)
568
- select_options = load_options(option_type, api_client, api_params)
569
- display_select_options(option_type, select_options) unless select_options.empty?
584
+ select_options = select_options || load_options(option_type, api_client, api_params)
585
+
586
+ if !select_options.empty?
587
+ if paging_enabled
588
+ if paging.nil?
589
+ option_count = select_options ? select_options.count : 0
590
+ page_size = Readline.get_screen_size[0] - 6
591
+ if page_size < option_count
592
+ paging = {:cur_page => 0, :page_size => page_size, :total => option_count}
593
+ end
594
+ else
595
+ paging[:cur_page] = (paging[:cur_page] + 1) * paging[:page_size] < paging[:total] ? paging[:cur_page] + 1 : 0
596
+ end
597
+ end
598
+ display_select_options(option_type, select_options, paging)
599
+ end
570
600
  next
571
601
  end
572
602
 
@@ -947,27 +977,36 @@ module Morpheus
947
977
  out << "\n"
948
978
  out << "#{header}\n"
949
979
  out << "#{'=' * header.length}\n"
980
+
950
981
  select_options.each do |option|
951
- out << " * #{option['name']} [#{option['value']}]\n"
982
+ out << (option['isGroup'] ? "- #{option['name']}\n" : " * #{option['name']} [#{option['value']}]\n")
952
983
  end
953
984
  return out
954
985
  end
955
986
 
987
+ def self.sorted_option_types(option_types)
988
+ option_types.reject {|it| (it['fieldGroup'] || 'default') != 'default'}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i} +
989
+ option_types.reject {|it| ['default', 'advanced'].include?(it['fieldGroup'] || 'default')}.sort{|a,b| a['displayOrder'] <=> b['displayOrder']}.group_by{|it| it['fieldGroup']}.values.collect { |it| it.sort{|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}}.flatten +
990
+ option_types.reject {|it| it['fieldGroup'] != 'advanced'}.sort {|a,b| a['displayOrder'].to_i <=> b['displayOrder'].to_i}
991
+ end
992
+
956
993
  def self.display_select_options(opt, select_options = [], paging = nil)
957
- puts format_select_options_help(opt, select_options, paging)
994
+ puts self.format_select_options_help(opt, select_options, paging)
958
995
  end
959
996
 
960
997
  def self.format_option_types_help(option_types, opts={})
998
+ option_types = self.sorted_option_types(option_types).reject {|it| it['hidden']}
999
+
961
1000
  if option_types.empty?
962
1001
  "#{opts[:color]}#{opts[:title] || "Available Options:"}\nNone\n\n"
963
1002
  else
964
1003
  if opts[:include_context]
965
- option_lines = option_types.sort {|it| it['displayOrder']}.collect {|it|
1004
+ option_lines = option_types.collect {|it|
966
1005
  field_context = (opts[:context_map] || {})[it['fieldContext']] || it['fieldContext']
967
1006
  " -O #{field_context && field_context != '' ? "#{field_context}." : ''}#{it['fieldName']}=\"value\""
968
1007
  }
969
1008
  else
970
- option_lines = option_types.sort {|it| it['displayOrder']}.collect {|it| " -O #{it['fieldName']}=\"value\"" }
1009
+ option_lines = option_types.collect {|it| " -O #{it['fieldName']}=\"value\"" }
971
1010
  end
972
1011
  "#{opts[:color]}#{opts[:title] || "Available Options:"}\n#{option_lines.join("\n")}\n\n"
973
1012
  end
@@ -985,6 +1024,31 @@ module Morpheus
985
1024
  return option_type['required'] ? '' : ' (optional)'
986
1025
  end
987
1026
  end
1027
+
1028
+ def self.get_option_value(obj, option_type, format=false)
1029
+ context = option_type['fieldContext'] == 'config' ? obj['config'] : obj
1030
+ name = option_type['fieldName']
1031
+ tokens = name.split('.')
1032
+
1033
+ if tokens.length > 1
1034
+ tokens.slice(0, tokens.length - 1).each do |token|
1035
+ context = context[token]
1036
+ end
1037
+ name = tokens.last
1038
+ end
1039
+
1040
+ if context.kind_of?(Array)
1041
+ rtn = context.collect {|it| it['name'] || it[name]}.join ', '
1042
+ else
1043
+ rtn = context[name]
1044
+ end
1045
+
1046
+ if format
1047
+ rtn = (rtn ? 'On' : 'Off') if option_type['type'] == 'checkbox'
1048
+ rtn = rtn.join(', ') if rtn.is_a?(Array)
1049
+ end
1050
+ rtn
1051
+ end
988
1052
  end
989
1053
  end
990
1054
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "5.3.2.2"
4
+ VERSION = "5.4.0"
5
5
  end
6
6
  end
data/lib/morpheus/cli.rb CHANGED
@@ -11,12 +11,12 @@ Dir[File.dirname(__FILE__) + "/ext/*.rb"].each {|file| require file }
11
11
  module Morpheus
12
12
  module Cli
13
13
 
14
- # get the home directory, where morpheus-cli stores things
15
14
  # The default is $MORPHEUS_CLI_HOME or $HOME/.morpheus
16
15
  unless defined?(@@home_directory)
17
16
  @@home_directory = ENV['MORPHEUS_CLI_HOME'] || File.join(Dir.home, ".morpheus")
18
17
  end
19
18
 
19
+ # get the home directory, where morpheus-cli stores things
20
20
  def self.home_directory
21
21
  @@home_directory
22
22
  end
@@ -50,12 +50,9 @@ module Morpheus
50
50
  Dir[File.dirname(__FILE__) + "/api/**/*.rb"].each {|file| load file }
51
51
 
52
52
  # load mixins
53
- Dir[File.dirname(__FILE__) + "/cli/mixins/*.rb"].each {|file| load file }
53
+ Dir[File.dirname(__FILE__) + "/cli/mixins/**/*.rb"].each {|file| load file }
54
54
 
55
- # load commands
56
- # Dir[File.dirname(__FILE__) + "/cli/*.rb"].each {|file| load file }
57
-
58
- # utilites
55
+ # load utilites
59
56
  require 'morpheus/cli/cli_registry.rb'
60
57
  require 'morpheus/cli/expression_parser.rb'
61
58
  require 'morpheus/cli/dot_file.rb'
@@ -65,128 +62,8 @@ module Morpheus
65
62
  load 'morpheus/cli/option_types.rb'
66
63
  load 'morpheus/cli/credentials.rb'
67
64
 
68
- # all standard commands
69
- Dir[File.dirname(__FILE__) + "/cli/commands/standard/**/*.rb"].each {|file| load file }
70
-
71
- # all the known commands
72
- load 'morpheus/cli/remote.rb'
73
- load 'morpheus/cli/doc.rb'
74
- load 'morpheus/cli/ping.rb'
75
- load 'morpheus/cli/setup.rb'
76
- load 'morpheus/cli/login.rb'
77
- load 'morpheus/cli/logout.rb'
78
- load 'morpheus/cli/forgot_password.rb'
79
- load 'morpheus/cli/whoami.rb'
80
- load 'morpheus/cli/access_token_command.rb'
81
- load 'morpheus/cli/user_settings_command.rb'
82
- load 'morpheus/cli/search_command.rb'
83
- load 'morpheus/cli/dashboard_command.rb'
84
- load 'morpheus/cli/recent_activity_command.rb' # deprecated, removing soon
85
- load 'morpheus/cli/activity_command.rb'
86
- load 'morpheus/cli/appliance_settings_command.rb'
87
- load 'morpheus/cli/power_schedules_command.rb'
88
- load 'morpheus/cli/execute_schedules_command.rb'
89
- load 'morpheus/cli/groups.rb'
90
- load 'morpheus/cli/clouds.rb'
91
- load 'morpheus/cli/cloud_datastores_command.rb'
92
- load 'morpheus/cli/cloud_resource_pools_command.rb'
93
- load 'morpheus/cli/cloud_folders_command.rb'
94
- load 'morpheus/cli/hosts.rb'
95
- load 'morpheus/cli/load_balancers.rb'
96
- load 'morpheus/cli/load_balancer_types.rb'
97
- load 'morpheus/cli/shell.rb'
98
- load 'morpheus/cli/tasks.rb'
99
- load 'morpheus/cli/workflows.rb'
100
- load 'morpheus/cli/deployments.rb'
101
- load 'morpheus/cli/deploy.rb'
102
- load 'morpheus/cli/deploys.rb'
103
- load 'morpheus/cli/instances.rb'
104
- load 'morpheus/cli/containers_command.rb'
105
- load 'morpheus/cli/apps.rb'
106
- load 'morpheus/cli/blueprints_command.rb'
107
- load 'morpheus/cli/license.rb'
108
- load 'morpheus/cli/instance_types.rb'
109
- load 'morpheus/cli/jobs_command.rb'
110
- load 'morpheus/cli/integrations_command.rb'
111
- load 'morpheus/cli/security_groups.rb'
112
- load 'morpheus/cli/security_group_rules.rb'
113
- load 'morpheus/cli/clusters.rb'
114
- load 'morpheus/cli/tenants_command.rb'
115
- load 'morpheus/cli/account_groups_command.rb'
116
- load 'morpheus/cli/users.rb'
117
- load 'morpheus/cli/change_password_command.rb'
118
- load 'morpheus/cli/user_groups_command.rb'
119
- load 'morpheus/cli/user_sources_command.rb'
120
- load 'morpheus/cli/roles.rb'
121
- load 'morpheus/cli/key_pairs.rb'
122
- load 'morpheus/cli/virtual_images.rb'
123
- # load 'morpheus/cli/library.rb' # gone until we collapse these again
124
- load 'morpheus/cli/library_instance_types_command.rb'
125
- load 'morpheus/cli/library_cluster_layouts_command.rb'
126
- load 'morpheus/cli/library_layouts_command.rb'
127
- load 'morpheus/cli/library_upgrades_command.rb'
128
- load 'morpheus/cli/library_container_types_command.rb'
129
- load 'morpheus/cli/library_container_scripts_command.rb'
130
- load 'morpheus/cli/library_container_templates_command.rb'
131
- load 'morpheus/cli/library_option_types_command.rb'
132
- load 'morpheus/cli/library_option_lists_command.rb'
133
- load 'morpheus/cli/library_spec_templates_command.rb'
134
- load 'morpheus/cli/monitoring_incidents_command.rb'
135
- load 'morpheus/cli/monitoring_checks_command.rb'
136
- load 'morpheus/cli/monitoring_contacts_command.rb'
137
- load 'morpheus/cli/monitoring_alerts_command.rb'
138
- load 'morpheus/cli/monitoring_groups_command.rb'
139
- load 'morpheus/cli/monitoring_apps_command.rb'
140
- load 'morpheus/cli/logs_command.rb'
141
- load 'morpheus/cli/policies_command.rb'
142
- load 'morpheus/cli/networks_command.rb'
143
- load 'morpheus/cli/subnets_command.rb'
144
- load 'morpheus/cli/network_groups_command.rb'
145
- load 'morpheus/cli/network_pools_command.rb'
146
- load 'morpheus/cli/network_services_command.rb'
147
- load 'morpheus/cli/network_pool_servers_command.rb'
148
- load 'morpheus/cli/network_domains_command.rb'
149
- load 'morpheus/cli/network_proxies_command.rb'
150
- load 'morpheus/cli/network_routers_command.rb'
151
- load 'morpheus/cli/cypher_command.rb'
152
- load 'morpheus/cli/image_builder_command.rb'
153
- load 'morpheus/cli/preseed_scripts_command.rb'
154
- load 'morpheus/cli/boot_scripts_command.rb'
155
- load 'morpheus/cli/archives_command.rb'
156
- load 'morpheus/cli/storage_providers_command.rb'
157
- load 'morpheus/cli/execution_request_command.rb'
158
- load 'morpheus/cli/file_copy_request_command.rb'
159
- load 'morpheus/cli/processes_command.rb'
160
- load 'morpheus/cli/packages_command.rb'
161
- load 'morpheus/cli/reports_command.rb'
162
- load 'morpheus/cli/environments_command.rb'
163
- load 'morpheus/cli/backup_settings_command.rb'
164
- load 'morpheus/cli/log_settings_command.rb'
165
- load 'morpheus/cli/whitelabel_settings_command.rb'
166
- load 'morpheus/cli/wiki_command.rb'
167
- load 'morpheus/cli/approvals_command.rb'
168
- load 'morpheus/cli/service_plans_command.rb'
169
- load 'morpheus/cli/price_sets_command.rb'
170
- load 'morpheus/cli/prices_command.rb'
171
- load 'morpheus/cli/provisioning_settings_command.rb'
172
- load 'morpheus/cli/provisioning_licenses_command.rb'
173
- load 'morpheus/cli/budgets_command.rb'
174
- load 'morpheus/cli/health_command.rb'
175
- load 'morpheus/cli/invoices_command.rb'
176
- load 'morpheus/cli/guidance_command.rb'
177
- load 'morpheus/cli/projects_command.rb'
178
- load 'morpheus/cli/backups_command.rb'
179
- load 'morpheus/cli/backup_jobs_command.rb'
180
- load 'morpheus/cli/catalog_item_types_command.rb' # self-service
181
- load 'morpheus/cli/service_catalog_command.rb' # catalog (Service Catalog persona)
182
- load 'morpheus/cli/usage_command.rb'
183
- load 'morpheus/cli/vdi_pools_command.rb'
184
- load 'morpheus/cli/vdi_allocations_command.rb'
185
- load 'morpheus/cli/vdi_apps_command.rb'
186
- load 'morpheus/cli/vdi_gateways_command.rb'
187
- load 'morpheus/cli/vdi_command.rb' # (VDI persona)
188
- load 'morpheus/cli/certificates_command.rb' # (VDI persona)
189
- # add new commands here...
65
+ # load all commands
66
+ Dir[File.dirname(__FILE__) + "/cli/commands/**/*.rb"].each {|file| load file }
190
67
 
191
68
  end
192
69
 
@@ -1,15 +1,13 @@
1
- #!/usr/bin/env ruby
2
- require 'term/ansicolor'
3
- require 'optparse'
4
1
  require 'morpheus/cli'
2
+ require 'morpheus/benchmarking'
3
+ require 'morpheus/logging'
5
4
  require 'morpheus/rest_client'
6
5
  require 'morpheus/cli/cli_registry'
7
6
  require 'morpheus/cli/dot_file'
8
7
  require 'morpheus/cli/error_handler'
9
8
  require 'morpheus/cli/expression_parser'
10
- require 'morpheus/logging'
11
- require 'morpheus/benchmarking'
12
- require 'morpheus/cli'
9
+ require 'morpheus/cli/option_parser'
10
+ require 'term/ansicolor'
13
11
 
14
12
  module Morpheus
15
13
 
@@ -478,6 +476,7 @@ module Morpheus
478
476
 
479
477
  # shell is a Singleton command class
480
478
  if args[0] == "shell"
479
+ require 'morpheus/cli/commands/shell'
481
480
  result = Morpheus::Cli::Shell.instance.handle(args[1..-1])
482
481
  else
483
482
  #result = Morpheus::Cli::CliRegistry.exec_expression(formatted_cmd)
data/morpheus-cli.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.required_ruby_version = '>= 2.5.1' # according to http.rb doc
22
- spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "bundler", "~> 2.2"
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_dependency 'term-ansicolor', '~> 1.3.0'
25
25
  spec.add_dependency "rest-client", "2.0.2"