# # Author:: Adam Jacob () # Author:: Christopher Walters () # Author:: Daniel DeLeo () # Copyright:: Copyright (c) Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # require_relative "../resource" require_relative "../resource_resolver" require_relative "../node" require_relative "../log" require_relative "../exceptions" require_relative "../mixin/convert_to_class_name" require_relative "../mixin/from_file" require_relative "../mixin/params_validate" # for DelayedEvaluator class Chef class Resource # == Chef::Resource::LWRPBase # Base class for LWRP resources. Adds DSL sugar on top of Chef::Resource, # so attributes, default action, etc. can be defined with pleasing syntax. class LWRPBase < Resource # Class methods class <) resource_class.instance_eval do define_singleton_method(:to_s) do "Custom resource #{resource_name} from cookbook #{cookbook_name}" end define_singleton_method(:inspect) { to_s } end Chef::Log.trace("Loaded contents of #{filename} into resource #{resource_name} (#{resource_class})") LWRPBase.loaded_lwrps[filename] = true # wire up the default resource name after the class is parsed only if we haven't declared one. # (this ordering is important for MapCollision deprecation warnings) resource_class.provides resource_name.to_sym unless Chef::ResourceResolver.includes_handler?(resource_name.to_sym, self) resource_class end alias :attribute :property # Adds +action_names+ to the list of valid actions for this resource. # Does not include superclass's action list when appending. def actions(*action_names) action_names = action_names.flatten if !action_names.empty? && !@allowed_actions self.allowed_actions = ([ :nothing ] + action_names).uniq else allowed_actions(*action_names) end end alias :actions= :allowed_actions= # @deprecated def valid_actions(*args) Chef::Log.warn("`valid_actions' is deprecated, please use allowed_actions `instead'!") allowed_actions(*args) end # Set the run context on the class. Used to provide access to the node # during class definition. attr_accessor :run_context def node run_context ? run_context.node : nil end protected attr_writer :loaded_lwrps def loaded_lwrps @loaded_lwrps ||= {} end 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 end end end end