summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2017-03-20 12:38:22 -0700
committerLamont Granquist <lamont@scriptkiddie.org>2017-03-20 12:38:22 -0700
commit62f18e4d6db732e3d86991f08815c4e091a9dd27 (patch)
tree29e102efa1ed05f9b9527f92ccc4620546180fe8
parent02ec917f9356d999c44aceb7f1ff43957b0fe832 (diff)
downloadchef-62f18e4d6db732e3d86991f08815c4e091a9dd27.tar.gz
Revert "Chef-13: remove more deprecated provider_resolver code"
forgot to branch and need more coffee This reverts commit 02ec917f9356d999c44aceb7f1ff43957b0fe832.
-rw-r--r--lib/chef/provider_resolver.rb26
-rw-r--r--lib/chef/resource_resolver.rb21
-rw-r--r--spec/integration/recipes/recipe_dsl_spec.rb86
3 files changed, 132 insertions, 1 deletions
diff --git a/lib/chef/provider_resolver.rb b/lib/chef/provider_resolver.rb
index 465f88606b..439a7e9f5f 100644
--- a/lib/chef/provider_resolver.rb
+++ b/lib/chef/provider_resolver.rb
@@ -137,5 +137,31 @@ class Chef
def overrode_provides?(handler)
handler.method(:provides?).owner != Chef::Provider.method(:provides?).owner
end
+
+ module Deprecated
+ # return a deterministically sorted list of Chef::Provider subclasses
+ def providers
+ @providers ||= Chef::Provider.descendants
+ end
+
+ def enabled_handlers
+ @enabled_handlers ||= begin
+ handlers = super
+ if handlers.empty?
+ # Look through all providers, and find ones that return true to provides.
+ # Don't bother with ones that don't override provides?, since they
+ # would have been in enabled_handlers already if that were so. (It's a
+ # perf concern otherwise.)
+ handlers = providers.select { |handler| overrode_provides?(handler) && handler.provides?(node, resource) }
+ handlers.each do |handler|
+ message = "#{handler}.provides? returned true when asked if it provides DSL #{resource.resource_name}, but provides #{resource.resource_name.inspect} was never called! In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself."
+ Chef.deprecated(:custom_resource, message)
+ end
+ end
+ handlers
+ end
+ end
+ end
+ prepend Deprecated
end
end
diff --git a/lib/chef/resource_resolver.rb b/lib/chef/resource_resolver.rb
index 10b8c0f22e..fca6c6db81 100644
--- a/lib/chef/resource_resolver.rb
+++ b/lib/chef/resource_resolver.rb
@@ -1,6 +1,6 @@
#
# Author:: Lamont Granquist (<lamont@chef.io>)
-# Copyright:: Copyright 2015-2017, Chef Software Inc.
+# Copyright:: Copyright 2015-2016, Chef Software, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -161,5 +161,24 @@ class Chef
def overrode_provides?(handler)
handler.method(:provides?).owner != Chef::Resource.method(:provides?).owner
end
+
+ module Deprecated
+ # return a deterministically sorted list of Chef::Resource subclasses
+ def resources
+ Chef::Resource.sorted_descendants
+ end
+
+ def enabled_handlers
+ handlers = super
+ if handlers.empty?
+ handlers = resources.select { |handler| overrode_provides?(handler) && handler.provides?(node, resource_name) }
+ handlers.each do |handler|
+ Chef.deprecated(:custom_resource, "#{handler}.provides? returned true when asked if it provides DSL #{resource_name}, but provides #{resource_name.inspect} was never called! In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.")
+ end
+ end
+ handlers
+ end
+ end
+ prepend Deprecated
end
end
diff --git a/spec/integration/recipes/recipe_dsl_spec.rb b/spec/integration/recipes/recipe_dsl_spec.rb
index 84a4e455ea..27176f65d8 100644
--- a/spec/integration/recipes/recipe_dsl_spec.rb
+++ b/spec/integration/recipes/recipe_dsl_spec.rb
@@ -1190,6 +1190,17 @@ describe "Recipe DSL methods" do
end.to raise_error(Chef::Exceptions::NoSuchResourceType)
expect(resource_class.called_provides).to be_truthy
end
+
+ it "blarghle_blarghle_little_star 'foo' returns the resource and emits a warning" do
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
+ dsl_name = blarghle_blarghle_little_star
+ recipe = converge do
+ instance_eval("#{dsl_name} 'foo'")
+ end
+ expect(recipe.logged_warnings).to include "WARN: #{resource_class}.provides? returned true when asked if it provides DSL #{dsl_name}, but provides :#{dsl_name} was never called!"
+ expect(BaseThingy.created_resource).to eq resource_class
+ expect(resource_class.called_provides).to be_truthy
+ end
end
context "and a provider" do
@@ -1313,6 +1324,81 @@ describe "Recipe DSL methods" do
end
end
end
+
+ context "with provides? returning true" do
+ before do
+ temp_my_resource = my_resource
+ provider_class.define_singleton_method(:provides?) do |node, resource|
+ @called_provides = true
+ resource.declared_type == temp_my_resource
+ end
+ end
+
+ context "that provides :my_resource" do
+ before do
+ provider_class.provides my_resource
+ end
+
+ it "my_resource calls the provider (and calls provides?), but does not emit a warning" do
+ temp_my_resource = my_resource
+ recipe = converge do
+ instance_eval("#{temp_my_resource} 'foo'")
+ end
+ expect(recipe.logged_warnings).to eq ""
+ expect(BaseThingy.created_provider).to eq provider_class
+ expect(provider_class.called_provides).to be_truthy
+ end
+ end
+
+ context "that does not call provides :my_resource" do
+ it "my_resource calls the provider (and calls provides?), and emits a warning" do
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
+ temp_my_resource = my_resource
+ recipe = converge do
+ instance_eval("#{temp_my_resource} 'foo'")
+ end
+ expect(recipe.logged_warnings).to include("WARN: #{provider_class}.provides? returned true when asked if it provides DSL #{my_resource}, but provides :#{my_resource} was never called!")
+ expect(BaseThingy.created_provider).to eq provider_class
+ expect(provider_class.called_provides).to be_truthy
+ end
+ end
+ end
+
+ context "with provides? returning false to my_resource" do
+ before do
+ temp_my_resource = my_resource
+ provider_class.define_singleton_method(:provides?) do |node, resource|
+ @called_provides = true
+ false
+ end
+ end
+
+ context "that provides :my_resource" do
+ before do
+ provider_class.provides my_resource
+ end
+
+ it "my_resource fails to find a provider (and calls provides)" do
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
+ temp_my_resource = my_resource
+ expect_converge do
+ instance_eval("#{temp_my_resource} 'foo'")
+ end.to raise_error(Chef::Exceptions::ProviderNotFound)
+ expect(provider_class.called_provides).to be_truthy
+ end
+ end
+
+ context "that does not provide :my_resource" do
+ it "my_resource fails to find a provider (and calls provides)" do
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
+ temp_my_resource = my_resource
+ expect_converge do
+ instance_eval("#{temp_my_resource} 'foo'")
+ end.to raise_error(Chef::Exceptions::ProviderNotFound)
+ expect(provider_class.called_provides).to be_truthy
+ end
+ end
+ end
end
end
end