morpheus-cli 5.3.0.1 → 5.3.2

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/README.md +1 -3
  4. data/lib/morpheus/api/account_groups_interface.rb +0 -6
  5. data/lib/morpheus/api/accounts_interface.rb +1 -7
  6. data/lib/morpheus/api/api_client.rb +155 -119
  7. data/lib/morpheus/api/appliance_settings_interface.rb +6 -9
  8. data/lib/morpheus/api/approvals_interface.rb +5 -8
  9. data/lib/morpheus/api/apps_interface.rb +0 -7
  10. data/lib/morpheus/api/archive_buckets_interface.rb +9 -16
  11. data/lib/morpheus/api/archive_files_interface.rb +0 -6
  12. data/lib/morpheus/api/auth_interface.rb +4 -4
  13. data/lib/morpheus/api/backup_settings_interface.rb +5 -8
  14. data/lib/morpheus/api/blueprints_interface.rb +1 -7
  15. data/lib/morpheus/api/budgets_interface.rb +0 -6
  16. data/lib/morpheus/api/certificate_types_interface.rb +14 -0
  17. data/lib/morpheus/api/certificates_interface.rb +9 -0
  18. data/lib/morpheus/api/cloud_datastores_interface.rb +0 -6
  19. data/lib/morpheus/api/cloud_folders_interface.rb +1 -7
  20. data/lib/morpheus/api/cloud_policies_interface.rb +0 -6
  21. data/lib/morpheus/api/cloud_resource_pools_interface.rb +0 -6
  22. data/lib/morpheus/api/clouds_interface.rb +0 -6
  23. data/lib/morpheus/api/clusters_interface.rb +39 -42
  24. data/lib/morpheus/api/containers_interface.rb +0 -6
  25. data/lib/morpheus/api/custom_instance_types_interface.rb +0 -6
  26. data/lib/morpheus/api/cypher_interface.rb +0 -6
  27. data/lib/morpheus/api/datastores_interface.rb +4 -7
  28. data/lib/morpheus/api/deploy_interface.rb +1 -6
  29. data/lib/morpheus/api/environments_interface.rb +0 -6
  30. data/lib/morpheus/api/execute_schedules_interface.rb +0 -6
  31. data/lib/morpheus/api/execution_request_interface.rb +0 -6
  32. data/lib/morpheus/api/file_copy_request_interface.rb +2 -9
  33. data/lib/morpheus/api/group_policies_interface.rb +0 -6
  34. data/lib/morpheus/api/groups_interface.rb +0 -7
  35. data/lib/morpheus/api/guidance_interface.rb +9 -12
  36. data/lib/morpheus/api/health_interface.rb +0 -6
  37. data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +0 -6
  38. data/lib/morpheus/api/image_builder_image_builds_interface.rb +0 -6
  39. data/lib/morpheus/api/image_builder_interface.rb +3 -9
  40. data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +0 -6
  41. data/lib/morpheus/api/instance_types_interface.rb +0 -7
  42. data/lib/morpheus/api/instances_interface.rb +8 -19
  43. data/lib/morpheus/api/integration_types_interface.rb +14 -0
  44. data/lib/morpheus/api/integrations_interface.rb +36 -21
  45. data/lib/morpheus/api/invoice_line_items_interface.rb +4 -9
  46. data/lib/morpheus/api/jobs_interface.rb +11 -14
  47. data/lib/morpheus/api/key_pairs_interface.rb +0 -6
  48. data/lib/morpheus/api/library_cluster_layouts_interface.rb +0 -6
  49. data/lib/morpheus/api/library_container_scripts_interface.rb +0 -6
  50. data/lib/morpheus/api/library_container_templates_interface.rb +0 -6
  51. data/lib/morpheus/api/library_container_types_interface.rb +0 -6
  52. data/lib/morpheus/api/library_container_upgrades_interface.rb +0 -6
  53. data/lib/morpheus/api/library_instance_types_interface.rb +0 -6
  54. data/lib/morpheus/api/library_layouts_interface.rb +0 -6
  55. data/lib/morpheus/api/library_spec_template_types_interface.rb +0 -6
  56. data/lib/morpheus/api/library_spec_templates_interface.rb +0 -6
  57. data/lib/morpheus/api/license_interface.rb +0 -6
  58. data/lib/morpheus/api/load_balancers_interface.rb +0 -6
  59. data/lib/morpheus/api/log_settings_interface.rb +9 -12
  60. data/lib/morpheus/api/logs_interface.rb +0 -6
  61. data/lib/morpheus/api/monitoring_alerts_interface.rb +0 -6
  62. data/lib/morpheus/api/monitoring_apps_interface.rb +0 -6
  63. data/lib/morpheus/api/monitoring_checks_interface.rb +0 -6
  64. data/lib/morpheus/api/monitoring_contacts_interface.rb +0 -6
  65. data/lib/morpheus/api/monitoring_groups_interface.rb +0 -6
  66. data/lib/morpheus/api/monitoring_incidents_interface.rb +0 -6
  67. data/lib/morpheus/api/monitoring_interface.rb +6 -12
  68. data/lib/morpheus/api/network_domain_records_interface.rb +0 -6
  69. data/lib/morpheus/api/network_domains_interface.rb +0 -6
  70. data/lib/morpheus/api/network_groups_interface.rb +0 -6
  71. data/lib/morpheus/api/network_pool_ips_interface.rb +0 -6
  72. data/lib/morpheus/api/network_pool_servers_interface.rb +0 -6
  73. data/lib/morpheus/api/network_pools_interface.rb +0 -6
  74. data/lib/morpheus/api/network_proxies_interface.rb +0 -6
  75. data/lib/morpheus/api/network_routers_interface.rb +0 -6
  76. data/lib/morpheus/api/network_security_servers_interface.rb +6 -9
  77. data/lib/morpheus/api/network_services_interface.rb +14 -14
  78. data/lib/morpheus/api/network_subnets_interface.rb +0 -6
  79. data/lib/morpheus/api/network_types_interface.rb +1 -7
  80. data/lib/morpheus/api/networks_interface.rb +0 -6
  81. data/lib/morpheus/api/option_type_lists_interface.rb +18 -12
  82. data/lib/morpheus/api/option_types_interface.rb +0 -6
  83. data/lib/morpheus/api/options_interface.rb +0 -6
  84. data/lib/morpheus/api/packages_interface.rb +0 -6
  85. data/lib/morpheus/api/policies_interface.rb +1 -8
  86. data/lib/morpheus/api/power_schedules_interface.rb +0 -6
  87. data/lib/morpheus/api/price_sets_interface.rb +8 -11
  88. data/lib/morpheus/api/prices_interface.rb +12 -15
  89. data/lib/morpheus/api/processes_interface.rb +0 -6
  90. data/lib/morpheus/api/provision_types_interface.rb +0 -6
  91. data/lib/morpheus/api/provisioning_license_types_interface.rb +0 -6
  92. data/lib/morpheus/api/provisioning_licenses_interface.rb +0 -6
  93. data/lib/morpheus/api/provisioning_settings_interface.rb +6 -9
  94. data/lib/morpheus/api/read_interface.rb +23 -0
  95. data/lib/morpheus/api/reports_interface.rb +0 -6
  96. data/lib/morpheus/api/rest_interface.rb +12 -10
  97. data/lib/morpheus/api/roles_interface.rb +7 -6
  98. data/lib/morpheus/api/security_group_rules_interface.rb +0 -7
  99. data/lib/morpheus/api/security_groups_interface.rb +0 -6
  100. data/lib/morpheus/api/server_types_interface.rb +0 -6
  101. data/lib/morpheus/api/servers_interface.rb +7 -6
  102. data/lib/morpheus/api/service_plans_interface.rb +11 -14
  103. data/lib/morpheus/api/storage_providers_interface.rb +9 -16
  104. data/lib/morpheus/api/subnet_types_interface.rb +1 -7
  105. data/lib/morpheus/api/subnets_interface.rb +0 -6
  106. data/lib/morpheus/api/task_sets_interface.rb +0 -6
  107. data/lib/morpheus/api/tasks_interface.rb +0 -6
  108. data/lib/morpheus/api/user_groups_interface.rb +0 -6
  109. data/lib/morpheus/api/user_settings_interface.rb +38 -18
  110. data/lib/morpheus/api/user_sources_interface.rb +0 -6
  111. data/lib/morpheus/api/users_interface.rb +0 -6
  112. data/lib/morpheus/api/vdi_allocations_interface.rb +9 -0
  113. data/lib/morpheus/api/vdi_apps_interface.rb +9 -0
  114. data/lib/morpheus/api/vdi_gateways_interface.rb +9 -0
  115. data/lib/morpheus/api/vdi_interface.rb +28 -0
  116. data/lib/morpheus/api/vdi_pools_interface.rb +19 -0
  117. data/lib/morpheus/api/virtual_images_interface.rb +0 -6
  118. data/lib/morpheus/api/whitelabel_settings_interface.rb +8 -11
  119. data/lib/morpheus/api/wiki_interface.rb +0 -6
  120. data/lib/morpheus/cli.rb +9 -2
  121. data/lib/morpheus/cli/access_token_command.rb +1 -1
  122. data/lib/morpheus/cli/account_groups_command.rb +4 -4
  123. data/lib/morpheus/cli/apps.rb +68 -84
  124. data/lib/morpheus/cli/archives_command.rb +5 -5
  125. data/lib/morpheus/cli/blueprints_command.rb +5 -5
  126. data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
  127. data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
  128. data/lib/morpheus/cli/certificates_command.rb +575 -0
  129. data/lib/morpheus/cli/change_password_command.rb +4 -4
  130. data/lib/morpheus/cli/cli_command.rb +63 -7
  131. data/lib/morpheus/cli/clouds.rb +3 -2
  132. data/lib/morpheus/cli/clusters.rb +3 -3
  133. data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
  134. data/lib/morpheus/cli/credentials.rb +4 -11
  135. data/lib/morpheus/cli/environments_command.rb +1 -1
  136. data/lib/morpheus/cli/execute_schedules_command.rb +3 -3
  137. data/lib/morpheus/cli/hosts.rb +253 -232
  138. data/lib/morpheus/cli/image_builder_command.rb +6 -6
  139. data/lib/morpheus/cli/instance_types.rb +1 -1
  140. data/lib/morpheus/cli/instances.rb +196 -186
  141. data/lib/morpheus/cli/integrations_command.rb +1155 -42
  142. data/lib/morpheus/cli/invoices_command.rb +75 -67
  143. data/lib/morpheus/cli/key_pairs.rb +2 -2
  144. data/lib/morpheus/cli/library_cluster_layouts_command.rb +2 -3
  145. data/lib/morpheus/cli/library_container_scripts_command.rb +4 -5
  146. data/lib/morpheus/cli/library_container_templates_command.rb +5 -1
  147. data/lib/morpheus/cli/library_container_types_command.rb +8 -9
  148. data/lib/morpheus/cli/library_instance_types_command.rb +6 -7
  149. data/lib/morpheus/cli/library_layouts_command.rb +9 -5
  150. data/lib/morpheus/cli/library_option_lists_command.rb +72 -20
  151. data/lib/morpheus/cli/library_option_types_command.rb +8 -4
  152. data/lib/morpheus/cli/library_spec_templates_command.rb +3 -4
  153. data/lib/morpheus/cli/library_upgrades_command.rb +6 -6
  154. data/lib/morpheus/cli/license.rb +2 -2
  155. data/lib/morpheus/cli/load_balancers.rb +1 -1
  156. data/lib/morpheus/cli/login.rb +10 -1
  157. data/lib/morpheus/cli/mixins/option_source_helper.rb +15 -16
  158. data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
  159. data/lib/morpheus/cli/mixins/provisioning_helper.rb +4 -4
  160. data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
  161. data/lib/morpheus/cli/network_domains_command.rb +2 -2
  162. data/lib/morpheus/cli/network_routers_command.rb +22 -9
  163. data/lib/morpheus/cli/networks_command.rb +2 -2
  164. data/lib/morpheus/cli/option_types.rb +39 -34
  165. data/lib/morpheus/cli/policies_command.rb +0 -1
  166. data/lib/morpheus/cli/power_schedules_command.rb +3 -3
  167. data/lib/morpheus/cli/preseed_scripts_command.rb +1 -1
  168. data/lib/morpheus/cli/remote.rb +2 -2
  169. data/lib/morpheus/cli/reports_command.rb +5 -2
  170. data/lib/morpheus/cli/roles.rb +224 -64
  171. data/lib/morpheus/cli/security_group_rules.rb +1 -1
  172. data/lib/morpheus/cli/setup.rb +0 -1
  173. data/lib/morpheus/cli/subnets_command.rb +11 -2
  174. data/lib/morpheus/cli/tenants_command.rb +3 -3
  175. data/lib/morpheus/cli/user_groups_command.rb +3 -3
  176. data/lib/morpheus/cli/user_settings_command.rb +268 -57
  177. data/lib/morpheus/cli/user_sources_command.rb +3 -3
  178. data/lib/morpheus/cli/users.rb +3 -3
  179. data/lib/morpheus/cli/vdi_allocations_command.rb +159 -0
  180. data/lib/morpheus/cli/vdi_apps_command.rb +317 -0
  181. data/lib/morpheus/cli/vdi_command.rb +359 -0
  182. data/lib/morpheus/cli/vdi_gateways_command.rb +290 -0
  183. data/lib/morpheus/cli/vdi_pools_command.rb +571 -0
  184. data/lib/morpheus/cli/version.rb +1 -1
  185. data/lib/morpheus/cli/virtual_images.rb +1 -1
  186. data/lib/morpheus/cli/whoami.rb +0 -15
  187. data/lib/morpheus/cli/wiki_command.rb +1 -1
  188. data/lib/morpheus/rest_client.rb +30 -0
  189. data/lib/morpheus/terminal.rb +15 -7
  190. metadata +18 -2
@@ -19,10 +19,10 @@ class Morpheus::Cli::ChangePasswordCommand
19
19
 
20
20
  def connect(opts)
21
21
  @api_client = establish_remote_appliance_connection(opts)
22
- @whoami_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).whoami
23
- @users_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).users
24
- @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
25
- @roles_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).roles
22
+ @whoami_interface = @api_client.whoami
23
+ @users_interface = @api_client.users
24
+ @accounts_interface = @api_client.accounts
25
+ @roles_interface = @api_client.roles
26
26
  end
27
27
 
28
28
  def handle(args)
@@ -204,7 +204,10 @@ module Morpheus
204
204
  # elsif option['type'] == 'select'
205
205
  end
206
206
  full_option = "--#{full_field_name} #{value_label}"
207
- shorthand_option = option_type['shorthand']
207
+ # switch is an alias for the full option name, fieldName is the default
208
+ if option_type['switch']
209
+ full_option = "--#{option_type['switch']} #{value_label}"
210
+ end
208
211
  arg1, arg2 = full_option, String
209
212
  if option_type['shorthand']
210
213
  arg1, arg2 = full_option, option_type['shorthand']
@@ -243,7 +246,7 @@ module Morpheus
243
246
  ## the standard options for a command that makes api requests (most of them)
244
247
 
245
248
  def build_standard_get_options(opts, options, includes=[], excludes=[])
246
- build_common_options(opts, options, includes + [:query, :json, :yaml, :csv, :fields, :quiet, :dry_run, :remote], excludes)
249
+ build_common_options(opts, options, includes + [:query, :json, :yaml, :csv, :fields, :select, :delim, :quiet, :dry_run, :remote], excludes)
247
250
  end
248
251
 
249
252
  def build_standard_post_options(opts, options, includes=[], excludes=[])
@@ -688,36 +691,50 @@ module Morpheus
688
691
  options[:format] = :csv
689
692
  #options[:csv_delim] = options[:csv_delim] || ","
690
693
  end
691
-
694
+ # deprecated --csv-delim, use --delimiter instead
692
695
  opts.on('--csv-delim CHAR', String, "Delimiter for CSV Output values. Default: ','") do |val|
693
696
  options[:csv] = true
694
697
  options[:format] = :csv
695
698
  val = val.gsub("\\n", "\n").gsub("\\r", "\r").gsub("\\t", "\t") if val.include?("\\")
696
699
  options[:csv_delim] = val
697
700
  end
701
+ opts.add_hidden_option('--csv-delim') if opts.is_a?(Morpheus::Cli::OptionParser)
698
702
 
703
+ # deprecated --csv-newline, use --newline instead
699
704
  opts.on('--csv-newline [CHAR]', String, "Delimiter for CSV Output rows. Default: '\\n'") do |val|
700
705
  options[:csv] = true
701
706
  options[:format] = :csv
702
707
  if val == "no" || val == "none"
703
708
  options[:csv_newline] = ""
704
709
  else
705
- val = val.gsub("\\n", "\n").gsub("\\r", "\r").gsub("\\t", "\t") if val.include?("\\")
710
+ val = val.to_s.gsub("\\n", "\n").gsub("\\r", "\r").gsub("\\t", "\t") if val.include?("\\")
706
711
  options[:csv_newline] = val
707
712
  end
708
713
  end
714
+ opts.add_hidden_option('--csv-newline') if opts.is_a?(Morpheus::Cli::OptionParser)
709
715
 
710
716
  opts.on(nil, '--csv-quotes', "Wrap CSV values with \". Default: false") do
711
717
  options[:csv] = true
712
718
  options[:format] = :csv
713
719
  options[:csv_quotes] = true
714
720
  end
721
+ opts.add_hidden_option('--csv-quotes') if opts.is_a?(Morpheus::Cli::OptionParser)
715
722
 
716
723
  opts.on(nil, '--csv-no-header', "Exclude header for CSV Output.") do
717
724
  options[:csv] = true
718
725
  options[:format] = :csv
719
726
  options[:csv_no_header] = true
720
727
  end
728
+ opts.add_hidden_option('--csv-no-header') if opts.is_a?(Morpheus::Cli::OptionParser)
729
+
730
+ opts.on(nil, '--quotes', "Wrap CSV values with \". Default: false") do
731
+ options[:csv_quotes] = true
732
+ end
733
+ opts.add_hidden_option('--csv-quotes') if opts.is_a?(Morpheus::Cli::OptionParser)
734
+
735
+ opts.on(nil, '--no-header', "Exclude header for CSV Output.") do
736
+ options[:csv_no_header] = true
737
+ end
721
738
 
722
739
  when :fields
723
740
  opts.on('-f', '--fields x,y,z', Array, "Filter Output to a limited set of fields. Default is all fields for json,csv,yaml.") do |val|
@@ -738,10 +755,35 @@ module Morpheus
738
755
  opts.on(nil, '--all-fields', "Show all fields present in the data.") do
739
756
  options[:all_fields] = true
740
757
  end
741
- #opts.add_hidden_option('--all-fields') if opts.is_a?(Morpheus::Cli::OptionParser)
742
758
  opts.on(nil, '--wrap', "Wrap table columns instead hiding them when terminal is not wide enough.") do
743
759
  options[:wrap] = true
744
760
  end
761
+ when :select
762
+ #opts.add_hidden_option('--all-fields') if opts.is_a?(Morpheus::Cli::OptionParser)
763
+ opts.on('--select x,y,z', String, "Filter Output to just print the value(s) of specific fields.") do |val|
764
+ options[:select_fields] = val.split(',').collect {|r| r.strip}
765
+ end
766
+
767
+ when :delim
768
+ opts.on('--delimiter [CHAR]', String, "Delimiter for output values. Default: ',', use with --select and --csv") do |val|
769
+ options[:csv] = true
770
+ options[:format] = :csv
771
+ val = val.to_s
772
+ val = val.gsub("\\n", "\n").gsub("\\r", "\r").gsub("\\t", "\t") if val.include?("\\")
773
+ options[:delim] = val
774
+ end
775
+
776
+ opts.on('--newline [CHAR]', String, "Delimiter for output rows. Default: '\\n', use with --select and --csv") do |val|
777
+ options[:csv] = true
778
+ options[:format] = :csv
779
+ val = val.to_s
780
+ if val == "no" || val == "none"
781
+ options[:newline] = ""
782
+ else
783
+ val = val.to_s.gsub("\\n", "\n").gsub("\\r", "\r").gsub("\\t", "\t") if val.include?("\\")
784
+ options[:newline] = val
785
+ end
786
+ end
745
787
  when :thin
746
788
  opts.on( '--thin', '--thin', "Format headers and columns with thin borders." ) do |val|
747
789
  options[:border_style] = :thin
@@ -1082,6 +1124,7 @@ module Morpheus
1082
1124
  if options[:insecure] || appliance[:insecure] || Morpheus::Cli::Shell.insecure
1083
1125
  allow_insecure = true
1084
1126
  end
1127
+ @verify_ssl = !allow_insecure
1085
1128
  # Morpheus::RestClient.enable_ssl_verification = allow_insecure != true
1086
1129
  if allow_insecure && Morpheus::RestClient.ssl_verification_enabled?
1087
1130
  Morpheus::RestClient.enable_ssl_verification = false
@@ -1147,7 +1190,7 @@ module Morpheus
1147
1190
  end
1148
1191
 
1149
1192
  # ok, connect to the appliance.. actually this just instantiates an ApiClient
1150
- api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url)
1193
+ api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url, @verify_ssl)
1151
1194
  @api_client = api_client # meh, just return w/o setting instance attrs
1152
1195
  return api_client
1153
1196
  end
@@ -1285,7 +1328,20 @@ module Morpheus
1285
1328
  # returns the string rendered, or nil if nothing was rendered.
1286
1329
  def render_response(json_response, options, object_key=nil, &block)
1287
1330
  output = nil
1288
- if options[:json]
1331
+ if options[:select_fields]
1332
+ row = object_key ? json_response[object_key] : json_response
1333
+ row = [row].flatten()
1334
+ if row.is_a?(Array)
1335
+ output = [row].flatten.collect { |record|
1336
+ options[:select_fields].collect { |field|
1337
+ value = get_object_value(record, field)
1338
+ value.is_a?(String) ? value : JSON.fast_generate(value)
1339
+ }.join(options[:delim] || ",")
1340
+ }.join(options[:newline] || "\n")
1341
+ else
1342
+ output = records_as_csv([row], options)
1343
+ end
1344
+ elsif options[:json]
1289
1345
  output = as_json(json_response, options, object_key)
1290
1346
  elsif options[:yaml]
1291
1347
  output = as_yaml(json_response, options, object_key)
@@ -24,8 +24,8 @@ class Morpheus::Cli::Clouds
24
24
 
25
25
  def connect(opts)
26
26
  @api_client = establish_remote_appliance_connection(opts)
27
- @clouds_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).clouds
28
- @groups_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).groups
27
+ @clouds_interface = @api_client.clouds
28
+ @groups_interface = @api_client.groups
29
29
  @active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
30
30
  # preload stuff
31
31
  get_available_cloud_types()
@@ -313,6 +313,7 @@ class Morpheus::Cli::Clouds
313
313
  end
314
314
 
315
315
  all_option_types = add_cloud_option_types(cloud_type)
316
+
316
317
  params = Morpheus::Cli::OptionTypes.prompt(all_option_types, options[:options], @api_client, {zoneTypeId: cloud_type['id']})
317
318
  # some optionTypes have fieldContext='zone', so move those to the root level of the zone payload
318
319
  if params['zone'].is_a?(Hash)
@@ -45,8 +45,8 @@ class Morpheus::Cli::Clusters
45
45
  @provision_types_interface = @api_client.provision_types
46
46
  @service_plans_interface = @api_client.service_plans
47
47
  @user_groups_interface = @api_client.user_groups
48
- @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
49
- @logs_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).logs
48
+ @accounts_interface = @api_client.accounts
49
+ @logs_interface = @api_client.logs
50
50
  #@active_security_group = ::Morpheus::Cli::SecurityGroups.load_security_group_file
51
51
  end
52
52
 
@@ -515,7 +515,7 @@ class Morpheus::Cli::Clusters
515
515
  tags = options[:tags]
516
516
 
517
517
  if !tags && !options[:no_prompt]
518
- tags = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'tags', 'type' => 'text', 'fieldLabel' => 'Resource Tags', 'required' => false, 'description' => 'Resource Tags.'}],options[:options],@api_client,{})['tags']
518
+ tags = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'tags', 'type' => 'text', 'fieldLabel' => 'Resource Labels', 'required' => false, 'description' => 'Resource Tags.'}],options[:options],@api_client,{})['tags']
519
519
  end
520
520
 
521
521
  server_payload['tags'] = tags if tags
@@ -341,12 +341,12 @@ You can use this to create isolated environments (sandboxes), within which to ex
341
341
 
342
342
  ```shell
343
343
  export MORPHEUS_CLI_HOME=~/morpheus_test
344
- morpheus remote add demo https://demo.mymorpheus.com --insecure
344
+ morpheus remote add demo https://demo-morpheus --insecure
345
345
  morpheus instances list
346
346
  ```
347
347
 
348
348
  Morpheus saves the remote appliance information, including api access tokens,
349
- to the $MORPHEUS_HOME_DIRECTORY. These files are saved with file permissions **6000**.
349
+ to the CLI home directory. These files are saved with file permissions **6000**.
350
350
  So, only one system user should be allowed to execute morpheus with that home directory.
351
351
  See [Configuration](#Configuration) for more information on the files morpheus reads and writes.
352
352
 
@@ -363,10 +363,9 @@ The `appliances` YAML file contains a list of known appliances, keyed by name.
363
363
  Example:
364
364
  ```yaml
365
365
  :qa:
366
- :host: https://qa.mymorpheus.com
367
- :active: true
366
+ :host: https://qa-morpheus
368
367
  :production:
369
- :host: https://mymorpheus.com
368
+ :host: https://production-morpheus
370
369
  ```
371
370
 
372
371
  ### credentials file
@@ -56,8 +56,7 @@ module Morpheus
56
56
  # OR whoami should return other wallet info like access token or maybe just the expiration date
57
57
  # for now, it just stores the access token without other wallet info
58
58
  begin
59
- # @setup_interface = Morpheus::SetupInterface.new({url:@appliance_url,access_token:@access_token})
60
- whoami_interface = Morpheus::WhoamiInterface.new({url: @appliance_url, access_token: options[:remote_token]})
59
+ whoami_interface = Morpheus::WhoamiInterface.new({url: @appliance_url, access_token: options[:remote_token], verify_ssl: !options[:insecure]})
61
60
  whoami_interface.setopts(options)
62
61
  if options[:dry_run]
63
62
  print_dry_run whoami_interface.dry.get()
@@ -104,13 +103,7 @@ module Morpheus
104
103
  end
105
104
  if wallet.nil?
106
105
  unless options[:quiet] || options[:no_prompt]
107
- # if username.empty? || password.empty?
108
- if options[:test_only]
109
- print "Test Morpheus Credentials for #{display_appliance(@appliance_name, @appliance_url)}", "\n", reset
110
- else
111
- print "Enter Morpheus Credentials for #{display_appliance(@appliance_name, @appliance_url)}", "\n", reset
112
- end
113
- # end
106
+ print "Enter Morpheus Credentials for #{display_appliance(@appliance_name, @appliance_url)}", "\n", reset
114
107
  if options[:client_id].empty?
115
108
  # print "Client ID: #{required_blue_prompt} #{options[:client_id]}", "\n", reset
116
109
  else
@@ -138,7 +131,7 @@ module Morpheus
138
131
  return nil
139
132
  end
140
133
  begin
141
- auth_interface = Morpheus::AuthInterface.new({url:@appliance_url, client_id: options[:client_id]})
134
+ auth_interface = Morpheus::AuthInterface.new({url:@appliance_url, client_id: options[:client_id], verify_ssl: !options[:insecure]})
142
135
  auth_interface.setopts(options)
143
136
  if options[:dry_run]
144
137
  print_dry_run auth_interface.dry.login(username, password)
@@ -276,7 +269,7 @@ module Morpheus
276
269
  username = wallet['username']
277
270
 
278
271
  begin
279
- auth_interface = Morpheus::AuthInterface.new({url:@appliance_url})
272
+ auth_interface = Morpheus::AuthInterface.new({url:@appliance_url, client_id: options[:client_id], verify_ssl: !options[:insecure]})
280
273
  auth_interface.setopts(options)
281
274
  if options[:dry_run]
282
275
  print_dry_run auth_interface.dry.use_refresh_token(refresh_token_value)
@@ -16,7 +16,7 @@ class Morpheus::Cli::EnvironmentsCommand
16
16
 
17
17
  def connect(opts)
18
18
  @api_client = establish_remote_appliance_connection(opts)
19
- @environments_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).environments
19
+ @environments_interface = @api_client.environments
20
20
  end
21
21
 
22
22
  def handle(args)
@@ -13,9 +13,9 @@ class Morpheus::Cli::ExecuteSchedulesCommand
13
13
 
14
14
  def connect(opts)
15
15
  @api_client = establish_remote_appliance_connection(opts)
16
- @execute_schedules_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).execute_schedules
17
- @instances_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).instances
18
- @servers_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).servers
16
+ @execute_schedules_interface = @api_client.execute_schedules
17
+ @instances_interface = @api_client.instances
18
+ @servers_interface = @api_client.servers
19
19
  end
20
20
 
21
21
  def handle(args)
@@ -17,7 +17,7 @@ class Morpheus::Cli::Hosts
17
17
  set_command_name :hosts
18
18
  set_command_description "View and manage hosts (servers)."
19
19
  register_subcommands :list, :count, :get, :view, :stats, :add, :update, :remove, :logs, :start, :stop, :resize,
20
- :run_workflow, :make_managed, :upgrade_agent, :snapshots, :software,
20
+ :run_workflow, :make_managed, :upgrade_agent, :snapshots, :software, :software_sync,
21
21
  {:'types' => :list_types},
22
22
  {:exec => :execution_request},
23
23
  :wiki, :update_wiki
@@ -32,14 +32,14 @@ class Morpheus::Cli::Hosts
32
32
  @api_client = establish_remote_appliance_connection(opts)
33
33
  @accounts_interface = @api_client.accounts
34
34
  @users_interface = @api_client.users
35
- @clouds_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).clouds
36
- @options_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).options
37
- @tasks_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).tasks
38
- @task_sets_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).task_sets
39
- @servers_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).servers
40
- @server_types_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).server_types
41
- @logs_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).logs
42
- @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
35
+ @clouds_interface = @api_client.clouds
36
+ @options_interface = @api_client.options
37
+ @tasks_interface = @api_client.tasks
38
+ @task_sets_interface = @api_client.task_sets
39
+ @servers_interface = @api_client.servers
40
+ @server_types_interface = @api_client.server_types
41
+ @logs_interface = @api_client.logs
42
+ @accounts_interface = @api_client.accounts
43
43
  @active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
44
44
  @execution_request_interface = @api_client.execution_request
45
45
  @clusters_interface = @api_client.clusters
@@ -152,215 +152,206 @@ class Morpheus::Cli::Hosts
152
152
  if args.count > 0
153
153
  options[:phrase] = args.join(" ")
154
154
  end
155
- begin
156
- params.merge!(parse_list_options(options))
157
- account = nil
158
- if options[:account]
159
- account = find_account_by_name_or_id(options[:account])
160
- if account.nil?
161
- return 1
162
- else
163
- params['accountId'] = account['id']
164
- end
165
- end
166
- group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
167
- if group
168
- params['siteId'] = group['id']
155
+
156
+ params.merge!(parse_list_options(options))
157
+ account = nil
158
+ if options[:account]
159
+ account = find_account_by_name_or_id(options[:account])
160
+ if account.nil?
161
+ return 1
162
+ else
163
+ params['accountId'] = account['id']
169
164
  end
165
+ end
166
+ group = options[:group] ? find_group_by_name_or_id_for_provisioning(options[:group]) : nil
167
+ if group
168
+ params['siteId'] = group['id']
169
+ end
170
170
 
171
- # argh, this doesn't work because group_id is required for options/clouds
172
- # cloud = options[:cloud] ? find_cloud_by_name_or_id_for_provisioning(group_id, options[:cloud]) : nil
173
- cloud = options[:cloud] ? find_zone_by_name_or_id(nil, options[:cloud]) : nil
174
- if cloud
175
- params['zoneId'] = cloud['id']
176
- end
171
+ # argh, this doesn't work because group_id is required for options/clouds
172
+ # cloud = options[:cloud] ? find_cloud_by_name_or_id_for_provisioning(group_id, options[:cloud]) : nil
173
+ cloud = options[:cloud] ? find_zone_by_name_or_id(nil, options[:cloud]) : nil
174
+ if cloud
175
+ params['zoneId'] = cloud['id']
176
+ end
177
177
 
178
- if options[:created_by]
179
- created_by_ids = find_all_user_ids(account ? account['id'] : nil, options[:created_by])
180
- return if created_by_ids.nil?
181
- params['createdBy'] = created_by_ids
182
- # params['ownerId'] = created_by_ids # 4.2.1+
183
- end
184
-
185
- cluster = nil
186
- if options[:cluster]
187
- if options[:cluster].to_s =~ /\A\d{1,}\Z/
188
- params['clusterId'] = options[:cluster]
189
- else
190
- cluster = find_cluster_by_name_or_id(options[:cluster])
191
- return 1 if cluster.nil?
192
- params['clusterId'] = cluster['id']
193
- end
178
+ if options[:created_by]
179
+ created_by_ids = find_all_user_ids(account ? account['id'] : nil, options[:created_by])
180
+ return if created_by_ids.nil?
181
+ params['createdBy'] = created_by_ids
182
+ # params['ownerId'] = created_by_ids # 4.2.1+
183
+ end
184
+
185
+ cluster = nil
186
+ if options[:cluster]
187
+ if options[:cluster].to_s =~ /\A\d{1,}\Z/
188
+ params['clusterId'] = options[:cluster]
189
+ else
190
+ cluster = find_cluster_by_name_or_id(options[:cluster])
191
+ return 1 if cluster.nil?
192
+ params['clusterId'] = cluster['id']
194
193
  end
195
- params['labels'] = options[:labels] if options[:labels]
196
- if options[:tags] && !options[:tags].empty?
197
- options[:tags].each do |k,v|
198
- params['tags.' + k] = v
199
- end
194
+ end
195
+ params['labels'] = options[:labels] if options[:labels]
196
+ if options[:tags] && !options[:tags].empty?
197
+ options[:tags].each do |k,v|
198
+ params['tags.' + k] = v
200
199
  end
200
+ end
201
201
 
202
- @servers_interface.setopts(options)
203
- if options[:dry_run]
204
- print_dry_run @servers_interface.dry.list(params)
205
- return
206
- end
207
- json_response = @servers_interface.list(params)
202
+ @servers_interface.setopts(options)
203
+ if options[:dry_run]
204
+ print_dry_run @servers_interface.dry.list(params)
205
+ return
206
+ end
207
+ json_response = @servers_interface.list(params)
208
208
 
209
- if options[:json]
210
- json_response.delete('stats') if options[:include_fields]
211
- puts as_json(json_response, options, "servers")
212
- return 0
213
- elsif options[:yaml]
214
- json_response.delete('stats') if options[:include_fields]
215
- puts as_yaml(json_response, options, "servers")
216
- return 0
217
- elsif options[:csv]
218
- # merge stats to be nice here..
219
- if json_response['servers']
220
- all_stats = json_response['stats'] || {}
209
+ # merge stats to be nice here..
210
+ all_stats = json_response['stats']
211
+ if options[:include_fields] || options[:all_fields]
212
+ if json_response['servers']
213
+ if all_stats
221
214
  json_response['servers'].each do |it|
222
215
  it['stats'] ||= all_stats[it['id'].to_s] || all_stats[it['id']]
223
216
  end
224
217
  end
225
- puts records_as_csv(json_response['servers'], options)
226
- return 0
218
+ end
219
+ end
220
+ render_response(json_response, options, "servers") do
221
+
222
+ servers = json_response['servers']
223
+ multi_tenant = json_response['multiTenant'] == true
224
+ title = "Morpheus Hosts"
225
+ subtitles = []
226
+ if account
227
+ subtitles << "Tenant: #{account['name']}".strip
228
+ end
229
+ if group
230
+ subtitles << "Group: #{group['name']}".strip
231
+ end
232
+ if cloud
233
+ subtitles << "Cloud: #{cloud['name']}".strip
234
+ end
235
+ if cluster
236
+ subtitles << "Cluster: #{cluster['name']}".strip
237
+ elsif params['clusterId']
238
+ subtitles << "Cluster: #{params['clusterId']}".strip
239
+ end
240
+ subtitles += parse_list_subtitles(options)
241
+ print_h1 title, subtitles, options
242
+ if servers.empty?
243
+ print cyan,"No hosts found.",reset,"\n"
227
244
  else
228
- servers = json_response['servers']
229
- multi_tenant = json_response['multiTenant'] == true
230
- title = "Morpheus Hosts"
231
- subtitles = []
232
- if account
233
- subtitles << "Tenant: #{account['name']}".strip
234
- end
235
- if group
236
- subtitles << "Group: #{group['name']}".strip
237
- end
238
- if cloud
239
- subtitles << "Cloud: #{cloud['name']}".strip
240
- end
241
- if cluster
242
- subtitles << "Cluster: #{cluster['name']}".strip
243
- elsif params['clusterId']
244
- subtitles << "Cluster: #{params['clusterId']}".strip
245
- end
246
- subtitles += parse_list_subtitles(options)
247
- print_h1 title, subtitles, options
248
- if servers.empty?
249
- print cyan,"No hosts found.",reset,"\n"
250
- else
251
- # print_servers_table(servers)
252
- # server returns stats in a separate key stats => {"id" => {} }
253
- # the id is a string right now..for some reason..
254
- all_stats = json_response['stats'] || {}
255
- servers.each do |it|
256
- found_stats = all_stats[it['id'].to_s] || all_stats[it['id']]
257
- if found_stats
258
- if !it['stats']
259
- it['stats'] = found_stats # || {}
260
- else
261
- it['stats'] = found_stats.merge!(it['stats'])
262
- end
245
+ # print_servers_table(servers)
246
+ # server returns stats in a separate key stats => {"id" => {} }
247
+ # the id is a string right now..for some reason..
248
+ all_stats = json_response['stats'] || {}
249
+ servers.each do |it|
250
+ found_stats = all_stats[it['id'].to_s] || all_stats[it['id']]
251
+ if found_stats
252
+ if !it['stats']
253
+ it['stats'] = found_stats # || {}
254
+ else
255
+ it['stats'] = found_stats.merge!(it['stats'])
263
256
  end
264
257
  end
258
+ end
265
259
 
266
- rows = servers.collect {|server|
267
- stats = server['stats']
268
-
269
- if !stats['maxMemory']
270
- stats['maxMemory'] = stats['usedMemory'] + stats['freeMemory']
260
+ rows = servers.collect {|server|
261
+ stats = server['stats']
262
+
263
+ if !stats['maxMemory']
264
+ stats['maxMemory'] = stats['usedMemory'] + stats['freeMemory']
265
+ end
266
+ cpu_usage_str = !stats ? "" : generate_usage_bar((stats['usedCpu'] || stats['cpuUsage']).to_f, 100, {max_bars: 10})
267
+ memory_usage_str = !stats ? "" : generate_usage_bar(stats['usedMemory'], stats['maxMemory'], {max_bars: 10})
268
+ storage_usage_str = !stats ? "" : generate_usage_bar(stats['usedStorage'], stats['maxStorage'], {max_bars: 10})
269
+ if options[:details] || options[:stats]
270
+ if stats['maxMemory'] && stats['maxMemory'].to_i != 0
271
+ memory_usage_str = memory_usage_str + cyan + format_bytes_short(stats['usedMemory']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxMemory']).strip
271
272
  end
272
- cpu_usage_str = !stats ? "" : generate_usage_bar((stats['usedCpu'] || stats['cpuUsage']).to_f, 100, {max_bars: 10})
273
- memory_usage_str = !stats ? "" : generate_usage_bar(stats['usedMemory'], stats['maxMemory'], {max_bars: 10})
274
- storage_usage_str = !stats ? "" : generate_usage_bar(stats['usedStorage'], stats['maxStorage'], {max_bars: 10})
275
- if options[:details] || options[:stats]
276
- if stats['maxMemory'] && stats['maxMemory'].to_i != 0
277
- memory_usage_str = memory_usage_str + cyan + format_bytes_short(stats['usedMemory']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxMemory']).strip
278
- end
279
- if stats['maxStorage'] && stats['maxStorage'].to_i != 0
280
- storage_usage_str = storage_usage_str + cyan + format_bytes_short(stats['usedStorage']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxStorage']).strip
281
- end
273
+ if stats['maxStorage'] && stats['maxStorage'].to_i != 0
274
+ storage_usage_str = storage_usage_str + cyan + format_bytes_short(stats['usedStorage']).strip.rjust(8, ' ') + " / " + format_bytes_short(stats['maxStorage']).strip
282
275
  end
283
- row = {
284
- id: server['id'],
285
- name: server['name'],
286
- external_name: server['externalName'],
287
- hostname: server['hostname'],
288
- platform: server['serverOs'] ? server['serverOs']['name'].upcase : 'N/A',
289
- type: server['computeServerType'] ? server['computeServerType']['name'] : 'unmanaged',
290
- tenant: server['account'] ? server['account']['name'] : server['accountId'],
291
- owner: server['owner'] ? server['owner']['username'] : server['owner'],
292
- cloud: server['zone'] ? server['zone']['name'] : '',
293
- plan: server['plan'] ? server['plan']['name'] : '',
294
- ip: server['externalIp'],
295
- internal_ip: server['internalIp'],
296
- nodes: server['containers'] ? server['containers'].size : '',
297
- # status: format_server_status(server, cyan),
298
- status: (options[:details]||options[:all_fields]) ? format_server_status(server, cyan) : format_server_status_friendly(server, cyan),
299
- power: format_server_power_state(server, cyan),
300
- cpu: cpu_usage_str + cyan,
301
- memory: memory_usage_str + cyan,
302
- storage: storage_usage_str + cyan,
303
- created: format_local_dt(server['dateCreated']),
304
- updated: format_local_dt(server['lastUpdated']),
305
- }
306
- row
307
- }
308
- # columns = [:id, :name, :type, :cloud, :ip, :internal_ip, :nodes, :status, :power]
309
- columns = {
310
- "ID" => :id,
311
- "Name" => :name,
312
- "External Name" => :external_name,
313
- "Hostname" => :hostname,
314
- "Type" => :type,
315
- "Owner" => :owner,
316
- "Tenant" => :tenant,
317
- "Cloud" => :cloud,
318
- "Plan" => :plan,
319
- "IP" => :ip,
320
- "Private IP" => :internal_ip,
321
- "Nodes" => :nodes,
322
- "Status" => :status,
323
- "Power" => :power,
324
- "CPU" => :cpu,
325
- "Memory" => :memory,
326
- "Storage" => :storage,
327
- "Created" => :created,
328
- "Updated" => :updated,
329
- }
330
- if options[:details] != true
331
- columns.delete("External Name")
332
- columns.delete("Hostname")
333
- columns.delete("Plan")
334
- columns.delete("Private IP")
335
- columns.delete("Owner")
336
- columns.delete("Tenant")
337
- columns.delete("Power")
338
- columns.delete("Created")
339
- columns.delete("Updated")
340
- end
341
- # hide External Name if there are none
342
- if !servers.find {|it| it['externalName'] && it['externalName'] != it['name']}
343
- columns.delete("External Name")
344
276
  end
345
- if !multi_tenant
346
- columns.delete("Tenant")
347
- end
348
- # columns += [:cpu, :memory, :storage]
349
- # # custom pretty table columns ...
350
- # if options[:include_fields]
351
- # columns = options[:include_fields]
352
- # end
353
- print cyan
354
- print as_pretty_table(rows, columns.upcase_keys!, options)
355
- print reset
356
- print_results_pagination(json_response)
277
+ row = {
278
+ id: server['id'],
279
+ name: server['name'],
280
+ external_name: server['externalName'],
281
+ hostname: server['hostname'],
282
+ platform: server['serverOs'] ? server['serverOs']['name'].upcase : 'N/A',
283
+ type: server['computeServerType'] ? server['computeServerType']['name'] : 'unmanaged',
284
+ tenant: server['account'] ? server['account']['name'] : server['accountId'],
285
+ owner: server['owner'] ? server['owner']['username'] : server['owner'],
286
+ cloud: server['zone'] ? server['zone']['name'] : '',
287
+ plan: server['plan'] ? server['plan']['name'] : '',
288
+ ip: server['externalIp'],
289
+ internal_ip: server['internalIp'],
290
+ nodes: server['containers'] ? server['containers'].size : '',
291
+ # status: format_server_status(server, cyan),
292
+ status: (options[:details]||options[:all_fields]) ? format_server_status(server, cyan) : format_server_status_friendly(server, cyan),
293
+ power: format_server_power_state(server, cyan),
294
+ cpu: cpu_usage_str + cyan,
295
+ memory: memory_usage_str + cyan,
296
+ storage: storage_usage_str + cyan,
297
+ created: format_local_dt(server['dateCreated']),
298
+ updated: format_local_dt(server['lastUpdated']),
299
+ }
300
+ row
301
+ }
302
+ # columns = [:id, :name, :type, :cloud, :ip, :internal_ip, :nodes, :status, :power]
303
+ columns = {
304
+ "ID" => :id,
305
+ "Name" => :name,
306
+ "External Name" => :external_name,
307
+ "Hostname" => :hostname,
308
+ "Type" => :type,
309
+ "Owner" => :owner,
310
+ "Tenant" => :tenant,
311
+ "Cloud" => :cloud,
312
+ "Plan" => :plan,
313
+ "IP" => :ip,
314
+ "Private IP" => :internal_ip,
315
+ "Nodes" => :nodes,
316
+ "Status" => :status,
317
+ "Power" => :power,
318
+ "CPU" => :cpu,
319
+ "Memory" => :memory,
320
+ "Storage" => :storage,
321
+ "Created" => :created,
322
+ "Updated" => :updated,
323
+ }
324
+ if options[:details] != true
325
+ columns.delete("External Name")
326
+ columns.delete("Hostname")
327
+ columns.delete("Plan")
328
+ columns.delete("Private IP")
329
+ columns.delete("Owner")
330
+ columns.delete("Tenant")
331
+ columns.delete("Power")
332
+ columns.delete("Created")
333
+ columns.delete("Updated")
357
334
  end
358
- print reset,"\n"
335
+ # hide External Name if there are none
336
+ if !servers.find {|it| it['externalName'] && it['externalName'] != it['name']}
337
+ columns.delete("External Name")
338
+ end
339
+ if !multi_tenant
340
+ columns.delete("Tenant")
341
+ end
342
+ # columns += [:cpu, :memory, :storage]
343
+ # # custom pretty table columns ...
344
+ # if options[:include_fields]
345
+ # columns = options[:include_fields]
346
+ # end
347
+ print cyan
348
+ print as_pretty_table(rows, columns.upcase_keys!, options)
349
+ print reset
350
+ print_results_pagination(json_response)
359
351
  end
360
- rescue RestClient::Exception => e
361
- print_rest_exception(e, options)
362
- exit 1
352
+ print reset,"\n"
363
353
  end
354
+ return 0, nil
364
355
  end
365
356
 
366
357
  def count(args)
@@ -491,7 +482,7 @@ class Morpheus::Cli::Hosts
491
482
  opts.on('--refresh-until STATUS', String, "Refresh until a specified status is reached.") do |val|
492
483
  options[:refresh_until_status] = val.to_s.downcase
493
484
  end
494
- build_common_options(opts, options, [:json, :csv, :yaml, :fields, :dry_run, :remote])
485
+ build_standard_get_options(opts, options)
495
486
  end
496
487
  optparse.parse!(args)
497
488
  if args.count < 1
@@ -506,37 +497,24 @@ class Morpheus::Cli::Hosts
506
497
  end
507
498
 
508
499
  def _get(arg, options)
509
- begin
510
- @servers_interface.setopts(options)
511
- if options[:dry_run]
512
- if arg.to_s =~ /\A\d{1,}\Z/
513
- print_dry_run @servers_interface.dry.get(arg.to_i)
514
- else
515
- print_dry_run @servers_interface.dry.list({name: arg})
516
- end
517
- return
518
- end
519
- json_response = nil
500
+ @servers_interface.setopts(options)
501
+ if options[:dry_run]
520
502
  if arg.to_s =~ /\A\d{1,}\Z/
521
- json_response = @servers_interface.get(arg.to_i)
503
+ print_dry_run @servers_interface.dry.get(arg.to_i)
522
504
  else
523
- server = find_host_by_name_or_id(arg)
524
- json_response = @servers_interface.get(server['id'])
525
- # json_response = {"server" => server} need stats
526
- end
527
- if options[:json]
528
- json_response.delete('stats') if options[:include_fields]
529
- puts as_json(json_response, options, "server")
530
- return 0
531
- elsif options[:yaml]
532
- json_response.delete('stats') if options[:include_fields]
533
- puts as_yaml(json_response, options, "server")
534
- return 0
535
- end
536
- if options[:csv]
537
- puts records_as_csv([json_response['server']], options)
538
- return 0
505
+ print_dry_run @servers_interface.dry.list({name: arg})
539
506
  end
507
+ return
508
+ end
509
+ json_response = nil
510
+ if arg.to_s =~ /\A\d{1,}\Z/
511
+ json_response = @servers_interface.get(arg.to_i)
512
+ else
513
+ server = find_host_by_name_or_id(arg)
514
+ json_response = @servers_interface.get(server['id'])
515
+ # json_response = {"server" => server} need stats
516
+ end
517
+ render_response(json_response, options, "server") do
540
518
  server = json_response['server'] || json_response['host'] || {}
541
519
  #stats = server['stats'] || json_response['stats'] || {}
542
520
  stats = json_response['stats'] || {}
@@ -622,11 +600,8 @@ class Morpheus::Cli::Hosts
622
600
  _get(arg, options)
623
601
  end
624
602
  end
625
-
626
- rescue RestClient::Exception => e
627
- print_rest_exception(e, options)
628
- exit 1
629
603
  end
604
+ return 0, nil
630
605
  end
631
606
 
632
607
  def stats(args)
@@ -781,7 +756,7 @@ class Morpheus::Cli::Hosts
781
756
  opts.on( '-t', '--type TYPE', "Server Type Code" ) do |val|
782
757
  options[:server_type_code] = val
783
758
  end
784
- opts.on("--security-groups LIST", Integer, "Security Groups, comma sepearated list of security group IDs") do |val|
759
+ opts.on("--security-groups LIST", Integer, "Security Groups, comma separated list of security group IDs") do |val|
785
760
  options[:security_groups] = val.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
786
761
  end
787
762
  opts.on('--refresh [SECONDS]', String, "Refresh until status is running,failed. Default interval is #{default_refresh_interval} seconds.") do |val|
@@ -842,7 +817,7 @@ class Morpheus::Cli::Hosts
842
817
  cloud_type = cloud_type_for_id(cloud['zoneTypeId'])
843
818
 
844
819
  # Server Type
845
- cloud_server_types = cloud_type['serverTypes'].select{|b| b['creatable'] == true }.sort { |x,y| x['displayOrder'] <=> y['displayOrder'] }
820
+ cloud_server_types = cloud_type['serverTypes'].select{|b| b['creatable'] == true && b['containerHypervisor'] == false }.sort { |x,y| x['displayOrder'] <=> y['displayOrder'] }
846
821
  if options[:server_type_code]
847
822
  server_type_code = options[:server_type_code]
848
823
  else
@@ -1982,6 +1957,10 @@ class Morpheus::Cli::Hosts
1982
1957
  optparse = Morpheus::Cli::OptionParser.new do |opts|
1983
1958
  opts.banner = subcommand_usage("[host]")
1984
1959
  build_standard_list_options(opts, options)
1960
+ opts.footer = <<-EOT
1961
+ List installed software for a host.
1962
+ [host] is required. This is the name or id of a host.
1963
+ EOT
1985
1964
  end
1986
1965
  optparse.parse!(args)
1987
1966
  verify_args!(args:args, optparse:optparse, count:1)
@@ -2026,6 +2005,48 @@ class Morpheus::Cli::Hosts
2026
2005
  end
2027
2006
  end
2028
2007
 
2008
+ def software_sync(args)
2009
+ options = {}
2010
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
2011
+ opts.banner = subcommand_usage("[host]")
2012
+ build_standard_update_options(opts, options)
2013
+ opts.footer = <<-EOT
2014
+ Sync installed software for a host.
2015
+ [host] is required. This is the name or id of a host.
2016
+ EOT
2017
+ end
2018
+ optparse.parse!(args)
2019
+ verify_args!(args:args, optparse:optparse, count:1)
2020
+ connect(options)
2021
+ begin
2022
+ server = find_host_by_name_or_id(args[0])
2023
+ return 1 if server.nil?
2024
+ payload = {}
2025
+ if options[:payload]
2026
+ payload = options[:payload]
2027
+ payload.deep_merge!(parse_passed_options(options))
2028
+ else
2029
+ payload.deep_merge!(parse_passed_options(options))
2030
+ end
2031
+ params = {}
2032
+ params.merge!(parse_query_options(options))
2033
+ @servers_interface.setopts(options)
2034
+ if options[:dry_run]
2035
+ print_dry_run @servers_interface.dry.software_sync(server['id'], payload, params)
2036
+ return
2037
+ end
2038
+ json_response = @servers_interface.software_sync(server['id'], payload, params)
2039
+ render_response(json_response, options) do
2040
+ print_green_success "Syncing software for host #{server['name']}"
2041
+ #get([server['id']])
2042
+ end
2043
+ return 0
2044
+ rescue RestClient::Exception => e
2045
+ print_rest_exception(e, options)
2046
+ exit 1
2047
+ end
2048
+ end
2049
+
2029
2050
  private
2030
2051
 
2031
2052
  def find_host_by_id(id)