class Chef::ResourceBuilder

Attributes

cookbook_name[R]
created_at[R]
enclosing_provider[R]
name[R]
new_resource[R]
params[R]
recipe_name[R]
resource[R]
run_context[R]
type[R]

Public Class Methods

new(type: nil, name: nil, created_at: nil, params: nil, run_context: nil, cookbook_name: nil, recipe_name: nil, enclosing_provider: nil, new_resource: nil) click to toggle source

FIXME (ruby-2.1 syntax): most of these are mandatory

# File lib/chef/resource_builder.rb, line 35
def initialize(type: nil, name: nil, created_at: nil, params: nil, run_context: nil, cookbook_name: nil, recipe_name: nil, enclosing_provider: nil, new_resource: nil)
  @type               = type
  @name               = name
  @created_at         = created_at
  @params             = params
  @run_context        = run_context
  @cookbook_name      = cookbook_name
  @recipe_name        = recipe_name
  @enclosing_provider = enclosing_provider
  @new_resource       = new_resource
end

Public Instance Methods

build(&block) click to toggle source
# File lib/chef/resource_builder.rb, line 47
def build(&block)
  @resource = resource_class.new(name, run_context)
  if resource.resource_name.nil?
    raise Chef::Exceptions::InvalidResourceSpecification, "#{resource}.resource_name is `nil`!  Did you forget to put `provides :blah` or `resource_name :blah` in your resource class?"
  end

  resource.source_line = created_at
  resource.declared_type = type

  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 = enclosing_provider

  # XXX: this is required for definition params inside of the scope of a
  # subresource to work correctly.
  resource.params = params

  # Evaluate resource attribute DSL
  if block_given?
    resource.resource_initializing = true
    begin
      if new_resource.nil?
        resource.instance_exec(&block)
      else
        resource.instance_exec(new_resource, &block)
      end
    ensure
      resource.resource_initializing = false
    end
  end

  # Run optional resource hook
  resource.after_created

  # Force to compile_time execution if the flag is set
  if resource.compile_time
    Array(resource.action).each do |action|
      resource.run_action(action)
    end
    resource.action :nothing
  end

  resource
end

Private Instance Methods

resource_class() click to toggle source
# File lib/chef/resource_builder.rb, line 95
def resource_class
  # 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 ||= Chef::Resource.resource_for_node(type, run_context.node)
end