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

Returns a new instance of NodeLoadErrorInspector.



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

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.



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

def config
  @config
end

#exceptionObject (readonly)

Returns the value of attribute exception.



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

def exception
  @exception
end

#node_nameObject (readonly)

Returns the value of attribute node_name.



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

def node_name
  @node_name
end

Instance Method Details

#add_explanation(error_description) ⇒ Object



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

def add_explanation(error_description)
  case exception
  when Net::HTTPClientException, 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 #{ChefUtils::Dist::Infra::PRODUCT}.
    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



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

def api_key
  config[:client_key]
end

#clock_skew?Boolean

Returns:

  • (Boolean)


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

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.



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

def describe_404_error(error_description)
  error_description.section("Resource Not Found:", <<~E)
    The #{ChefUtils::Dist::Server::PRODUCT} 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



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
94
# File 'lib/chef/formatters/error_inspectors/node_load_error_inspector.rb', line 63

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



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

def server_url
  config[:chef_server_url]
end

#usernameObject



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

def username
  config[:node_name]
end