summaryrefslogtreecommitdiff
path: root/lib/chef/dsl/recipe.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/dsl/recipe.rb')
-rw-r--r--lib/chef/dsl/recipe.rb197
1 files changed, 75 insertions, 122 deletions
diff --git a/lib/chef/dsl/recipe.rb b/lib/chef/dsl/recipe.rb
index c22f053292..5e39919158 100644
--- a/lib/chef/dsl/recipe.rb
+++ b/lib/chef/dsl/recipe.rb
@@ -1,7 +1,7 @@
#--
# Author:: Adam Jacob (<adam@opscode.com>)
# Author:: Christopher Walters (<cw@opscode.com>)
-# Copyright:: Copyright (c) 2008, 2009 Opscode, Inc.
+# Copyright:: Copyright (c) 2008, 2009-2015 Chef Software, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,10 +17,12 @@
# limitations under the License.
#
-require 'chef/mixin/convert_to_class_name'
-require 'chef/exceptions'
-require 'chef/resource_builder'
-require 'chef/mixin/shell_out'
+require "chef/exceptions"
+require "chef/mixin/shell_out"
+require "chef/mixin/powershell_out"
+require "chef/dsl/resources"
+require "chef/dsl/definitions"
+require "chef/dsl/declare_resource"
class Chef
module DSL
@@ -31,118 +33,11 @@ class Chef
module Recipe
include Chef::Mixin::ShellOut
- include Chef::Mixin::ConvertToClassName
+ include Chef::Mixin::PowershellOut
- def method_missing(method_symbol, *args, &block)
- # If we have a definition that matches, we want to use that instead. This should
- # let you do some really crazy over-riding of "native" types, if you really want
- # to.
- if has_resource_definition?(method_symbol)
- evaluate_resource_definition(method_symbol, *args, &block)
- elsif have_resource_class_for?(method_symbol)
- # Otherwise, we're rocking the regular resource call route.
- declare_resource(method_symbol, args[0], caller[0], &block)
- else
- begin
- super
- rescue NoMethodError
- raise NoMethodError, "No resource or method named `#{method_symbol}' for #{describe_self_for_error}"
- rescue NameError
- raise NameError, "No resource, method, or local variable named `#{method_symbol}' for #{describe_self_for_error}"
- end
- end
- end
-
- def has_resource_definition?(name)
- run_context.definitions.has_key?(name)
- end
-
- # Processes the arguments and block as a resource definition.
- def evaluate_resource_definition(definition_name, *args, &block)
-
- # This dupes the high level object, but we still need to dup the params
- new_def = run_context.definitions[definition_name].dup
-
- new_def.params = new_def.params.dup
- new_def.node = run_context.node
- # This sets up the parameter overrides
- new_def.instance_eval(&block) if block
-
- new_recipe = Chef::Recipe.new(cookbook_name, recipe_name, run_context)
- new_recipe.params = new_def.params
- new_recipe.params[:name] = args[0]
- new_recipe.instance_eval(&new_def.recipe)
- end
-
- #
- # Instantiates a resource (via #build_resource), then adds it to the
- # resource collection. Note that resource classes are looked up directly,
- # so this will create the resource you intended even if the method name
- # corresponding to that resource has been overridden.
- #
- # @param type [Symbol] The type of resource (e.g. `:file` or `:package`)
- # @param name [String] The name of the resource (e.g. '/x/y.txt' or 'apache2')
- # @param created_at [String] The caller of the resource. Use `caller[0]`
- # to get the caller of your function. Defaults to the caller of this
- # function.
- # @param resource_attrs_block A block that lets you set attributes of the
- # resource (it is instance_eval'd on the resource instance).
- #
- # @return [Chef::Resource] The new resource.
- #
- # @example
- # declare_resource(:file, '/x/y.txy', caller[0]) do
- # action :delete
- # end
- # # Equivalent to
- # file '/x/y.txt' do
- # action :delete
- # end
- #
- def declare_resource(type, name, created_at=nil, &resource_attrs_block)
- created_at ||= caller[0]
-
- resource = build_resource(type, name, created_at, &resource_attrs_block)
-
- run_context.resource_collection.insert(resource, resource_type: type, instance_name: name)
- resource
- end
-
- #
- # Instantiate a resource of the given +type+ with the given +name+ and
- # attributes as given in the +resource_attrs_block+.
- #
- # The resource is NOT added to the resource collection.
- #
- # @param type [Symbol] The type of resource (e.g. `:file` or `:package`)
- # @param name [String] The name of the resource (e.g. '/x/y.txt' or 'apache2')
- # @param created_at [String] The caller of the resource. Use `caller[0]`
- # to get the caller of your function. Defaults to the caller of this
- # function.
- # @param resource_attrs_block A block that lets you set attributes of the
- # resource (it is instance_eval'd on the resource instance).
- #
- # @return [Chef::Resource] The new resource.
- #
- # @example
- # build_resource(:file, '/x/y.txy', caller[0]) do
- # action :delete
- # end
- #
- def build_resource(type, name, created_at=nil, &resource_attrs_block)
- created_at ||= caller[0]
-
- Chef::ResourceBuilder.new(
- type: type,
- name: name,
- created_at: created_at,
- params: @params,
- run_context: run_context,
- cookbook_name: cookbook_name,
- recipe_name: recipe_name,
- enclosing_provider: self.is_a?(Chef::Provider) ? self : nil
- ).build(&resource_attrs_block)
- end
+ include Chef::DSL::Resources
+ include Chef::DSL::Definitions
+ include Chef::DSL::DeclareResource
def resource_class_for(snake_case_name)
Chef::Resource.resource_for_node(snake_case_name, run_context.node)
@@ -156,9 +51,9 @@ class Chef
def describe_self_for_error
if respond_to?(:name)
- %Q[`#{self.class.name} "#{name}"']
+ %Q{`#{self.class} "#{name}"'}
elsif respond_to?(:recipe_name)
- %Q[`#{self.class.name} "#{recipe_name}"']
+ %Q{`#{self.class} "#{recipe_name}"'}
else
to_s
end
@@ -168,14 +63,72 @@ class Chef
raise Chef::Exceptions::ResourceNotFound, "exec was called, but you probably meant to use an execute resource. If not, please call Kernel#exec explicitly. The exec block called was \"#{args}\""
end
+ # DEPRECATED:
+ # method_missing must live for backcompat purposes until Chef 13.
+ def method_missing(method_symbol, *args, &block)
+ #
+ # If there is already DSL for this, someone must have called
+ # method_missing manually. Not a fan. Not. A. Fan.
+ #
+ if respond_to?(method_symbol)
+ Chef.log_deprecation("Calling method_missing(#{method_symbol.inspect}) directly is deprecated in Chef 12 and will be removed in Chef 13. Use public_send() or send() instead.")
+ return send(method_symbol, *args, &block)
+ end
+
+ #
+ # If a definition exists, then Chef::DSL::Definitions.add_definition was
+ # never called. DEPRECATED.
+ #
+ if run_context.definitions.has_key?(method_symbol.to_sym)
+ Chef.log_deprecation("Definition #{method_symbol} (#{run_context.definitions[method_symbol.to_sym]}) was added to the run_context without calling Chef::DSL::Definitions.add_definition(#{method_symbol.to_sym.inspect}). This will become required in Chef 13.")
+ Chef::DSL::Definitions.add_definition(method_symbol)
+ return send(method_symbol, *args, &block)
+ end
+
+ #
+ # See if the resource exists anyway. If the user had set
+ # Chef::Resource::Blah = <resource>, a deprecation warning will be
+ # emitted and the DSL method 'blah' will be added to the DSL.
+ #
+ resource_class = Chef::ResourceResolver.resolve(method_symbol, node: run_context ? run_context.node : nil)
+ if resource_class
+ Chef::DSL::Resources.add_resource_dsl(method_symbol)
+ return send(method_symbol, *args, &block)
+ end
+
+ begin
+ super
+ rescue NoMethodError
+ raise NoMethodError, "No resource or method named `#{method_symbol}' for #{describe_self_for_error}"
+ rescue NameError
+ raise NameError, "No resource, method, or local variable named `#{method_symbol}' for #{describe_self_for_error}"
+ end
+ end
+
+ module FullDSL
+ require "chef/dsl/data_query"
+ require "chef/dsl/platform_introspection"
+ require "chef/dsl/include_recipe"
+ require "chef/dsl/registry_helper"
+ require "chef/dsl/reboot_pending"
+ require "chef/dsl/audit"
+ require "chef/dsl/powershell"
+ include Chef::DSL::DataQuery
+ include Chef::DSL::PlatformIntrospection
+ include Chef::DSL::IncludeRecipe
+ include Chef::DSL::Recipe
+ include Chef::DSL::RegistryHelper
+ include Chef::DSL::RebootPending
+ include Chef::DSL::Audit
+ include Chef::DSL::Powershell
+ end
end
end
end
-# We require this at the BOTTOM of this file to avoid circular requires (it is used
-# at runtime but not load time)
-require 'chef/resource'
+# Avoid circular references for things that are only used in instance methods
+require "chef/resource"
# **DEPRECATED**
# This used to be part of chef/mixin/recipe_definition_dsl_core. Load the file to activate the deprecation code.
-require 'chef/mixin/recipe_definition_dsl_core'
+require "chef/mixin/recipe_definition_dsl_core"