diff options
author | Noah Kantrowitz <noah@coderanger.net> | 2017-04-04 19:06:47 -0700 |
---|---|---|
committer | Noah Kantrowitz <noah@coderanger.net> | 2017-04-04 19:06:47 -0700 |
commit | 475083d1915503d25811b50154f8fc417ae5866b (patch) | |
tree | 08c8df65c91d483d18b6db8b8a82a0efded9ed75 | |
parent | 1148f3319ca93e99e209443fc2823d09a6fb695c (diff) | |
download | chef-475083d1915503d25811b50154f8fc417ae5866b.tar.gz |
Make use_inline_resources always active.
Signed-off-by: Noah Kantrowitz <noah@coderanger.net>
-rw-r--r-- | lib/chef/provider.rb | 112 |
1 files changed, 34 insertions, 78 deletions
diff --git a/lib/chef/provider.rb b/lib/chef/provider.rb index ce2f431fec..a9263e77ca 100644 --- a/lib/chef/provider.rb +++ b/lib/chef/provider.rb @@ -51,6 +51,24 @@ class Chef true end + # Defines an action method on the provider, running the block to compile the + # resources, converging them, and then checking if any were updated (and + # updating new-resource if so) + # + # @since 13.0 + # @param name [String, Symbol] Name of the action to define. + # @param block [Proc] Body of the action. + # @return [void] + def self.action(name, &block) + # We need the block directly in a method so that `super` works. + define_method("compile_action_#{name}", &block) + class_eval <<-EOM + def action_#{name} + compile_and_converge_action { compile_action_#{name} } + end + EOM + end + #-- # TODO: this should be a reader, and the action should be passed in the # constructor; however, many/most subclasses override the constructor so @@ -176,6 +194,22 @@ class Chef converge_actions.add_action(descriptions, &block) end + # Create a child run_context, compile the block, and converge it. + # + # @api private + def compile_and_converge_action(&block) + old_run_context = run_context + @run_context = run_context.create_child + return_value = instance_eval(&block) + Chef::Runner.new(run_context).converge + return_value + ensure + if run_context.resource_collection.any? { |r| r.updated? } + new_resource.updated_by_last_action(true) + end + @run_context = old_run_context + end + # # Handle patchy convergence safely. # @@ -326,84 +360,6 @@ class Chef end end - # Enables inline evaluation of resources in provider actions. - # - # Without this option, any resources declared inside the Provider are added - # to the resource collection after the current position at the time the - # action is executed. Because they are added to the primary resource - # collection for the chef run, they can notify other resources outside - # the Provider, and potentially be notified by resources outside the Provider - # (but this is complicated by the fact that they don't exist until the - # provider executes). In this mode, it is impossible to correctly set the - # updated_by_last_action flag on the parent Provider resource, since it - # executes and returns before its component resources are run. - # - # With this option enabled, each action creates a temporary run_context - # with its own resource collection, evaluates the action's code in that - # context, and then converges the resources created. If any resources - # were updated, then this provider's new_resource will be marked updated. - # - # In this mode, resources created within the Provider cannot interact with - # external resources via notifies, though notifications to other - # resources within the Provider will work. Delayed notifications are executed - # at the conclusion of the provider's action, *not* at the end of the - # main chef run. - # - # This mode of evaluation is experimental, but is believed to be a better - # set of tradeoffs than the append-after mode, so it will likely become - # the default in a future major release of Chef. - # - def self.use_inline_resources - extend InlineResources::ClassMethods - include InlineResources - end - - # Chef::Provider::InlineResources - # Implementation of inline resource convergence for providers. See - # Provider.use_inline_resources for a longer explanation. - # - # This code is restricted to a module so that it can be selectively - # applied to providers on an opt-in basis. - # - # @api private - module InlineResources - - # Create a child run_context, compile the block, and converge it. - # - # @api private - def compile_and_converge_action(&block) - old_run_context = run_context - @run_context = run_context.create_child - return_value = instance_eval(&block) - Chef::Runner.new(run_context).converge - return_value - ensure - if run_context.resource_collection.any? { |r| r.updated? } - new_resource.updated_by_last_action(true) - end - @run_context = old_run_context - end - - # Class methods for InlineResources. Overrides the `action` DSL method - # with one that enables inline resource convergence. - # - # @api private - module ClassMethods - # Defines an action method on the provider, running the block to - # compile the resources, converging them, and then checking if any - # were updated (and updating new-resource if so) - def action(name, &block) - # We need the block directly in a method so that `super` works - define_method("compile_action_#{name}", &block) - class_eval <<-EOM - def action_#{name} - compile_and_converge_action { compile_action_#{name} } - end - EOM - end - end - end - protected def converge_actions |