diff options
Diffstat (limited to 'lib/chef/resource.rb')
-rw-r--r-- | lib/chef/resource.rb | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/lib/chef/resource.rb b/lib/chef/resource.rb index 6030572be6..e62e63a44a 100644 --- a/lib/chef/resource.rb +++ b/lib/chef/resource.rb @@ -32,6 +32,8 @@ require 'chef/node_map' require 'chef/node' require 'chef/platform' require 'chef/resource/resource_notification' +require 'chef/provider_resolver' +require 'chef/resource_resolver' require 'chef/mixin/deprecation' require 'chef/mixin/provides' @@ -684,6 +686,8 @@ class Chef # def provider(arg=nil) klass = if arg.kind_of?(String) || arg.kind_of?(Symbol) + # TODO deprecate. This does class munging. If you know + # the class name, just pass the class. lookup_provider_constant(arg) else arg @@ -1036,7 +1040,6 @@ class Chef end def provider_for_action(action) - require 'chef/provider_resolver' provider = Chef::ProviderResolver.new(node, self, action).resolve.new(self, run_context) provider.action = action provider @@ -1110,7 +1113,6 @@ class Chef # === Returns # <Chef::Resource>:: returns the proper Chef::Resource class def self.resource_for_node(short_name, node) - require 'chef/resource_resolver' klass = Chef::ResourceResolver.new(node, short_name).resolve raise Chef::Exceptions::NoSuchResourceType.new(short_name, node) if klass.nil? klass @@ -1143,43 +1145,42 @@ class Chef end end - def self.const_missing(class_name) - if deprecated_constants[class_name.to_sym] - Chef::Log.deprecation("Using an LWRP by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::Resource.resource_for_node(node, name) instead.") - deprecated_constants[class_name.to_sym] - else - raise NameError, "uninitialized constant Chef::Resource::#{class_name}" + # Implement deprecated LWRP class + module DeprecatedLWRPClass + # @api private + def register_deprecated_lwrp_class(resource_class, class_name) + if Chef::Resource.const_defined?(class_name, false) + Chef::Log.warn "#{class_name} already exists! Cannot create deprecation class for #{resource_class}" + else + deprecated_constants[class_name.to_sym] = resource_class + end end - end - # @api private - def self.create_deprecated_lwrp_class(resource_class) - # Create a class in Chef::Resource::MyResource with deprecation - # warnings if you try to access it - class_name = convert_to_class_name(resource_class.resource_name) - if Chef::Resource.const_defined?(class_name, false) - Chef::Log.warn "#{class_name} already exists! Cannot create deprecation class for #{resource_class}" - else - deprecated_constants[class_name.to_sym] = resource_class + def const_missing(class_name) + if deprecated_constants[class_name.to_sym] + Chef::Log.deprecation("Using an LWRP by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::Resource.resource_for_node(node, name) instead.") + deprecated_constants[class_name.to_sym] + else + raise NameError, "uninitialized constant Chef::Resource::#{class_name}" + end end - end - private + private - def self.deprecated_constants - @deprecated_constants ||= {} + def deprecated_constants + @deprecated_constants ||= {} + end end + extend DeprecatedLWRPClass - def lookup_provider_constant(name) - begin - self.class.provider_base.const_get(convert_to_class_name(name.to_s)) - rescue NameError => e - if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/ - raise ArgumentError, "No provider found to match '#{name}'" - else - raise e - end + def lookup_provider_constant(name, action=:nothing) + resource = Chef::Resource.new(self.name, self.run_context) + resource.instance_eval { @resource_name = name } + provider = Chef::ProviderResolver.new(self.node, resource, action).resolve + if !provider + raise ArgumentError, "No provider found to match '#{name}'" end + provider end end end |