Class: Chef::Formatters::ErrorInspectors::NodeLoadErrorInspector

Inherits:
Object
  • Object
show all
Includes:
APIErrorFormatting
Defined in:
lib/chef/formatters/error_inspectors/node_load_error_inspector.rb

Overview

== APIErrorInspector Wraps exceptions caused by API calls to the server.

Constant Summary

Constants included from APIErrorFormatting

APIErrorFormatting::NETWORK_ERROR_CLASSES

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from APIErrorFormatting

#describe_400_error, #describe_401_error, #describe_406_error, #describe_500_error, #describe_503_error, #describe_eof_error, #describe_http_error, #describe_network_errors, #format_rest_error, #safe_format_rest_error

Constructor Details

#initialize(node_name, exception, config) ⇒ NodeLoadErrorInspector


35
36
37
38
39
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 35

def initialize(node_name, exception, config)
  @node_name = node_name
  @exception = exception
  @config = config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config


33
34
35
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 33

def config
  @config
end

#exceptionObject (readonly)

Returns the value of attribute exception


31
32
33
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 31

def exception
  @exception
end

#node_nameObject (readonly)

Returns the value of attribute node_name


32
33
34
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 32

def node_name
  @node_name
end

Instance Method Details

#add_explanation(error_description) ⇒ Object


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 41

def add_explanation(error_description)
  case exception
  when Net::HTTPServerException, Net::HTTPFatalError
    humanize_http_exception(error_description)
  when Chef::Exceptions::PrivateKeyMissing
    error_description.section("Private Key Not Found:", <<-E)
Your private key could not be loaded. If the key file exists, ensure that it is
readable by chef-client.
E
    error_description.section("Relevant Config Settings:", <<-E)
client_key        "#{api_key}"
E
  when EOFError
    describe_eof_error(error_description)
  when *NETWORK_ERROR_CLASSES
    describe_network_errors(error_description)
  else
    error_description.section("Unexpected Error:", "#{exception.class.name}: #{exception.message}")
  end
end

#api_keyObject


112
113
114
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 112

def api_key
  config[:client_key]
end

#clock_skew?Boolean


120
121
122
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 120

def clock_skew?
  exception.response.body =~ /synchronize the clock/i
end

#describe_404_error(error_description) ⇒ Object

Custom 404 error messaging. Users sometimes see 404s when they have misconfigured server URLs, and the wrong one redirects to the new one, e.g., PUT http://wrong.url/nodes/node-name becomes a GET after a redirect.


99
100
101
102
103
104
105
106
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 99

def describe_404_error(error_description)
  error_description.section("Resource Not Found:", <<-E)
The server returned a HTTP 404. This usually indicates that your chef_server_url is incorrect.
E
  error_description.section("Relevant Config Settings:", <<-E)
chef_server_url "#{server_url}"
E
end

#humanize_http_exception(error_description) ⇒ Object


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 62

def humanize_http_exception(error_description)
  response = exception.response
  case response
  when Net::HTTPUnauthorized
    # TODO: this is where you'd see conflicts b/c of username/clientname stuff
    describe_401_error(error_description)
  when Net::HTTPForbidden
    # TODO: we're rescuing errors from Node.find_or_create
    # * could be no write on nodes container
    # * could be no read on the node
    error_description.section("Authorization Error", <<-E)
Your client is not authorized to load the node data (HTTP 403).
E
    error_description.section("Server Response:", format_rest_error)

    error_description.section("Possible Causes:", <<-E)
* Your client (#{username}) may have misconfigured authorization permissions.
E
  when Net::HTTPBadRequest
    describe_400_error(error_description)
  when Net::HTTPNotFound
    describe_404_error(error_description)
  when Net::HTTPInternalServerError
    describe_500_error(error_description)
  when Net::HTTPBadGateway, Net::HTTPServiceUnavailable
    describe_503_error(error_description)
  when Net::HTTPNotAcceptable
    describe_406_error(error_description, response)
  else
    describe_http_error(error_description)
  end
end

#server_urlObject


116
117
118
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 116

def server_url
  config[:chef_server_url]
end

#usernameObject


108
109
110
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 108

def username
  config[:node_name]
end