Module: Chef::DSL::Recipe
- Includes:
- Mixin::ConvertToClassName, Mixin::ShellOut
- Included in:
- Provider::Deploy, Provider::LWRPBase, Recipe
- Defined in:
- lib/chef/dsl/recipe.rb
Overview
Chef::DSL::Recipe
Provides the primary recipe DSL functionality for defining Chef resource objects via method calls.
Constant Summary
Constants included from Mixin::ShellOut
Mixin::ShellOut::DEPRECATED_OPTIONS
Instance Method Summary collapse
-
#build_resource(type, name, created_at = nil, &resource_attrs_block) ⇒ Object
Instantiate a resource of the given
type
with the givenname
and attributes as given in theresource_attrs_block
. -
#declare_resource(type, name, created_at = nil, &resource_attrs_block) ⇒ Object
Instantiates a resource (via #build_resource), then adds it to the resource collection.
- #describe_self_for_error ⇒ Object
-
#evaluate_resource_definition(definition_name, *args, &block) ⇒ Object
Processes the arguments and block as a resource definition.
- #exec(args) ⇒ Object
- #has_resource_definition?(name) ⇒ Boolean
- #have_resource_class_for?(snake_case_name) ⇒ Boolean
- #method_missing(method_symbol, *args, &block) ⇒ Object
- #resource_class_for(snake_case_name) ⇒ Object
Methods included from Mixin::ConvertToClassName
#constantize, #convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename
Methods included from Mixin::ShellOut
#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_symbol, *args, &block) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/chef/dsl/recipe.rb', line 34 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 |
Instance Method Details
#build_resource(type, name, created_at = nil, &resource_attrs_block) ⇒ Object
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.
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/chef/dsl/recipe.rb', line 92 def build_resource(type, name, created_at=nil, &resource_attrs_block) created_at ||= caller[0] # Checks the new platform => short_name => resource mapping initially # then fall back to the older approach (Chef::Resource.const_get) for # backward compatibility resource_class = resource_class_for(type) raise ArgumentError, "You must supply a name when declaring a #{type} resource" if name.nil? resource = resource_class.new(name, run_context) resource.source_line = created_at # If we have a resource like this one, we want to steal its state # This behavior is very counter-intuitive and should be removed. # See CHEF-3694, https://tickets.opscode.com/browse/CHEF-3694 # Moved to this location to resolve CHEF-5052, https://tickets.opscode.com/browse/CHEF-5052 resource.load_prior_resource(type, name) resource.cookbook_name = cookbook_name resource.recipe_name = recipe_name # Determine whether this resource is being created in the context of an enclosing Provider resource.enclosing_provider = self.is_a?(Chef::Provider) ? self : nil # XXX: This is very crufty, but it's required for resource definitions # to work properly :( resource.params = @params # Evaluate resource attribute DSL resource.instance_eval(&resource_attrs_block) if block_given? # Run optional resource hook resource.after_created resource end |
#declare_resource(type, name, created_at = nil, &resource_attrs_block) ⇒ Object
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.
79 80 81 82 83 84 85 86 |
# File 'lib/chef/dsl/recipe.rb', line 79 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 |
#describe_self_for_error ⇒ Object
137 138 139 140 141 142 143 144 145 |
# File 'lib/chef/dsl/recipe.rb', line 137 def describe_self_for_error if respond_to?(:name) %Q[`#{self.class.name} "#{name}"'] elsif respond_to?(:recipe_name) %Q[`#{self.class.name} "#{recipe_name}"'] else to_s end end |
#evaluate_resource_definition(definition_name, *args, &block) ⇒ Object
Processes the arguments and block as a resource definition.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/chef/dsl/recipe.rb', line 59 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 |
#exec(args) ⇒ Object
147 148 149 |
# File 'lib/chef/dsl/recipe.rb', line 147 def exec(args) 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 |
#has_resource_definition?(name) ⇒ Boolean
54 55 56 |
# File 'lib/chef/dsl/recipe.rb', line 54 def has_resource_definition?(name) run_context.definitions.has_key?(name) end |
#have_resource_class_for?(snake_case_name) ⇒ Boolean
131 132 133 134 135 |
# File 'lib/chef/dsl/recipe.rb', line 131 def have_resource_class_for?(snake_case_name) not resource_class_for(snake_case_name).nil? rescue NameError false end |
#resource_class_for(snake_case_name) ⇒ Object
127 128 129 |
# File 'lib/chef/dsl/recipe.rb', line 127 def resource_class_for(snake_case_name) Chef::Resource.resource_for_node(snake_case_name, run_context.node) end |