Class: Chef::Runner
- Inherits:
-
Object
- Object
- Chef::Runner
- Includes:
- Mixin::ParamsValidate
- Defined in:
- lib/chef/runner.rb
Overview
Chef::Runner
This class is responsible for executing the steps in a Chef run.
Instance Attribute Summary collapse
-
#delayed_actions ⇒ Object
readonly
Returns the value of attribute delayed_actions.
-
#run_context ⇒ Object
readonly
Returns the value of attribute run_context.
Instance Method Summary collapse
-
#converge ⇒ Object
Iterates over the
resource_collection
in therun_context
callingrun_action
for each resource in turn. - #events ⇒ Object
-
#initialize(run_context) ⇒ Runner
constructor
A new instance of Runner.
-
#run_action(resource, action, notification_type = nil, notifying_resource = nil) ⇒ Object
Determine the appropriate provider for the given resource, then execute it.
Methods included from Mixin::ParamsValidate
#lazy, #set_or_return, #validate
Constructor Details
#initialize(run_context) ⇒ Runner
Returns a new instance of Runner.
37 38 39 40 |
# File 'lib/chef/runner.rb', line 37 def initialize(run_context) @run_context = run_context @delayed_actions = [] end |
Instance Attribute Details
#delayed_actions ⇒ Object (readonly)
Returns the value of attribute delayed_actions.
33 34 35 |
# File 'lib/chef/runner.rb', line 33 def delayed_actions @delayed_actions end |
#run_context ⇒ Object (readonly)
Returns the value of attribute run_context.
31 32 33 |
# File 'lib/chef/runner.rb', line 31 def run_context @run_context end |
Instance Method Details
#converge ⇒ Object
Iterates over the resource_collection
in the run_context
calling run_action
for each resource in turn.
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/chef/runner.rb', line 97 def converge # Resolve all lazy/forward references in notifications run_context.resource_collection.each do |resource| resource.resolve_notification_references end # Execute each resource. run_context.resource_collection.execute_each_resource do |resource| Array(resource.action).each { |action| run_action(resource, action) } end rescue Exception => e Chef::Log.info "Running queued delayed notifications before re-raising exception" run_delayed_notifications(e) else run_delayed_notifications(nil) true end |
#events ⇒ Object
42 43 44 |
# File 'lib/chef/runner.rb', line 42 def events @run_context.events end |
#run_action(resource, action, notification_type = nil, notifying_resource = nil) ⇒ Object
Determine the appropriate provider for the given resource, then execute it.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 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/runner.rb', line 48 def run_action(resource, action, notification_type = nil, = nil) # If there are any before notifications, why-run the resource # and notify anyone who needs notifying # TODO cheffish has a bug where it passes itself instead of the run_context to us, so doesn't have before_notifications. Fix there, update dependency requirement, and remove this if statement. before_notifications = run_context.before_notifications(resource) if run_context.respond_to?(:before_notifications) if before_notifications && !before_notifications.empty? whyrun_before = Chef::Config[:why_run] begin Chef::Config[:why_run] = true Chef::Log.info("#{resource} running why-run #{action} action to support before action") resource.run_action(action, notification_type, ) ensure Chef::Config[:why_run] = whyrun_before end if resource.updated_by_last_action? before_notifications.each do |notification| Chef::Log.info("#{resource} sending #{notification.action} action to #{notification.resource} (before)") run_action(notification.resource, notification.action, :before, resource) end end end # Actually run the action for realsies resource.run_action(action, notification_type, ) # Execute any immediate and queue up any delayed notifications # associated with the resource, but only if it was updated *this time* # we ran an action on it. if resource.updated_by_last_action? run_context.immediate_notifications(resource).each do |notification| Chef::Log.info("#{resource} sending #{notification.action} action to #{notification.resource} (immediate)") run_action(notification.resource, notification.action, :immediate, resource) end run_context.delayed_notifications(resource).each do |notification| if delayed_actions.any? { |existing_notification| existing_notification.duplicates?(notification) } Chef::Log.info( "#{resource} not queuing delayed action #{notification.action} on #{notification.resource}"\ " (delayed), as it's already been queued") else delayed_actions << notification end end end end |