summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Keiser <john@johnkeiser.com>2015-05-07 09:53:35 -0700
committerJohn Keiser <john@johnkeiser.com>2015-05-13 13:43:15 -0700
commit27c57238f1f2fddc7d03dad818a6b7ee78cbff96 (patch)
treebba0c04ced9a410ad5363c74e3a8462ee27e3d8c
parent2032c6776587f9450ddba182867973ab5bee1b75 (diff)
downloadchef-27c57238f1f2fddc7d03dad818a6b7ee78cbff96.tar.gz
Deprecate dsl_name (the "DSL name for this class" is no longer meaningful).
-rw-r--r--lib/chef/mixin/provides.rb6
-rw-r--r--lib/chef/platform/provider_mapping.rb2
-rw-r--r--lib/chef/resource.rb3
-rw-r--r--lib/chef/resource/lwrp_base.rb192
-rw-r--r--lib/chef/resource_reporter.rb2
5 files changed, 106 insertions, 99 deletions
diff --git a/lib/chef/mixin/provides.rb b/lib/chef/mixin/provides.rb
index d71097ca4b..c39c53a190 100644
--- a/lib/chef/mixin/provides.rb
+++ b/lib/chef/mixin/provides.rb
@@ -29,6 +29,12 @@ class Chef
resource_name = resource_name.resource_name if resource_name.is_a?(Chef::Resource)
node_map.get(node, resource_name)
end
+
+ # Get the list of recipe DSL this resource is responsible for on the given
+ # node.
+ def provided_as(node)
+ node_map.list(node)
+ end
end
end
end
diff --git a/lib/chef/platform/provider_mapping.rb b/lib/chef/platform/provider_mapping.rb
index 763ae79368..8e9f46619f 100644
--- a/lib/chef/platform/provider_mapping.rb
+++ b/lib/chef/platform/provider_mapping.rb
@@ -467,7 +467,7 @@ class Chef
begin
class_name = resource_type.class.to_s.split('::').last
result = Chef::Provider.const_get(class_name)
- Chef::Log.warn("Class Chef::Provider::#{class_name} does not declare 'provides #{resource_type.class.dsl_name.to_sym.inspect}'.")
+ Chef::Log.warn("Class Chef::Provider::#{class_name} does not declare 'provides #{resource.resource_name.inspect}'.")
Chef::Log.warn("This will no longer work in Chef 13: you must use 'provides' to provide DSL.")
result
rescue NameError
diff --git a/lib/chef/resource.rb b/lib/chef/resource.rb
index d5a1876943..6030572be6 100644
--- a/lib/chef/resource.rb
+++ b/lib/chef/resource.rb
@@ -605,7 +605,7 @@ class Chef
return "suppressed sensitive resource output" if sensitive
ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
text = "# Declared in #{@source_line}\n\n"
- text << self.class.dsl_name + "(\"#{name}\") do\n"
+ text << "#{resource_name}(\"#{name}\") do\n"
ivars.each do |ivar|
if (value = instance_variable_get(ivar)) && !(value.respond_to?(:empty?) && value.empty?)
value_string = value.respond_to?(:to_text) ? value.to_text : value.inspect
@@ -821,6 +821,7 @@ class Chef
#
# @return [String] The DSL name of this resource.
def self.dsl_name
+ Chef::Log.deprecation "Resource.dsl_name is deprecated and will be removed in Chef 11. Use resource.resource_name instead."
if name
name = self.name.split('::')[-1]
convert_to_snake_case(name)
diff --git a/lib/chef/resource/lwrp_base.rb b/lib/chef/resource/lwrp_base.rb
index c07ff44187..89e4aa8b42 100644
--- a/lib/chef/resource/lwrp_base.rb
+++ b/lib/chef/resource/lwrp_base.rb
@@ -37,131 +37,132 @@ class Chef
NULL_ARG = Object.new
- extend Chef::Mixin::ConvertToClassName
- extend Chef::Mixin::FromFile
+ # Class methods
+ class <<self
- # Evaluates the LWRP resource file and instantiates a new Resource class.
- def self.build_from_file(cookbook_name, filename, run_context)
- resource_name = filename_to_qualified_string(cookbook_name, filename)
+ include Chef::Mixin::ConvertToClassName
+ include Chef::Mixin::FromFile
- node = run_context ? run_context.node : Chef::Node.new
- existing_class = Chef::ResourceResolver.new(node, resource_name).resolve
+ attr_accessor :loaded_lwrps
- if existing_class
- Chef::Log.info("Skipping LWRP resource #{filename} from cookbook #{cookbook_name}. #{existing_class} already defined.")
- Chef::Log.debug("Overriding resources with LWRPs is not supported anymore starting with Chef 12.")
- return existing_class
- end
+ def build_from_file(cookbook_name, filename, run_context)
+ if LWRPBase.loaded_lwrps[filename]
+ Chef::Log.info("LWRP provider #{filename} from cookbook #{cookbook_name} has already been loaded! Skipping the reload.")
+ return loaded_lwrps[filename]
+ end
- # We load the class first to give it a chance to set its own name
- resource_class = Class.new(self)
- resource_class.resource_name = resource_name
- resource_class.run_context = run_context
- resource_class.provides resource_name.to_sym
- resource_class.class_from_file(filename)
-
- # Respect resource_name set inside the LWRP
- resource_class.instance_eval do
- define_method(:to_s) do
- "LWRP #{resource_name} from cookbook #{cookbook_name}"
+ resource_name = filename_to_qualified_string(cookbook_name, filename)
+
+ # We load the class first to give it a chance to set its own name
+ resource_class = Class.new(self)
+ resource_class.resource_name = resource_name
+ resource_class.run_context = run_context
+ resource_class.provides resource_name.to_sym
+ resource_class.class_from_file(filename)
+
+ # Respect resource_name set inside the LWRP
+ resource_class.instance_eval do
+ define_method(:to_s) do
+ "LWRP #{resource_name} from cookbook #{cookbook_name}"
+ end
+ define_method(:inspect) { to_s }
end
- define_method(:inspect) { to_s }
- end
- Chef::Log.debug("Loaded contents of #{filename} into #{resource_class}")
+ Chef::Log.debug("Loaded contents of #{filename} into #{resource_class}")
- Chef::Resource.create_deprecated_lwrp_class(resource_class)
+ LWRPBase.loaded_lwrps[filename] = true
- resource_class
- end
+ Chef::Resource.create_deprecated_lwrp_class(resource_class)
- def self.resource_name(arg = NULL_ARG)
- if arg.equal?(NULL_ARG)
- @resource_name || dsl_name
- else
- @resource_name = arg
+ resource_class
+ end
+
+ def resource_name(arg = NULL_ARG)
+ if arg.equal?(NULL_ARG)
+ @resource_name
+ else
+ @resource_name = arg
+ end
end
- end
- class << self
alias_method :resource_name=, :resource_name
- end
- # Define an attribute on this resource, including optional validation
- # parameters.
- def self.attribute(attr_name, validation_opts={})
- define_method(attr_name) do |arg=nil|
- set_or_return(attr_name.to_sym, arg, validation_opts)
+ # Define an attribute on this resource, including optional validation
+ # parameters.
+ def attribute(attr_name, validation_opts={})
+ define_method(attr_name) do |arg=nil|
+ set_or_return(attr_name.to_sym, arg, validation_opts)
+ end
end
- end
- # Sets the default action
- def self.default_action(action_name=NULL_ARG)
- unless action_name.equal?(NULL_ARG)
- @actions ||= []
- if action_name.is_a?(Array)
- action = action_name.map { |arg| arg.to_sym }
- @actions = actions | action
- @default_action = action
- else
- action = action_name.to_sym
- @actions.push(action) unless @actions.include?(action)
- @default_action = action
+ # Sets the default action
+ def default_action(action_name=NULL_ARG)
+ unless action_name.equal?(NULL_ARG)
+ @actions ||= []
+ if action_name.is_a?(Array)
+ action = action_name.map { |arg| arg.to_sym }
+ @actions = actions | action
+ @default_action = action
+ else
+ action = action_name.to_sym
+ @actions.push(action) unless @actions.include?(action)
+ @default_action = action
+ end
end
- end
- @default_action ||= from_superclass(:default_action)
- end
+ @default_action ||= from_superclass(:default_action)
+ end
- # Adds +action_names+ to the list of valid actions for this resource.
- def self.actions(*action_names)
- if action_names.empty?
- defined?(@actions) ? @actions : from_superclass(:actions, []).dup
- else
- # BC-compat way for checking if actions have already been defined
- if defined?(@actions)
- @actions.push(*action_names)
+ # Adds +action_names+ to the list of valid actions for this resource.
+ def actions(*action_names)
+ if action_names.empty?
+ defined?(@actions) ? @actions : from_superclass(:actions, []).dup
else
- @actions = action_names
+ # BC-compat way for checking if actions have already been defined
+ if defined?(@actions)
+ @actions.push(*action_names)
+ else
+ @actions = action_names
+ end
end
end
- end
- # @deprecated
- def self.valid_actions(*args)
- Chef::Log.warn("`valid_actions' is deprecated, please use actions `instead'!")
- actions(*args)
- end
+ # @deprecated
+ def valid_actions(*args)
+ Chef::Log.warn("`valid_actions' is deprecated, please use actions `instead'!")
+ actions(*args)
+ end
- # Set the run context on the class. Used to provide access to the node
- # during class definition.
- def self.run_context=(run_context)
- @run_context = run_context
- end
+ # Set the run context on the class. Used to provide access to the node
+ # during class definition.
+ attr_accessor :run_context
- def self.run_context
- @run_context
- end
+ def node
+ run_context ? run_context.node : nil
+ end
- def self.node
- run_context ? run_context.node : nil
- end
+ def lazy(&block)
+ DelayedEvaluator.new(&block)
+ end
- def self.lazy(&block)
- DelayedEvaluator.new(&block)
- end
+ private
- private
+ # Get the value from the superclass, if it responds, otherwise return
+ # +nil+. Since class instance variables are **not** inherited upon
+ # subclassing, this is a required check to ensure Chef pulls the
+ # +default_action+ and other DSL-y methods when extending LWRP::Base.
+ def from_superclass(m, default = nil)
+ return default if superclass == Chef::Resource::LWRPBase
+ superclass.respond_to?(m) ? superclass.send(m) : default
+ end
- # Get the value from the superclass, if it responds, otherwise return
- # +nil+. Since class instance variables are **not** inherited upon
- # subclassing, this is a required check to ensure Chef pulls the
- # +default_action+ and other DSL-y methods when extending LWRP::Base.
- def self.from_superclass(m, default = nil)
- return default if superclass == Chef::Resource::LWRPBase
- superclass.respond_to?(m) ? superclass.send(m) : default
+ def loaded_lwrps
+ @loaded_lwrps ||= {}
+ end
end
+ private
+
# Default initializer. Sets the default action and allowed actions.
def initialize(name, run_context=nil)
super(name, run_context)
@@ -176,7 +177,6 @@ class Chef
@action = self.class.default_action
allowed_actions.push(self.class.actions).flatten!
end
-
end
end
end
diff --git a/lib/chef/resource_reporter.rb b/lib/chef/resource_reporter.rb
index 96cc01d814..7829bb4d70 100644
--- a/lib/chef/resource_reporter.rb
+++ b/lib/chef/resource_reporter.rb
@@ -59,7 +59,7 @@ class Chef
# attrs.
def for_json
as_hash = {}
- as_hash["type"] = new_resource.class.dsl_name
+ as_hash["type"] = new_resource.resource_name.to_sym
as_hash["name"] = new_resource.name.to_s
as_hash["id"] = new_resource.identity.to_s
as_hash["after"] = new_resource.state_for_resource_reporter