morpheus-cli 4.2.8 → 4.2.10

Sign up to get free protection for your applications and to get access to all the features.
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)