kontena-cli 1.3.0.pre1 → 1.3.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/kontena +2 -1
  4. data/lib/kontena/callback.rb +1 -1
  5. data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +1 -2
  6. data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +2 -3
  7. data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +1 -2
  8. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +2 -2
  9. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +2 -2
  10. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +9 -9
  11. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +2 -2
  12. data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +1 -2
  13. data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +1 -2
  14. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +2 -3
  15. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +2 -2
  16. data/lib/kontena/cli/apps/common.rb +0 -1
  17. data/lib/kontena/cli/apps/init_command.rb +2 -0
  18. data/lib/kontena/cli/apps/kontena_yml_generator.rb +2 -1
  19. data/lib/kontena/cli/apps/list_command.rb +10 -2
  20. data/lib/kontena/cli/apps/yaml/reader.rb +2 -1
  21. data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -1
  22. data/lib/kontena/cli/cloud/login_command.rb +51 -7
  23. data/lib/kontena/cli/cloud/master/list_command.rb +14 -11
  24. data/lib/kontena/cli/common.rb +36 -83
  25. data/lib/kontena/cli/config.rb +46 -29
  26. data/lib/kontena/cli/containers/list_command.rb +30 -41
  27. data/lib/kontena/cli/etcd/list_command.rb +12 -7
  28. data/lib/kontena/cli/external_registries/list_command.rb +14 -8
  29. data/lib/kontena/cli/grids/list_command.rb +18 -10
  30. data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +7 -5
  31. data/lib/kontena/cli/grids/users/list_command.rb +9 -7
  32. data/lib/kontena/cli/localhost_web_server.rb +3 -3
  33. data/lib/kontena/cli/log_formatters/compact.rb +65 -0
  34. data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
  35. data/lib/kontena/cli/master/config/import_command.rb +2 -1
  36. data/lib/kontena/cli/master/config/set_command.rb +1 -1
  37. data/lib/kontena/cli/master/list_command.rb +16 -10
  38. data/lib/kontena/cli/master/token/list_command.rb +23 -12
  39. data/lib/kontena/cli/master/user/invite_command.rb +1 -1
  40. data/lib/kontena/cli/master/user/list_command.rb +17 -6
  41. data/lib/kontena/cli/nodes/labels/list_command.rb +3 -0
  42. data/lib/kontena/cli/nodes/list_command.rb +58 -37
  43. data/lib/kontena/cli/nodes/show_command.rb +1 -1
  44. data/lib/kontena/cli/plugins/install_command.rb +2 -2
  45. data/lib/kontena/cli/plugins/list_command.rb +19 -5
  46. data/lib/kontena/cli/plugins/uninstall_command.rb +1 -1
  47. data/lib/kontena/cli/services/containers_command.rb +7 -0
  48. data/lib/kontena/cli/services/envs/list_command.rb +6 -4
  49. data/lib/kontena/cli/services/list_command.rb +47 -36
  50. data/lib/kontena/cli/services/services_helper.rb +9 -16
  51. data/lib/kontena/cli/services/stats_command.rb +2 -1
  52. data/lib/kontena/cli/spinner.rb +3 -5
  53. data/lib/kontena/cli/stacks/common.rb +4 -4
  54. data/lib/kontena/cli/stacks/list_command.rb +42 -33
  55. data/lib/kontena/cli/stacks/registry/search_command.rb +6 -0
  56. data/lib/kontena/cli/stacks/registry/show_command.rb +2 -0
  57. data/lib/kontena/cli/stacks/registry_command.rb +1 -2
  58. data/lib/kontena/cli/stacks/validate_command.rb +1 -0
  59. data/lib/kontena/cli/stacks/yaml/reader.rb +3 -2
  60. data/lib/kontena/cli/stacks/yaml/service_extender.rb +0 -1
  61. data/lib/kontena/cli/stacks/yaml/validations.rb +1 -1
  62. data/lib/kontena/cli/table_generator.rb +125 -0
  63. data/lib/kontena/cli/vault/export_command.rb +7 -4
  64. data/lib/kontena/cli/vault/import_command.rb +3 -0
  65. data/lib/kontena/cli/vault/list_command.rb +23 -10
  66. data/lib/kontena/cli/volumes/create_command.rb +8 -4
  67. data/lib/kontena/cli/volumes/list_command.rb +15 -7
  68. data/lib/kontena/client.rb +44 -33
  69. data/lib/kontena/command.rb +7 -4
  70. data/lib/kontena/debug_instrumentor.rb +10 -9
  71. data/lib/kontena/main_command.rb +1 -3
  72. data/lib/kontena/plugin_manager.rb +15 -7
  73. data/lib/kontena/stacks_cache.rb +7 -7
  74. data/lib/kontena/stacks_client.rb +24 -5
  75. data/lib/kontena/util.rb +43 -15
  76. data/lib/kontena_cli.rb +71 -14
  77. data/spec/kontena/cli/cloud/login_command_spec.rb +42 -0
  78. data/spec/kontena/cli/containers/list_command_spec.rb +1 -2
  79. data/spec/kontena/cli/nodes/list_command_spec.rb +153 -126
  80. data/spec/kontena/cli/registry/create_spec.rb +22 -0
  81. data/spec/kontena/cli/services/stats_command_spec.rb +22 -0
  82. data/spec/kontena/cli/table_generator_spec.rb +118 -0
  83. data/spec/kontena/cli/version_command_spec.rb +2 -2
  84. data/spec/kontena/client_spec.rb +4 -3
  85. data/spec/support/client_helpers.rb +3 -3
  86. data/spec/support/output_helpers.rb +54 -8
  87. metadata +11 -2
@@ -25,7 +25,8 @@ module Kontena::Cli::Stacks
25
25
  attr_reader :file, :raw_content, :errors, :notifications, :defaults, :values, :registry
26
26
 
27
27
  def initialize(file, skip_validation: false, skip_variables: false, variables: nil, values: nil, defaults: nil)
28
- require 'yaml'
28
+ require "safe_yaml"
29
+ SafeYAML::OPTIONS[:default_mode] = :safe
29
30
  require_relative 'service_extender'
30
31
  require_relative 'validator_v3'
31
32
  require_relative 'opto'
@@ -165,7 +166,7 @@ module Kontena::Cli::Stacks
165
166
  template = Liquid::Template.parse(content)
166
167
 
167
168
  # Wrap nil values in LiquidNull to not have Liquid consider them as undefined
168
- vars = Hash[vars.map {|key, value| [key, value.nil? ? LiquidNull.new : value]}]
169
+ vars = vars.map {|key, value| [key, value.nil? ? LiquidNull.new : value]}.to_h
169
170
 
170
171
  template.render!(vars, strict_variables: true, strict_filters: true)
171
172
  end
@@ -1,4 +1,3 @@
1
- require 'yaml'
2
1
  require_relative '../../../util'
3
2
 
4
3
  module Kontena::Cli::Stacks
@@ -51,7 +51,7 @@ module Kontena::Cli::Stacks::YAML
51
51
  'env_file' => optional(-> (value) { value.is_a?(String) || value.is_a?(Array) }),
52
52
  'instances' => optional('integer'),
53
53
  'links' => optional(-> (value) { value.is_a?(Array) || value.nil? }),
54
- 'ports' => optional('array'),
54
+ 'ports' => optional(-> (value) { value.is_a?(Array) && value.all? { |v| v.is_a?(String) && v.match(/\A(\d+\.\d+\.\d+\.\d+)?:?(\d+)\:(\d+)\/?(\w+)?\z/) } }),
55
55
  'pid' => optional('string'),
56
56
  'privileged' => optional('boolean'),
57
57
  'user' => optional('string'),
@@ -0,0 +1,125 @@
1
+ require 'tty-table'
2
+
3
+ module Kontena
4
+ module Cli
5
+ class TableGenerator
6
+
7
+ attr_reader :data
8
+ attr_reader :fields
9
+ attr_reader :header
10
+ attr_reader :row_format_proc, :header_format_proc, :render_options, :render_mode
11
+
12
+ DEFAULT_HEADER_FORMAT_PROC = lambda { |header| header.to_s.capitalize }
13
+
14
+ module Helper
15
+ def self.included(base)
16
+ if base.respond_to?(:option)
17
+ base.option ['-q', '--quiet'], :flag, "Output the identifying column only"
18
+ end
19
+ end
20
+
21
+ def table_generator
22
+ Kontena::Cli::TableGenerator
23
+ end
24
+
25
+ def generate_table(array, fields = nil, &block)
26
+ fields ||= self.fields if self.respond_to?(:fields)
27
+ table_generator.new(
28
+ array,
29
+ fields,
30
+ row_format_proc: block_given? ? block.to_proc : nil,
31
+ header_format_proc: lambda { |item| pastel.blue(item.to_s.capitalize) },
32
+ render_options: self.respond_to?(:render_options) ? self.render_options : nil
33
+ ).render
34
+ end
35
+
36
+ def print_table(array, fields = nil, &block)
37
+ puts generate_table(array, fields, &block)
38
+ end
39
+ end
40
+
41
+ # @param data [Array<Hash>,Array<Array>] an array of hashes or arrays
42
+ # @param fields [Array] an array of field names found in the data hashes.
43
+ # @param fields [Hash] a hash of field_title => field_name_in_the_data_hash, for example 'Users' => 'user_count'
44
+ # @param fields [NilClass] try to auto detect fields (all fields!) from the data hashes
45
+ # @return [TTY::Table]
46
+ def initialize(data, fields = nil, row_format_proc: nil, header_format_proc: nil, render_options: nil)
47
+ @data = data
48
+ @render_options = render_options || { }
49
+ @render_mode = @render_options.delete(:mode) || :basic
50
+ @row_format_proc = row_format_proc
51
+ @header_format_proc = header_format_proc || DEFAULT_HEADER_FORMAT_PROC
52
+ @fields = parse_fields(fields)
53
+ @header = generate_header(fields || @fields)
54
+ end
55
+
56
+ def create_table(header, rows)
57
+ TTY::Table.new(
58
+ header: header,
59
+ rows: rows
60
+ )
61
+ end
62
+
63
+ def table
64
+ create_table(header, rows)
65
+ end
66
+
67
+ def render
68
+ if data.empty?
69
+ fields.map(&method(:format_header_item)).join(' ')
70
+ else
71
+ table.render(render_mode, render_options)
72
+ end
73
+ end
74
+
75
+ def format_row(row)
76
+ return row if row_format_proc.nil?
77
+ row_clone = row.dup
78
+ row_format_proc.call(row_clone)
79
+ row_clone
80
+ end
81
+
82
+ def format_header_item(field_name)
83
+ header_format_proc.call(field_name)
84
+ end
85
+
86
+ def rows
87
+ fields.empty? ? data.map { |row| format_row(row).map(&:values) } : data.map { |row| format_row(row).values_at(*fields) }
88
+ end
89
+
90
+ # Collect all the unique keys from the hashes if the data
91
+ # is an array of hashes.
92
+ def detect_fields
93
+ if data.first.respond_to?(:keys)
94
+ data.flat_map(&:keys).uniq
95
+ else
96
+ []
97
+ end
98
+ end
99
+
100
+ def parse_fields(fields)
101
+ if fields.nil? || fields.empty?
102
+ detect_fields
103
+ elsif fields.kind_of?(Hash)
104
+ fields.values
105
+ else
106
+ fields
107
+ end
108
+ end
109
+
110
+ def generate_header(fields)
111
+ if fields.kind_of?(Hash)
112
+ header = fields.keys
113
+ else
114
+ header = Array(fields)
115
+ end
116
+
117
+ if header.size < 2
118
+ nil
119
+ else
120
+ header.map { |head| format_header_item(head) }
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -11,12 +11,15 @@ module Kontena::Cli::Vault
11
11
 
12
12
  def execute
13
13
  require 'shellwords'
14
+ require 'json'
15
+ require "safe_yaml"
16
+ SafeYAML::OPTIONS[:default_mode] = :safe
14
17
  meth = json? ? :to_json : :to_yaml
15
- puts Hash[
16
- *Kontena.run!(['vault', 'ls', '--return']).sort.flat_map do |secret|
18
+ puts(
19
+ Kontena.run!(['vault', 'ls', '--return']).sort.map do |secret|
17
20
  [secret, Kontena.run!(['vault', 'read', '--return', secret])]
18
- end
19
- ].send(meth)
21
+ end.to_h.send(meth)
22
+ )
20
23
  end
21
24
  end
22
25
  end
@@ -15,6 +15,9 @@ module Kontena::Cli::Vault
15
15
  requires_current_master
16
16
 
17
17
  def parsed_input
18
+ require "json"
19
+ require "safe_yaml"
20
+ SafeYAML::OPTIONS[:default_mode] = :safe
18
21
  json? ? JSON.load(input) : YAML.safe_load(input)
19
22
  end
20
23
 
@@ -1,24 +1,37 @@
1
1
  module Kontena::Cli::Vault
2
2
  class ListCommand < Kontena::Command
3
+ include Kontena::Util
3
4
  include Kontena::Cli::Common
4
5
  include Kontena::Cli::GridOptions
6
+ include Kontena::Cli::TableGenerator::Helper
5
7
 
6
8
  option '--return', :flag, "Return the keys", hidden: true
9
+ option ['--[no-]long', '-l'], :flag, "Show full dates", default: !$stdout.tty?
7
10
 
8
- def execute
9
- require_api_url
10
- require_current_grid
11
+ requires_current_master
12
+ requires_current_master_token
13
+ requires_current_grid
11
14
 
12
- token = require_token
13
- result = client(token).get("grids/#{current_grid}/secrets")
15
+ def secrets
16
+ client.get("grids/#{current_grid}/secrets")['secrets'].sort_by { |s| s['name'] }
17
+ end
14
18
 
15
- return result['secrets'].map { |s| s['name'] } if return?
19
+ def fields
20
+ return['name'] if quiet?
21
+ %w(name created_at updated_at)
22
+ end
16
23
 
17
- column_width_paddings = '%-54s %-25.25s %-25.25s'
18
- puts column_width_paddings % ['NAME', 'CREATED AT', 'UPDATED AT']
19
- result['secrets'].sort_by { |s| s['name'] }.each do |secret|
20
- puts column_width_paddings % [secret['name'], secret['created_at'], secret['updated_at']]
24
+ def execute
25
+ return secrets.map { |s| s['name'] } if return?
26
+ print_table(secrets) do |row|
27
+ next if quiet? || long?
28
+ row['updated_at'] = updated?(row) ? pastel.blue('never') : time_ago(row['updated_at'])
29
+ row['created_at'] = time_ago(row['created_at'])
21
30
  end
22
31
  end
32
+
33
+ def updated?(row)
34
+ row['created_at'] == row['updated_at']
35
+ end
23
36
  end
24
37
  end
@@ -4,13 +4,17 @@ module Kontena::Cli::Volumes
4
4
  include Kontena::Cli::Common
5
5
  include Kontena::Cli::GridOptions
6
6
 
7
-
8
7
  banner "Creates a volume"
9
8
  parameter 'NAME', 'Volume name'
10
9
 
11
- option '--driver', 'DRIVER', 'Volume driver to be used'
10
+ SCOPES = %w(grid stack instance)
11
+
12
+ option '--driver', 'DRIVER', 'Volume driver to be used', required: true
12
13
  option '--driver-opt', 'DRIVER_OPT', 'Volume driver options', multivalued: true
13
- option '--scope', 'SCOPE', 'Volume scope'
14
+ option '--scope', 'SCOPE', "Volume scope (#{SCOPES.join(',')})", required: true do |scope|
15
+ exit_with_error "Unknown scope '#{scope}, must be one of #{SCOPES.join(',')}" unless SCOPES.include?(scope)
16
+ scope
17
+ end
14
18
 
15
19
  requires_current_master
16
20
  requires_current_master_token
@@ -28,7 +32,7 @@ module Kontena::Cli::Volumes
28
32
  end
29
33
 
30
34
  def parse_driver_opts
31
- Hash[driver_opt_list.map{|opt| opt.split '='}]
35
+ driver_opt_list.map{|opt| opt.split '='}.to_h
32
36
  end
33
37
 
34
38
  def create_volume(volume)
@@ -1,21 +1,29 @@
1
1
 
2
2
  module Kontena::Cli::Volumes
3
3
  class ListCommand < Kontena::Command
4
+ include Kontena::Util
4
5
  include Kontena::Cli::Common
5
6
  include Kontena::Cli::GridOptions
7
+ include Kontena::Cli::TableGenerator::Helper
6
8
 
9
+ option ['--[no-]long', '-l'], :flag, "Show full dates", default: !$stdout.tty?
7
10
 
8
11
  requires_current_master
9
12
  requires_current_master_token
10
13
 
14
+ def volumes
15
+ client.get("volumes/#{current_grid}")['volumes']
16
+ end
17
+
18
+ def fields
19
+ quiet? ? ['id'] : %w(name scope driver created_at)
20
+ end
21
+
11
22
  def execute
12
- require 'tty-table'
13
-
14
- volumes = client.get("volumes/#{current_grid}")['volumes']
15
- table = TTY::Table.new ['NAME', 'SCOPE', 'DRIVER', 'CREATED AT'], volumes.map { |volume|
16
- [volume['name'], volume['scope'], volume['driver'], volume['created_at']]
17
- }
18
- puts table.render(:basic)
23
+ print_table(volumes) do |row|
24
+ next if long? || quiet?
25
+ row['created_at'] = time_ago(row['created_at'])
26
+ end
19
27
  end
20
28
 
21
29
  end
@@ -1,15 +1,3 @@
1
- require 'json'
2
- require 'excon'
3
- require 'uri'
4
- require 'base64'
5
- require 'socket'
6
- require 'openssl'
7
- require 'uri'
8
- require 'time'
9
- require 'kontena/errors'
10
- require 'kontena/cli/version'
11
- require 'kontena/cli/config'
12
-
13
1
  module Kontena
14
2
  class Client
15
3
 
@@ -40,13 +28,23 @@ module Kontena
40
28
  # @param [Kontena::Cli::Config::Token,Hash] access_token
41
29
  # @param [Hash] options
42
30
  def initialize(api_url, token = nil, options = {})
31
+ require 'json'
32
+ require 'excon'
33
+ require 'uri'
34
+ require 'base64'
35
+ require 'socket'
36
+ require 'openssl'
37
+ require 'uri'
38
+ require 'time'
39
+ require 'kontena/errors'
40
+ require 'kontena/cli/version'
41
+ require 'kontena/cli/config'
42
+
43
43
  @api_url, @token, @options = api_url, token, options
44
44
  uri = URI.parse(@api_url)
45
45
  @host = uri.host
46
46
 
47
- @logger = Logger.new(ENV["DEBUG"] ? $stderr : $stdout)
48
- @logger.level = ENV["DEBUG"].nil? ? Logger::INFO : Logger::DEBUG
49
- @logger.progname = 'CLIENT'
47
+ @logger = Kontena.logger
50
48
 
51
49
  @options[:default_headers] ||= {}
52
50
 
@@ -67,12 +65,12 @@ module Kontena
67
65
  excon_opts[:ssl_ca_file] = cert_file
68
66
  key = OpenSSL::X509::Certificate.new(File.read(cert_file))
69
67
  if key.issuer.to_s == "/C=FI/O=Test/OU=Test/CN=Test"
70
- logger.debug "Key looks like a self-signed cert made by Kontena CLI, setting verify_peer_host to 'Test'"
68
+ debug { "Key looks like a self-signed cert made by Kontena CLI, setting verify_peer_host to 'Test'" }
71
69
  excon_opts[:ssl_verify_peer_host] = 'Test'
72
70
  end
73
71
  end
74
72
 
75
- logger.debug "Excon opts: #{excon_opts.inspect}"
73
+ debug { "Excon opts: #{excon_opts.inspect}" }
76
74
 
77
75
  @http_client = Excon.new(api_url, excon_opts)
78
76
 
@@ -88,13 +86,20 @@ module Kontena
88
86
  else
89
87
  @token = token
90
88
  end
91
- @default_headers.merge!('Authorization' => "Bearer #{@token['access_token']}")
92
89
  end
93
90
 
94
91
  @api_url = api_url
95
92
  @path_prefix = options[:prefix] || '/v1/'
96
93
  end
97
94
 
95
+ def debug(&block)
96
+ logger.debug("CLIENT", &block)
97
+ end
98
+
99
+ def error(&block)
100
+ logger.error("CLIENT", &block)
101
+ end
102
+
98
103
  # Generates a header hash for HTTP basic authentication.
99
104
  # Defaults to using client_id and client_secret as user/pass
100
105
  #
@@ -133,11 +138,12 @@ module Kontena
133
138
  return false unless token_verify_path
134
139
 
135
140
  final_path = token_verify_path.gsub(/\:access\_token/, token['access_token'])
136
- logger.debug "Requesting user info from #{final_path}"
141
+ debug { "Requesting user info from #{final_path}" }
137
142
  request(path: final_path)
138
143
  true
139
144
  rescue => ex
140
- logger.debug "Authentication verification exception: #{ex.class.name} : #{ex.message}\n#{ex.backtrace.join("\n ")}"
145
+ error { "Authentication verification exception" }
146
+ error { ex }
141
147
  false
142
148
  end
143
149
 
@@ -170,7 +176,8 @@ module Kontena
170
176
  def server_version
171
177
  request(auth: false, expects: 200)['version']
172
178
  rescue => ex
173
- logger.debug "Server version exception: #{ex.class.name} : #{ex.message}\n#{ex.backtrace.join("\n ")}"
179
+ error { "Server version exception" }
180
+ error { ex }
174
181
  nil
175
182
  end
176
183
 
@@ -328,7 +335,7 @@ module Kontena
328
335
  parse_response(@last_response)
329
336
  rescue Excon::Errors::Unauthorized
330
337
  if token
331
- logger.debug 'Server reports access token expired'
338
+ debug { 'Server reports access token expired' }
332
339
 
333
340
  if retried || !token || !token['refresh_token']
334
341
  raise Kontena::Errors::StandardError.new(401, 'The access token has expired and needs to be refreshed')
@@ -339,7 +346,7 @@ module Kontena
339
346
  end
340
347
  raise Kontena::Errors::StandardError.new(401, 'Unauthorized')
341
348
  rescue Excon::Errors::HTTPStatusError => error
342
- logger.debug "Request #{error.request[:method].upcase} #{error.request[:path]}: #{error.response.status} #{error.response.reason_phrase}: #{error.response.body}"
349
+ debug { "Request #{error.request[:method].upcase} #{error.request[:path]}: #{error.response.status} #{error.response.reason_phrase}: #{error.response.body}" }
343
350
 
344
351
  handle_error_response(error.response)
345
352
  end
@@ -367,7 +374,8 @@ module Kontena
367
374
  {}
368
375
  end
369
376
  rescue => ex
370
- logger.debug "Access token refresh exception: #{ex.class.name} : #{ex.message}\n#{ex.backtrace.join("\n ")}"
377
+ error { "Access token refresh exception" }
378
+ error { ex }
371
379
  false
372
380
  end
373
381
 
@@ -378,7 +386,7 @@ module Kontena
378
386
  # @param [Boolean] use_basic_auth? When true, use basic auth authentication header
379
387
  # @return [Boolean] success?
380
388
  def refresh_token
381
- logger.debug "Performing token refresh"
389
+ debug { "Performing token refresh" }
382
390
  return false if token.nil?
383
391
  return false if token['refresh_token'].nil?
384
392
  uri = URI.parse(token_account['token_endpoint'])
@@ -386,7 +394,7 @@ module Kontena
386
394
  endpoint_data[:host] = uri.host if uri.host
387
395
  endpoint_data[:port] = uri.port if uri.port
388
396
 
389
- logger.debug "Token refresh endpoint: #{endpoint_data.inspect}"
397
+ debug { "Token refresh endpoint: #{endpoint_data.inspect}" }
390
398
 
391
399
  return false unless endpoint_data[:path]
392
400
 
@@ -405,18 +413,19 @@ module Kontena
405
413
  )
406
414
 
407
415
  if response && response['access_token']
408
- logger.debug "Got response to refresh request"
416
+ debug { "Got response to refresh request" }
409
417
  token['access_token'] = response['access_token']
410
418
  token['refresh_token'] = response['refresh_token']
411
419
  token['expires_at'] = in_to_at(response['expires_in'])
412
420
  token.config.write if token.respond_to?(:config)
413
421
  true
414
422
  else
415
- logger.debug "Got null or bad response to refresh request: #{last_response.inspect}"
423
+ debug { "Got null or bad response to refresh request: #{last_response.inspect}" }
416
424
  false
417
425
  end
418
426
  rescue => ex
419
- logger.debug "Access token refresh exception: #{ex.class.name} : #{ex.message}\n#{ex.backtrace.join("\n ")}"
427
+ error { "Access token refresh exception" }
428
+ error { ex }
420
429
  false
421
430
  end
422
431
 
@@ -507,7 +516,7 @@ module Kontena
507
516
  def parse_json(json)
508
517
  JSON.parse(json)
509
518
  rescue => ex
510
- logger.debug "JSON parse exception: #{ex.class.name} : #{ex.message}"
519
+ debug { "JSON parse exception: #{ex.class.name} : #{ex.message}" }
511
520
  nil
512
521
  end
513
522
 
@@ -528,14 +537,16 @@ module Kontena
528
537
  def handle_error_response(response)
529
538
  data = parse_response(response)
530
539
 
540
+ request_path = " (#{response.path})"
541
+
531
542
  if data.is_a?(Hash) && data.has_key?('error') && data['error'].is_a?(Hash)
532
543
  raise Kontena::Errors::StandardErrorHash.new(response.status, response.reason_phrase, data['error'])
533
544
  elsif data.is_a?(Hash) && data.has_key?('error')
534
- raise Kontena::Errors::StandardError.new(response.status, data['error'])
545
+ raise Kontena::Errors::StandardError.new(response.status, data['error'] + request_path)
535
546
  elsif data.is_a?(String) && !data.empty?
536
- raise Kontena::Errors::StandardError.new(response.status, data)
547
+ raise Kontena::Errors::StandardError.new(response.status, data + request_path)
537
548
  else
538
- raise Kontena::Errors::StandardError.new(response.status, response.reason_phrase)
549
+ raise Kontena::Errors::StandardError.new(response.status, response.reason_phrase + request_path)
539
550
  end
540
551
  end
541
552