From be30539264fd34c72542dbf834d124875d76d298 Mon Sep 17 00:00:00 2001 From: Lamont Granquist Date: Tue, 24 Nov 2015 14:09:43 -0800 Subject: extract declare_resource to a mixin and extend API - extract to its own mixin so it can be included without method_missing and the rest of the resources DSL - add ability to inject different run_context - add ability to create_if_missing into the resource_collection --- lib/chef/dsl/declare_resource.rb | 108 +++++++++++++++++++++++++++++++++++++++ lib/chef/dsl/recipe.rb | 76 ++------------------------- lib/chef/resource_builder.rb | 10 ++-- 3 files changed, 116 insertions(+), 78 deletions(-) create mode 100644 lib/chef/dsl/declare_resource.rb (limited to 'lib') diff --git a/lib/chef/dsl/declare_resource.rb b/lib/chef/dsl/declare_resource.rb new file mode 100644 index 0000000000..52b0cb715d --- /dev/null +++ b/lib/chef/dsl/declare_resource.rb @@ -0,0 +1,108 @@ +#-- +# Author:: Adam Jacob () +# Author:: Christopher Walters () +# 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"); +# 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 'chef/exceptions' + +class Chef + module DSL + module DeclareResource + + # + # 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, run_context: self.run_context, create_if_missing: false, &resource_attrs_block) + created_at ||= caller[0] + + if create_if_missing + begin + resource = run_context.resource_collection.find(type => name) + return resource + rescue Chef::Exceptions::ResourceNotFound + end + end + + 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, run_context: self.run_context, &resource_attrs_block) + created_at ||= caller[0] + Thread.exclusive do + require 'chef/resource_builder' unless defined?(Chef::ResourceBuilder) + end + + 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 + end + end +end diff --git a/lib/chef/dsl/recipe.rb b/lib/chef/dsl/recipe.rb index 26c0ec6768..441fcbbd2c 100644 --- a/lib/chef/dsl/recipe.rb +++ b/lib/chef/dsl/recipe.rb @@ -1,7 +1,7 @@ #-- # Author:: Adam Jacob () # Author:: Christopher Walters () -# 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,12 +17,12 @@ # limitations under the License. # -require 'chef/mixin/convert_to_class_name' 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 @@ -37,76 +37,7 @@ class Chef include Chef::DSL::Resources include Chef::DSL::Definitions - - # - # 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::DeclareResource def resource_class_for(snake_case_name) Chef::Resource.resource_for_node(snake_case_name, run_context.node) @@ -196,7 +127,6 @@ class Chef end # Avoid circular references for things that are only used in instance methods -require 'chef/resource_builder' require 'chef/resource' # **DEPRECATED** diff --git a/lib/chef/resource_builder.rb b/lib/chef/resource_builder.rb index 9e9f7047a4..72b3788cf0 100644 --- a/lib/chef/resource_builder.rb +++ b/lib/chef/resource_builder.rb @@ -1,6 +1,6 @@ # # Author:: Lamont Granquist () -# Copyright:: Copyright (c) 2015 Opscode, Inc. +# Copyright:: Copyright (c) 2015-2015 Chef Software, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,10 +18,6 @@ # NOTE: this was extracted from the Recipe DSL mixin, relevant specs are in spec/unit/recipe_spec.rb -require 'chef/exceptions' -require 'chef/resource' -require 'chef/log' - class Chef class ResourceBuilder attr_reader :type @@ -142,3 +138,7 @@ class Chef end end + +require 'chef/exceptions' +require 'chef/resource' +require 'chef/log' -- cgit v1.2.1