diff options
-rw-r--r-- | lib/chef/dsl/declare_resource.rb | 10 | ||||
-rw-r--r-- | spec/unit/dsl/declare_resource_spec.rb | 30 |
2 files changed, 39 insertions, 1 deletions
diff --git a/lib/chef/dsl/declare_resource.rb b/lib/chef/dsl/declare_resource.rb index 8d76ddfb31..86227a0f9d 100644 --- a/lib/chef/dsl/declare_resource.rb +++ b/lib/chef/dsl/declare_resource.rb @@ -71,7 +71,15 @@ class Chef # delete_resource!(:template, '/x/y.txy') # def delete_resource!(type, name, run_context: self.run_context) - run_context.resource_collection.delete("#{type}[#{name}]") + run_context.resource_collection.delete("#{type}[#{name}]").tap do |resource| + # Purge any pending notifications too. This will not raise an exception + # if there are no notifications. + if resource + run_context.before_notification_collection.delete(resource.declared_key) + run_context.immediate_notification_collection.delete(resource.declared_key) + run_context.delayed_notification_collection.delete(resource.declared_key) + end + end end # Lookup a resource in the resource collection by name and delete it. Returns diff --git a/spec/unit/dsl/declare_resource_spec.rb b/spec/unit/dsl/declare_resource_spec.rb index 6dd9317c21..692e57d2e1 100644 --- a/spec/unit/dsl/declare_resource_spec.rb +++ b/spec/unit/dsl/declare_resource_spec.rb @@ -235,6 +235,36 @@ describe Chef::ResourceCollection do ).to eql(resource) expect(run_context.resource_collection.all_resources.size).to eql(0) end + + it "removes pending delayed notifications" do + recipe.declare_resource(:zen_master, "one") + recipe.declare_resource(:zen_master, "two") do + notifies :win, "zen_master[one]" + end + recipe.delete_resource(:zen_master, "two") + resource = recipe.declare_resource(:zen_master, "two") + expect(resource.delayed_notifications).to eql([]) + end + + it "removes pending immediate notifications" do + recipe.declare_resource(:zen_master, "one") + recipe.declare_resource(:zen_master, "two") do + notifies :win, "zen_master[one]", :immediate + end + recipe.delete_resource(:zen_master, "two") + resource = recipe.declare_resource(:zen_master, "two") + expect(resource.immediate_notifications).to eql([]) + end + + it "removes pending before notifications" do + recipe.declare_resource(:zen_master, "one") + recipe.declare_resource(:zen_master, "two") do + notifies :win, "zen_master[one]", :before + end + recipe.delete_resource(:zen_master, "two") + resource = recipe.declare_resource(:zen_master, "two") + expect(resource.before_notifications).to eql([]) + end end describe "run_context helpers" do |