morpheus-cli 4.2.8 → 4.2.10

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api.rb +1 -1
  4. data/lib/morpheus/api/activity_interface.rb +9 -0
  5. data/lib/morpheus/api/api_client.rb +83 -27
  6. data/lib/morpheus/api/apps_interface.rb +21 -0
  7. data/lib/morpheus/api/dashboard_interface.rb +5 -21
  8. data/lib/morpheus/api/instances_interface.rb +3 -10
  9. data/lib/morpheus/api/invoice_line_items_interface.rb +14 -0
  10. data/lib/morpheus/api/invoices_interface.rb +7 -12
  11. data/lib/morpheus/api/library_layouts_interface.rb +8 -0
  12. data/lib/morpheus/api/ping_interface.rb +20 -0
  13. data/lib/morpheus/api/projects_interface.rb +33 -0
  14. data/lib/morpheus/api/setup_interface.rb +19 -36
  15. data/lib/morpheus/api/user_settings_interface.rb +0 -6
  16. data/lib/morpheus/api/whoami_interface.rb +4 -8
  17. data/lib/morpheus/benchmarking.rb +16 -26
  18. data/lib/morpheus/cli.rb +10 -5
  19. data/lib/morpheus/cli/access_token_command.rb +5 -8
  20. data/lib/morpheus/cli/activity_command.rb +146 -0
  21. data/lib/morpheus/cli/apps.rb +312 -121
  22. data/lib/morpheus/cli/archives_command.rb +1 -1
  23. data/lib/morpheus/cli/auth_command.rb +4 -11
  24. data/lib/morpheus/cli/blueprints_command.rb +196 -137
  25. data/lib/morpheus/cli/change_password_command.rb +1 -1
  26. data/lib/morpheus/cli/cli_command.rb +225 -72
  27. data/lib/morpheus/cli/cli_registry.rb +2 -2
  28. data/lib/morpheus/cli/cloud_datastores_command.rb +1 -1
  29. data/lib/morpheus/cli/clouds.rb +5 -20
  30. data/lib/morpheus/cli/clusters.rb +4 -28
  31. data/lib/morpheus/cli/commands/standard/alias_command.rb +2 -9
  32. data/lib/morpheus/cli/commands/standard/benchmark_command.rb +2 -0
  33. data/lib/morpheus/cli/commands/standard/curl_command.rb +2 -3
  34. data/lib/morpheus/cli/commands/standard/history_command.rb +3 -6
  35. data/lib/morpheus/cli/commands/standard/man_command.rb +10 -7
  36. data/lib/morpheus/cli/commands/standard/ssl_verification_command.rb +10 -9
  37. data/lib/morpheus/cli/containers_command.rb +3 -3
  38. data/lib/morpheus/cli/credentials.rb +13 -16
  39. data/lib/morpheus/cli/error_handler.rb +18 -12
  40. data/lib/morpheus/cli/errors.rb +45 -0
  41. data/lib/morpheus/cli/execute_schedules_command.rb +1 -1
  42. data/lib/morpheus/cli/execution_request_command.rb +4 -4
  43. data/lib/morpheus/cli/groups.rb +84 -132
  44. data/lib/morpheus/cli/hosts.rb +6 -16
  45. data/lib/morpheus/cli/instances.rb +100 -183
  46. data/lib/morpheus/cli/invoices_command.rb +505 -71
  47. data/lib/morpheus/cli/library_layouts_command.rb +254 -166
  48. data/lib/morpheus/cli/library_option_lists_command.rb +0 -87
  49. data/lib/morpheus/cli/library_option_types_command.rb +0 -96
  50. data/lib/morpheus/cli/license.rb +3 -0
  51. data/lib/morpheus/cli/login.rb +17 -37
  52. data/lib/morpheus/cli/logout.rb +9 -5
  53. data/lib/morpheus/cli/mixins/accounts_helper.rb +83 -7
  54. data/lib/morpheus/cli/mixins/operations_helper.rb +41 -0
  55. data/lib/morpheus/cli/mixins/option_source_helper.rb +255 -0
  56. data/lib/morpheus/cli/mixins/print_helper.rb +18 -4
  57. data/lib/morpheus/cli/mixins/provisioning_helper.rb +222 -13
  58. data/lib/morpheus/cli/mixins/remote_helper.rb +139 -0
  59. data/lib/morpheus/cli/monitoring_checks_command.rb +11 -3
  60. data/lib/morpheus/cli/network_groups_command.rb +8 -2
  61. data/lib/morpheus/cli/option_types.rb +1 -1
  62. data/lib/morpheus/cli/ping.rb +252 -0
  63. data/lib/morpheus/cli/price_sets_command.rb +16 -27
  64. data/lib/morpheus/cli/prices_command.rb +34 -27
  65. data/lib/morpheus/cli/processes_command.rb +81 -7
  66. data/lib/morpheus/cli/projects_command.rb +607 -0
  67. data/lib/morpheus/cli/recent_activity_command.rb +87 -65
  68. data/lib/morpheus/cli/remote.rb +965 -974
  69. data/lib/morpheus/cli/reports_command.rb +3 -15
  70. data/lib/morpheus/cli/roles.rb +8 -31
  71. data/lib/morpheus/cli/service_plans_command.rb +25 -31
  72. data/lib/morpheus/cli/setup.rb +392 -0
  73. data/lib/morpheus/cli/shell.rb +144 -56
  74. data/lib/morpheus/cli/subnets_command.rb +71 -11
  75. data/lib/morpheus/cli/tasks.rb +3 -3
  76. data/lib/morpheus/cli/user_sources_command.rb +4 -4
  77. data/lib/morpheus/cli/users.rb +135 -109
  78. data/lib/morpheus/cli/version.rb +1 -1
  79. data/lib/morpheus/cli/whitelabel_settings_command.rb +7 -7
  80. data/lib/morpheus/cli/whoami.rb +90 -129
  81. data/lib/morpheus/cli/wiki_command.rb +2 -14
  82. data/lib/morpheus/ext/rest_client.rb +36 -0
  83. data/lib/morpheus/formatters.rb +42 -5
  84. data/lib/morpheus/rest_client.rb +0 -10
  85. data/lib/morpheus/terminal.rb +41 -1
  86. data/lib/morpheus/util.rb +24 -0
  87. metadata +16 -3
  88. data/lib/morpheus/cli/command_error.rb +0 -22
@@ -1,7 +1,7 @@
1
1
  require 'term/ansicolor'
2
2
  require 'shellwords'
3
3
  require 'morpheus/logging'
4
- require 'morpheus/cli/command_error'
4
+ require 'morpheus/cli/errors'
5
5
  require 'morpheus/cli/error_handler'
6
6
  require 'morpheus/cli/expression_parser'
7
7
 
@@ -81,7 +81,7 @@ module Morpheus
81
81
  instance.get(command_name).new.handle(args)
82
82
  else
83
83
  # todo: need to just return error instead of raise
84
- raise Morpheus::Cli::CommandError.new("'#{command_name}' is not a command. See 'morpheus --help'.")
84
+ raise CommandNotFoundError.new("'#{command_name}' is not a morpheus command.")
85
85
  end
86
86
  end
87
87
 
@@ -251,7 +251,7 @@ class Morpheus::Cli::CloudDatastoresCommand
251
251
  end
252
252
  opts.add_hidden_option('-c') # prefer args[0] for [cloud]
253
253
  opts.on('--group-access-all [on|off]', String, "Toggle Access for all groups.") do |val|
254
- group_access_all = val.to_s == 'on' || val.to_s == 'true'
254
+ group_access_all = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
255
255
  end
256
256
  opts.on('--group-access LIST', Array, "Group Access, comma separated list of group IDs.") do |list|
257
257
  if list.size == 1 && list[0] == 'null' # hacky way to clear it
@@ -257,13 +257,10 @@ class Morpheus::Cli::Clouds
257
257
  payload = nil
258
258
  if options[:payload]
259
259
  payload = options[:payload]
260
- # support -O OPTION switch on top of --payload
261
- if options[:options]
262
- payload['zone'] ||= {}
263
- payload['zone'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) })
264
- end
260
+ payload.deep_merge!({'zone' => parse_passed_options(options)})
265
261
  else
266
262
  cloud_payload = {name: args[0], description: params[:description]}
263
+ cloud_payload.deep_merge!(parse_passed_options(options))
267
264
  # use active group by default
268
265
  params[:group] ||= @active_group_id
269
266
 
@@ -462,7 +459,7 @@ class Morpheus::Cli::Clouds
462
459
  params = {}
463
460
  optparse = Morpheus::Cli::OptionParser.new do |opts|
464
461
  opts.banner = subcommand_usage("[name] [options]")
465
- opts.on( '-f', '--force', "Force Delete" ) do
462
+ opts.on( '-f', '--force', "Force refresh. Useful if the cloud is disabled." ) do
466
463
  query_params[:force] = 'true'
467
464
  end
468
465
  build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
@@ -859,23 +856,11 @@ class Morpheus::Cli::Clouds
859
856
 
860
857
  link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/infrastructure/clouds/#{cloud['id']}#!wiki"
861
858
 
862
- open_command = nil
863
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
864
- open_command = "start #{link}"
865
- elsif RbConfig::CONFIG['host_os'] =~ /darwin/
866
- open_command = "open #{link}"
867
- elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
868
- open_command = "xdg-open #{link}"
869
- end
870
-
871
859
  if options[:dry_run]
872
- puts "system: #{open_command}"
860
+ puts Morpheus::Util.open_url_command(link)
873
861
  return 0
874
862
  end
875
-
876
- system(open_command)
877
-
878
- return 0
863
+ return Morpheus::Util.open_url(link)
879
864
  rescue RestClient::Exception => e
880
865
  print_rest_exception(e, options)
881
866
  exit 1
@@ -355,23 +355,11 @@ class Morpheus::Cli::Clusters
355
355
  link << "#!#{options[:link_tab]}"
356
356
  end
357
357
 
358
- open_command = nil
359
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
360
- open_command = "start #{link}"
361
- elsif RbConfig::CONFIG['host_os'] =~ /darwin/
362
- open_command = "open #{link}"
363
- elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
364
- open_command = "xdg-open #{link}"
365
- end
366
-
367
358
  if options[:dry_run]
368
- puts "system: #{open_command}"
359
+ puts Morpheus::Util.open_url_command(link)
369
360
  return 0
370
361
  end
371
-
372
- system(open_command)
373
-
374
- return 0
362
+ return Morpheus::Util.open_url(link)
375
363
  rescue RestClient::Exception => e
376
364
  print_rest_exception(e, options)
377
365
  exit 1
@@ -2991,23 +2979,11 @@ class Morpheus::Cli::Clusters
2991
2979
 
2992
2980
  link = "#{@appliance_url}/login/oauth-redirect?access_token=#{@access_token}\\&redirectUri=/infrastructure/clusters/#{cluster['id']}#!wiki"
2993
2981
 
2994
- open_command = nil
2995
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
2996
- open_command = "start #{link}"
2997
- elsif RbConfig::CONFIG['host_os'] =~ /darwin/
2998
- open_command = "open #{link}"
2999
- elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
3000
- open_command = "xdg-open #{link}"
3001
- end
3002
-
3003
2982
  if options[:dry_run]
3004
- puts "system: #{open_command}"
2983
+ puts Morpheus::Util.open_url_command(link)
3005
2984
  return 0
3006
2985
  end
3007
-
3008
- system(open_command)
3009
-
3010
- return 0
2986
+ return Morpheus::Util.open_url(link)
3011
2987
  rescue RestClient::Exception => e
3012
2988
  print_rest_exception(e, options)
3013
2989
  exit 1
@@ -63,11 +63,7 @@ EOT
63
63
 
64
64
  end
65
65
  optparse.parse!(args)
66
- if args.count < 1
67
- print_error Morpheus::Terminal.angry_prompt
68
- puts_error "wrong number of arguments, expected 1-N and got #{args.count}\n#{optparse}"
69
- return 1
70
- end
66
+ verify_args!(args:args, optparse:optparse, min: 1)
71
67
 
72
68
  # make this super forgiving.. my name = command -j -O value=woot
73
69
  # the old way, as one argument "name='command'"
@@ -125,10 +121,7 @@ EOT
125
121
  opts.footer = "Export an alias, saving it to your .morpheus_profile for future use"
126
122
  end
127
123
  optparse.parse!(args)
128
- if args.count < 1
129
- puts optparse
130
- exit 1
131
- end
124
+ verify_args!(args:args, optparse:optparse, min: 1)
132
125
  alias_names = args
133
126
  alias_names.each do |arg|
134
127
  if !Morpheus::Cli::CliRegistry.has_alias?(arg)
@@ -360,6 +360,8 @@ EOT
360
360
  else
361
361
  out << "\texit: 0 "
362
362
  end
363
+ total_time_str = "#{benchmark_record.duration.round((benchmark_record.duration > 0.002) ? 3 : 6)}s"
364
+ out << "\t #{total_time_str.ljust(9, ' ')}"
363
365
  else
364
366
  benchmark_records = []
365
367
  n.times do |iteration_index|
@@ -58,11 +58,10 @@ EOT
58
58
  return false
59
59
  end
60
60
 
61
- @api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true}))
61
+ @api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true, :skip_login => true}))
62
62
 
63
63
  if !@appliance_name
64
- print yellow,"Please specify a Morpheus Appliance with -r or see the command `remote use`#{reset}\n"
65
- return false
64
+ raise_command_error "#{command_name} requires a remote to be specified, use -r [remote] or set the active remote with `remote use`"
66
65
  end
67
66
 
68
67
  # curry --insecure to curl
@@ -40,17 +40,14 @@ EOT
40
40
  end
41
41
  raw_cmd = "#{command_name} #{args.join(' ')}"
42
42
  optparse.parse!(args)
43
- if args.count != 0
44
- print_error Morpheus::Terminal.angry_prompt
45
- puts_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.join(' ')}\n#{optparse}"
46
- return 1
47
- end
43
+ verify_args!(args:args, count: 0, optparse:optparse)
48
44
  if options[:do_flush]
49
45
  command_count = Morpheus::Cli::Shell.instance.history_commands_count
50
46
  unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to flush your command history (#{format_number(command_count)} #{command_count == 1 ? 'command' : 'commands'})?")
51
47
  return 9, "aborted command"
52
48
  end
53
- Morpheus::Cli::Shell.instance.flush_history
49
+ flush_n = options[:max] ? options[:max] : nil
50
+ Morpheus::Cli::Shell.instance.flush_history(flush_n)
54
51
  return 0
55
52
  else
56
53
  Morpheus::Cli::Shell.instance.print_history(options)
@@ -51,7 +51,7 @@ The -g switch be used to regenerate the file.
51
51
  EOT
52
52
  end
53
53
  optparse.parse!(args)
54
-
54
+ verify_args!(args:args, optparse:optparse, count:0)
55
55
  if goto_wiki
56
56
  link = "https://github.com/gomorpheus/morpheus-cli/wiki/CLI-Manual"
57
57
  if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
@@ -153,13 +153,15 @@ EOT
153
153
  begin
154
154
 
155
155
  manpage.print <<-ENDTEXT
156
+ morpheus v#{Morpheus::Cli::VERSION}
157
+
156
158
  ## NAME
157
159
 
158
- morpheus - the command line interface for interacting with the Morpheus Data appliance
160
+ morpheus - the command line interface for interacting with the Morpheus appliance
159
161
 
160
162
  ## SYNOPSIS
161
163
 
162
- morpheus [command] [<args>]
164
+ morpheus [command] [<args>] [options]
163
165
 
164
166
  ## DESCRIPTION
165
167
 
@@ -168,9 +170,9 @@ EOT
168
170
  This is a command line interface for managing a Morpheus Appliance.
169
171
  All communication with the remote appliance is done via the Morpheus API.
170
172
 
171
- To setup a new appliance, see the `remote add` and `remote setup` commands.
173
+ To get started, see the command `remote add` command.
172
174
 
173
- To get started, visit https://github.com/gomorpheus/morpheus-cli/wiki/Getting-Started
175
+ To learn more, visit https://github.com/gomorpheus/morpheus-cli/wiki/Getting-Started
174
176
 
175
177
  To learn more about the Morpheus Appliance, visit https://www.morpheusdata.com/features
176
178
 
@@ -220,7 +222,7 @@ ENDTEXT
220
222
  exit_code, err = terminal.execute("--help")
221
223
  manpage.print "```\n"
222
224
  manpage.print "\n"
223
- # output help for every unhidden command
225
+ # output help for every command (that is not hidden)
224
226
  Morpheus::Cli::CliRegistry.all.keys.sort.each do |cmd|
225
227
  cmd_klass = Morpheus::Cli::CliRegistry.instance.get(cmd)
226
228
  cmd_instance = cmd_klass.new
@@ -237,7 +239,8 @@ ENDTEXT
237
239
  raise err unless err.success?
238
240
  end
239
241
  manpage.print "```\n"
240
- subcommands = cmd_klass.subcommands
242
+ # subcommands = cmd_klass.subcommands
243
+ subcommands = cmd_klass.visible_subcommands
241
244
  if subcommands && subcommands.size > 0
242
245
  subcommands.sort.each do |subcommand, subcommand_method|
243
246
  Morpheus::Logging::DarkPrinter.puts "appending command help `morpheus #{cmd} #{subcommand} --help`" if Morpheus::Logging.debug? && !options[:quiet]
@@ -8,12 +8,14 @@ class Morpheus::Cli::SslVerificationCommand
8
8
  include Morpheus::Cli::CliCommand
9
9
  set_command_name :'ssl-verification'
10
10
  set_command_hidden
11
- def usage
11
+
12
+ def usage
12
13
  <<-EOT
13
14
  Usage: morpheus #{command_name} [on|off]
14
- \tThis is intended for use in your morpheus scripts.
15
- \t"Enable [on] or Disable [off] SSL Verification for all your api requests."
16
- \tThe default is on.
15
+
16
+ Set SSL Verification on or off.
17
+ Enable [on] or disable [off] SSL Verification.
18
+ If no arguments are passed, the current value is printed.
17
19
  EOT
18
20
  end
19
21
 
@@ -28,14 +30,13 @@ EOT
28
30
  end
29
31
  end
30
32
  optparse.parse!(args)
33
+ verify_args!(args:args, optparse:optparse, max:1)
31
34
  if args.count == 0
32
35
  puts Morpheus::RestClient.ssl_verification_enabled? ? "on" : "off"
33
- return true
34
- end
35
- if args.count > 1
36
- puts optparse
37
- return false
36
+ return Morpheus::RestClient.ssl_verification_enabled? ? 0 : 1
38
37
  end
38
+
39
+
39
40
  if ["on", "enabled", "true", "1"].include?(args[0].to_s.strip.downcase)
40
41
  Morpheus::RestClient.enable_ssl_verification = true
41
42
  elsif ["off", "disabled", "false", "0"].include?(args[0].to_s.strip.downcase)
@@ -362,7 +362,7 @@ class Morpheus::Cli::ContainersCommand
362
362
  options = {}
363
363
  optparse = Morpheus::Cli::OptionParser.new do|opts|
364
364
  opts.banner = subcommand_usage("[id list]")
365
- opts.footer = "This outputs the list of the actions available to specified container(s)."
365
+ opts.footer = "List the actions available to specified container(s)."
366
366
  build_common_options(opts, options, [:json, :dry_run, :remote])
367
367
  end
368
368
  optparse.parse!(args)
@@ -657,9 +657,9 @@ class Morpheus::Cli::ContainersCommand
657
657
  execution_request = json_response['executionRequest']
658
658
  print_green_success "Executing request #{execution_request['uniqueId']}"
659
659
  if do_refresh
660
- Morpheus::Cli::ExecutionRequestCommand.new.handle(["get", execution_request['uniqueId'], "--refresh"])
660
+ Morpheus::Cli::ExecutionRequestCommand.new.handle(["get", execution_request['uniqueId'], "--refresh"]+ (options[:remote] ? ["-r",options[:remote]] : []))
661
661
  else
662
- Morpheus::Cli::ExecutionRequestCommand.new.handle(["get", execution_request['uniqueId']])
662
+ Morpheus::Cli::ExecutionRequestCommand.new.handle(["get", execution_request['uniqueId']]+ (options[:remote] ? ["-r",options[:remote]] : []))
663
663
  end
664
664
  return 0
665
665
  rescue RestClient::Exception => e
@@ -40,7 +40,15 @@ module Morpheus
40
40
  password = nil
41
41
  wallet = nil
42
42
 
43
-
43
+ # should not need this logic in here
44
+ if options[:remote_url]
45
+ # @appliance_name = options[:remote_url]
46
+ # name should change too though or printing may be misleading.
47
+ # @appliance_name = "remote-url"
48
+ # @appliance_url = options[:remote_url]
49
+ # do not save when using --remote-url
50
+ do_save = false
51
+ end
44
52
 
45
53
  if options[:remote_token]
46
54
  # user passed in a token to login with.
@@ -48,7 +56,8 @@ module Morpheus
48
56
  # OR whoami should return other wallet info like access token or maybe just the expiration date
49
57
  # for now, it just stores the access token without other wallet info
50
58
  begin
51
- whoami_interface = Morpheus::WhoamiInterface.new(options[:remote_token], nil, nil, @appliance_url)
59
+ # @setup_interface = Morpheus::SetupInterface.new({url:@appliance_url,access_token:@access_token})
60
+ whoami_interface = Morpheus::WhoamiInterface.new({url: @appliance_url, token: options[:remote_token]})
52
61
  whoami_interface.setopts(options)
53
62
  if options[:dry_run]
54
63
  print_dry_run whoami_interface.dry.get()
@@ -84,24 +93,15 @@ module Morpheus
84
93
  wallet = nil
85
94
  end
86
95
  else
87
-
88
96
  # ok prompt for creds..
89
97
  username = options['username'] || options[:username] || nil
90
98
  password = options['password'] || options[:password] || nil
91
99
 
100
+ # what are these for? just use :username and :password
92
101
  if options[:remote_username]
93
102
  username = options[:remote_username]
94
103
  password = options[:remote_password]
95
- if do_save == true
96
- do_save = (options[:remote_url] ? false : true)
97
- end
98
- else
99
- # maybe just if check if options[:test_only] != true
100
- # if do_save == true
101
- # wallet = load_saved_credentials
102
- # end
103
104
  end
104
-
105
105
  if wallet.nil?
106
106
  unless options[:quiet] || options[:no_prompt]
107
107
  # if username.empty? || password.empty?
@@ -126,7 +126,7 @@ module Morpheus
126
126
  end
127
127
  if password.empty?
128
128
  print "Password: #{required_blue_prompt} "
129
- # wtf is this STDIN and $stdin and not my_terminal.stdin ?
129
+ # this should be my_terminal.stdin instead of STDIN and $stdin
130
130
  password = STDIN.noecho(&:gets).chomp!
131
131
  print "\n"
132
132
  else
@@ -185,14 +185,11 @@ module Morpheus
185
185
  end
186
186
 
187
187
  if do_save && @appliance_name
188
-
189
-
190
188
  begin
191
189
  # save pertinent session info to the appliance
192
190
  save_credentials(@appliance_name, wallet)
193
191
  now = Time.now.to_i
194
192
  appliance = ::Morpheus::Cli::Remote.load_remote(@appliance_name)
195
-
196
193
  if wallet && wallet['access_token']
197
194
  save_credentials(@appliance_name, wallet)
198
195
  else
@@ -4,7 +4,7 @@ require 'json'
4
4
  require 'rest_client'
5
5
  require 'net/https'
6
6
  require 'morpheus/logging'
7
- require 'morpheus/cli/command_error'
7
+ require 'morpheus/cli/errors'
8
8
  require 'morpheus/cli/expression_parser'
9
9
 
10
10
  class Morpheus::Cli::ErrorHandler
@@ -31,34 +31,38 @@ class Morpheus::Cli::ErrorHandler
31
31
  # raise err
32
32
  # @stderr.puts "#{red}#{err.message}#{reset}"
33
33
  puts_angry_error err.message
34
- @stderr.puts "Try -h for help with this command."
34
+ @stderr.puts "Use -h to get help with this command."
35
35
  do_print_stacktrace = false
36
36
  # exit_code = 127
37
+ # when Morpheus::Cli::CommandArgumentsError
37
38
  when Morpheus::Cli::CommandError
38
39
  # @stderr.puts "#{red}#{err.message}#{reset}"
39
- puts_angry_error err.message
40
+ # this should probably print the whole thing as red, but just does the first line for now.
41
+ message_lines = err.message.split(/\r?\n/)
42
+ first_line = message_lines.shift
43
+ puts_angry_error first_line
44
+ @stderr.puts message_lines.join("\n") unless message_lines.empty?
45
+ @stderr.puts "Use -h to get help with this command."
40
46
  do_print_stacktrace = false
41
47
  if err.exit_code
42
48
  exit_code = err.exit_code
43
49
  end
44
- # @stderr.puts "Try -h for help with this command."
45
50
  when Morpheus::Cli::ExpressionParser::InvalidExpression
46
51
  # @stderr.puts "#{red}#{err.message}#{reset}"
47
52
  puts_angry_error err.message
48
53
  do_print_stacktrace = false
49
54
  exit_code = 99
50
55
  when SocketError
51
- @stderr.puts "#{red}Error Communicating with the Appliance.#{reset}"
56
+ @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
52
57
  @stderr.puts "#{red}#{err.message}#{reset}"
53
58
  when RestClient::Exceptions::Timeout
54
- @stderr.puts "#{red}Error Communicating with the Appliance.#{reset}"
59
+ @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
55
60
  @stderr.puts "#{red}#{err.message}#{reset}"
56
61
  when Errno::ECONNREFUSED
57
- @stderr.puts "#{red}Error Communicating with the Appliance.#{reset}"
62
+ @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
58
63
  @stderr.puts "#{red}#{err.message}#{reset}"
59
- # @stderr.puts "Try -h for help with this command."
60
64
  when OpenSSL::SSL::SSLError
61
- @stderr.puts "#{red}Error Communicating with the Appliance.#{reset}"
65
+ @stderr.puts "#{red}Error Communicating with the remote appliance.#{reset}"
62
66
  @stderr.puts "#{red}#{err.message}#{reset}"
63
67
  when RestClient::Exception
64
68
  print_rest_exception(err, options)
@@ -125,7 +129,7 @@ class Morpheus::Cli::ErrorHandler
125
129
  rescue TypeError, JSON::ParserError => ex
126
130
  end
127
131
  else
128
- @stderr.print red, "Error Communicating with the Appliance. #{e}", reset, "\n"
132
+ @stderr.print red, "Error Communicating with the remote appliance. #{e}", reset, "\n"
129
133
  if options[:json] || options[:debug]
130
134
  begin
131
135
  response = JSON.parse(e.response.to_s)
@@ -145,7 +149,7 @@ class Morpheus::Cli::ErrorHandler
145
149
  end
146
150
  end
147
151
  else
148
- @stderr.print red, "Error Communicating with the Appliance. #{e}", reset, "\n"
152
+ @stderr.print red, "Error Communicating with the remote appliance. #{e}", reset, "\n"
149
153
  end
150
154
  # uh, having this print method return exit_code, err to standardize return values of methods that are still calling it, at the end just by chance..
151
155
  # return exit_code, err
@@ -204,7 +208,7 @@ class Morpheus::Cli::ErrorHandler
204
208
  end
205
209
 
206
210
  def print_rest_exception_request_and_response(e)
207
- @stderr.puts "#{red}Error Communicating with the Appliance. (#{e.response.code})#{reset}"
211
+ @stderr.puts "#{red}Error Communicating with the remote appliance. (HTTP #{e.response.code})#{reset}"
208
212
  response = e.response
209
213
  request = response.instance_variable_get("@request")
210
214
  @stderr.print red
@@ -220,7 +224,9 @@ protected
220
224
  def puts_angry_error(*msgs)
221
225
  # @stderr.print "#{Term::ANSIColor.red}morpheus: #{Term::ANSIColor.reset}#{msg}\n"
222
226
  @stderr.print(Morpheus::Terminal.angry_prompt)
227
+ @stderr.print(Term::ANSIColor.red)
223
228
  @stderr.puts(*msgs)
229
+ @stderr.print(reset)
224
230
  end
225
231
 
226
232
  # def puts(*args)