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:", "      Your private key could not be loaded. If the key file exists, ensure that it is\n      readable by \#{ChefUtils::Dist::Infra::PRODUCT}.\n    E\n    error_description.section(\"Relevant Config Settings:\", <<~E)\n      client_key        \"\#{api_key}\"\n    E\n  when EOFError\n    describe_eof_error(error_description)\n  when *NETWORK_ERROR_CLASSES\n    describe_network_errors(error_description)\n  else\n    error_description.section(\"Unexpected Error:\", \"\#{exception.class.name}: \#{exception.message}\")\n  end\nend\n")

#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:", "    The \#{ChefUtils::Dist::Server::PRODUCT} returned a HTTP 404. This usually indicates that your chef_server_url is incorrect.\n  E\n  error_description.section(\"Relevant Config Settings:\", <<~E)\n    chef_server_url \"\#{server_url}\"\n  E\nend\n")

#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", "      Your client is not authorized to load the node data (HTTP 403).\n    E\n    error_description.section(\"Server Response:\", format_rest_error)\n\n    error_description.section(\"Possible Causes:\", <<~E)\n      * Your client (\#{username}) may have misconfigured authorization permissions.\n    E\n  when Net::HTTPBadRequest\n    describe_400_error(error_description)\n  when Net::HTTPNotFound\n    describe_404_error(error_description)\n  when Net::HTTPInternalServerError\n    describe_500_error(error_description)\n  when Net::HTTPBadGateway, Net::HTTPServiceUnavailable\n    describe_503_error(error_description)\n  when Net::HTTPNotAcceptable\n    describe_406_error(error_description, response)\n  else\n    describe_http_error(error_description)\n  end\nend\n")

#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