Class: Chef::Handler
- Inherits:
-
Object
- Object
- Chef::Handler
- Extended by:
- Forwardable
- Defined in:
- lib/chef/handler.rb,
lib/chef/handler/json_file.rb
Overview
Chef::Handler
The base class for an Exception or Notification Handler. Create your own handler by subclassing Chef::Handler. When a Chef run fails with an uncaught Exception, Chef will set the run_status
on your handler and call report
Example:
require 'net/smtp'
module MyOrg
class OhNoes < Chef::Handler
def report
# Create the email message
= "From: Your Name <[email protected]>\n"
<< "To: Destination Address <[email protected]>\n"
<< "Subject: Chef Run Failure\n"
<< "Date: #{Time.now.rfc2822}\n\n"
# The Node is available as +node+
<< "Chef run failed on #{node.name}\n"
# +run_status+ is a value object with all of the run status data
<< "#{run_status.formatted_exception}\n"
# Join the backtrace lines. Coerce to an array just in case.
<< Array(backtrace).join("\n")
# Send the email
Net::SMTP.start('your.smtp.server', 25) do |smtp|
smtp. , 'from@address', 'to@address'
end
end
end
end
Direct Known Subclasses
Defined Under Namespace
Classes: JsonFile
Instance Attribute Summary collapse
-
#run_status ⇒ Object
readonly
The Chef::RunStatus object containing data about the Chef run.
Class Method Summary collapse
-
.exception_handlers ⇒ Object
The list of currently configured exception handlers.
-
.report_handlers ⇒ Object
The list of currently configured report handlers.
-
.run_exception_handlers(run_status) ⇒ Object
Run the exception handlers.
-
.run_report_handlers(run_status) ⇒ Object
Run the report handlers.
Instance Method Summary collapse
-
#data ⇒ Object
Return the Hash representation of the run_status.
-
#report ⇒ Object
The main entry point for report handling.
-
#run_report_safely(run_status) ⇒ Object
Runs the report handler, rescuing and logging any errors it may cause.
-
#run_report_unsafe(run_status) ⇒ Object
Runs the report handler without any error handling.
Instance Attribute Details
#run_status ⇒ Object (readonly)
The Chef::RunStatus object containing data about the Chef run.
104 105 106 |
# File 'lib/chef/handler.rb', line 104 def run_status @run_status end |
Class Method Details
.exception_handlers ⇒ Object
The list of currently configured exception handlers
82 83 84 |
# File 'lib/chef/handler.rb', line 82 def self.exception_handlers Array(Chef::Config[:exception_handlers]) end |
.report_handlers ⇒ Object
The list of currently configured report handlers
61 62 63 |
# File 'lib/chef/handler.rb', line 61 def self.report_handlers Array(Chef::Config[:report_handlers]) end |
.run_exception_handlers(run_status) ⇒ Object
Run the exception handlers. Usually will be called by a notification from Chef::Client when the run fails.
88 89 90 91 92 93 94 |
# File 'lib/chef/handler.rb', line 88 def self.run_exception_handlers(run_status) Chef::Log.error("Running exception handlers") exception_handlers.each do |handler| handler.run_report_safely(run_status) end Chef::Log.error("Exception handlers complete") end |
.run_report_handlers(run_status) ⇒ Object
Run the report handlers. This will usually be called by a notification from Chef::Client
67 68 69 70 71 72 73 |
# File 'lib/chef/handler.rb', line 67 def self.run_report_handlers(run_status) Chef::Log.info("Running report handlers") report_handlers.each do |handler| handler.run_report_safely(run_status) end Chef::Log.info("Report handlers complete") end |
Instance Method Details
#data ⇒ Object
Return the Hash representation of the run_status
201 202 203 |
# File 'lib/chef/handler.rb', line 201 def data @run_status.to_hash end |
#report ⇒ Object
The main entry point for report handling. Subclasses should override this method with their own report handling logic.
177 178 |
# File 'lib/chef/handler.rb', line 177 def report end |
#run_report_safely(run_status) ⇒ Object
Runs the report handler, rescuing and logging any errors it may cause. This ensures that all handlers get a chance to run even if one fails. This method should not be overridden by subclasses unless you know what you’re doing.
184 185 186 187 188 189 190 191 |
# File 'lib/chef/handler.rb', line 184 def run_report_safely(run_status) run_report_unsafe(run_status) rescue Exception => e Chef::Log.error("Report handler #{self.class.name} raised #{e.inspect}") Array(e.backtrace).each { |line| Chef::Log.error(line) } ensure @run_status = nil end |
#run_report_unsafe(run_status) ⇒ Object
Runs the report handler without any error handling. This method should not be used directly except in testing.
195 196 197 198 |
# File 'lib/chef/handler.rb', line 195 def run_report_unsafe(run_status) @run_status = run_status report end |