Class: Chef::Formatters::ErrorInspectors::RunListExpansionErrorInspector

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

Constant Summary

Constants included from APIErrorFormatting

APIErrorFormatting::NETWORK_ERROR_CLASSES

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from APIErrorFormatting

#api_key, #clock_skew?, #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, #server_url, #username

Constructor Details

#initialize(node, exception) ⇒ RunListExpansionErrorInspector

Returns a new instance of RunListExpansionErrorInspector.



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

def initialize(node, exception)
  @node, @exception = node, exception
end

Instance Attribute Details

#exceptionObject (readonly)

Returns the value of attribute exception.



30
31
32
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 30

def exception
  @exception
end

#nodeObject (readonly)

Returns the value of attribute node.



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

def node
  @node
end

Instance Method Details

#add_explanation(error_description) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 37

def add_explanation(error_description)
  case exception
  when Errno::ECONNREFUSED, Timeout::Error, Errno::ETIMEDOUT, SocketError
    error_description.section("Networking Error:", <<~E)
      #{exception.message}

      Your chef_server_url may be misconfigured, or the network could be down.
    E
  when Net::HTTPClientException, Net::HTTPFatalError
    humanize_http_exception(error_description)
  when Chef::Exceptions::MissingRole
    describe_missing_role(error_description)
  when EOFError
    describe_eof_error(error_description)
  else
    error_description.section("Unexpected Error:", "#{exception.class.name}: #{exception.message}")
  end
end

#configObject



72
73
74
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 72

def config
  Chef::Config
end

#describe_missing_role(error_description) ⇒ Object



56
57
58
59
60
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 56

def describe_missing_role(error_description)
  error_description.section("Missing Role(s) in Run List:", missing_roles_explained)
  original_run_list = node.run_list.map { |item| "* #{item}" }.join("\n")
  error_description.section("Original Run List", original_run_list)
end

#humanize_http_exception(error_description) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 76

def humanize_http_exception(error_description)
  response = exception.response
  case response
  when Net::HTTPUnauthorized
    error_description.section("Authentication Error:", <<~E)
      Failed to authenticate to the #{ChefUtils::Dist::Server::PRODUCT} (http 401).
    E

    error_description.section("Server Response:", format_rest_error)
    error_description.section("Relevant Config Settings:", <<~E)
      chef_server_url   "#{server_url}"
      node_name         "#{username}"
      client_key        "#{api_key}"

      If these settings are correct, your client_key may be invalid.
    E
  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 one or more of your roles (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::HTTPNotAcceptable
    describe_406_error(error_description, response)
  when Net::HTTPInternalServerError
    error_description.section("Unknown Server Error:", <<~E)
      The server had a fatal error attempting to load a role.
    E
    error_description.section("Server Response:", format_rest_error)
  when Net::HTTPBadGateway, Net::HTTPServiceUnavailable
    error_description.section("Server Unavailable", "The #{ChefUtils::Dist::Server::PRODUCT} is temporarily unavailable")
    error_description.section("Server Response:", format_rest_error)
  else
    error_description.section("Unexpected API Request Failure:", format_rest_error)
  end
end

#missing_roles_explainedObject



62
63
64
65
66
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 62

def missing_roles_explained
  run_list_expansion.missing_roles_with_including_role.map do |role, includer|
    "* #{role} included by '#{includer}'"
  end.join("\n")
end

#run_list_expansionObject



68
69
70
# File 'lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb', line 68

def run_list_expansion
  exception.expansion
end