class Chef::ResourceResolver

Attributes

action[R]

@api private

canonical[R]

@api private

node[R]

@api private

resource_name[R]

@api private

Public Class Methods

includes_handler?(resource_name, resource_class) click to toggle source

Whether the given handler attempts to provide the resource class at all.

@api private

# File lib/chef/resource_resolver.rb, line 114
def self.includes_handler?(resource_name, resource_class)
  handler_map.list(nil, resource_name).include?(resource_class)
end
list(resource_name, node: nil, canonical: nil) click to toggle source

Resolve a list of all resources that implement the given DSL (in order of preference).

@param resource_name [Symbol] The resource DSL name (e.g. `:file`). @param node [Chef::Node] The node against which to resolve. `nil` causes

platform filters to be ignored.

@param canonical [Boolean] `true` or `false` to match canonical or

non-canonical values only. `nil` to ignore canonicality.
# File lib/chef/resource_resolver.rb, line 46
def self.list(resource_name, node: nil, canonical: nil)
  new(node, resource_name, canonical: canonical).list
end
new(node, resource_name, canonical: nil) click to toggle source

Create a resolver.

@param node [Chef::Node] The node against which to resolve. `nil` causes

platform filters to be ignored.

@param resource_name [Symbol] The resource DSL name (e.g. `:file`). @param canonical [Boolean] `true` or `false` to match canonical or

non-canonical values only. `nil` to ignore canonicality.  Default: `nil`

@api private use Chef::ResourceResolver.resolve or .list instead.

# File lib/chef/resource_resolver.rb, line 71
def initialize(node, resource_name, canonical: nil)
  @node = node
  @resource_name = resource_name.to_sym
  @canonical = canonical
end
resolve(resource_name, node: nil, canonical: nil) click to toggle source

Resolve a resource by name.

@param resource_name [Symbol] The resource DSL name (e.g. `:file`). @param node [Chef::Node] The node against which to resolve. `nil` causes

platform filters to be ignored.
# File lib/chef/resource_resolver.rb, line 32
def self.resolve(resource_name, node: nil, canonical: nil)
  new(node, resource_name, canonical: canonical).resolve
end

Protected Class Methods

handler_map() click to toggle source
# File lib/chef/resource_resolver.rb, line 124
def self.handler_map
  Chef.resource_handler_map
end
priority_map() click to toggle source
# File lib/chef/resource_resolver.rb, line 120
def self.priority_map
  Chef.resource_priority_map
end

Public Instance Methods

list() click to toggle source

@api private

# File lib/chef/resource_resolver.rb, line 94
def list
  Chef::Log.trace "Resources for generic #{resource_name} resource enabled on node include: #{prioritized_handlers}"
  prioritized_handlers
end
provided_by?(resource_class) click to toggle source

Whether this DSL is provided by the given resource_class.

Does NOT call provides? on the resource (it is assumed this is being called from provides?).

@api private

# File lib/chef/resource_resolver.rb, line 106
def provided_by?(resource_class)
  potential_handlers.include?(resource_class)
end
resolve() click to toggle source

@api private use Chef::ResourceResolver.resolve instead.

# File lib/chef/resource_resolver.rb, line 78
def resolve
  # log this so we know what resources will work for the generic resource on the node (early cut)
  Chef::Log.trace "Resources for generic #{resource_name} resource enabled on node include: #{prioritized_handlers}"

  handler = prioritized_handlers.first

  if handler
    Chef::Log.trace "Resource for #{resource_name} is #{handler}"
  else
    Chef::Log.trace "Dynamic resource resolver FAILED to resolve a resource for #{resource_name}"
  end

  handler
end

Protected Instance Methods

enabled_handlers() click to toggle source
# File lib/chef/resource_resolver.rb, line 141
def enabled_handlers
  potential_handlers.select { |handler| !overrode_provides?(handler) || handler.provides?(node, resource_name) }
end
handler_map() click to toggle source
# File lib/chef/resource_resolver.rb, line 132
def handler_map
  Chef.resource_handler_map
end
overrode_provides?(handler) click to toggle source
# File lib/chef/resource_resolver.rb, line 156
def overrode_provides?(handler)
  handler.method(:provides?).owner != Chef::Resource.method(:provides?).owner
end
potential_handlers() click to toggle source

@api private

# File lib/chef/resource_resolver.rb, line 137
def potential_handlers
  handler_map.list(node, resource_name, canonical: canonical).uniq
end
prioritized_handlers() click to toggle source
# File lib/chef/resource_resolver.rb, line 145
def prioritized_handlers
  @prioritized_handlers ||= begin
    enabled_handlers = self.enabled_handlers

    prioritized = priority_map.list(node, resource_name, canonical: canonical).flatten(1)
    prioritized &= enabled_handlers # Filter the priority map by the actual enabled handlers
    prioritized |= enabled_handlers # Bring back any handlers that aren't in the priority map, at the *end* (ordered set)
    prioritized
  end
end
priority_map() click to toggle source
# File lib/chef/resource_resolver.rb, line 128
def priority_map
  Chef.resource_priority_map
end