class Puppet::Transaction::AdditionalResourceGenerator

Adds additional resources to the catalog and relationship graph that are generated by existing resources. There are two ways that a resource can generate additional resources, either through the generate method or the eval_generate method.

@api private

Public Instance Methods

eval_generate(resource) click to toggle source
# File lib/puppet/transaction/additional_resource_generator.rb, line 34
def eval_generate(resource)
  return false unless resource.respond_to?(:eval_generate)
  raise Puppet::DevError,"Depthfirst resources are not supported by eval_generate" if resource.depthfirst?
  begin
    generated = replace_duplicates_with_catalog_resources(resource.eval_generate)
    return false if generated.empty?
  rescue => detail
    resource.log_exception(detail, "Failed to generate additional resources using 'eval_generate': #{detail}")
    return false
  end
  add_resources(generated, resource)

  made = Hash[generated.map(&:name).zip(generated)]
  contain_generated_resources_in(resource, made)
  connect_resources_to_ancestors(resource, made)

  true
end
generate_additional_resources(resource) click to toggle source
# File lib/puppet/transaction/additional_resource_generator.rb, line 14
def generate_additional_resources(resource)
  return unless resource.respond_to?(:generate)
  begin
    generated = resource.generate
  rescue => detail
    resource.log_exception(detail, "Failed to generate additional resources using 'generate': #{detail}")
  end
  return unless generated
  generated = [generated] unless generated.is_a?(Array)
  generated.collect do |res|
    @catalog.resource(res.ref) || res
  end.each do |res|
    priority = @prioritizer.generate_priority_contained_in(resource, res)
    add_resource(res, resource, priority)

    add_conditional_directed_dependency(resource, res)
    generate_additional_resources(res)
  end
end

Public Class Methods

new(catalog, relationship_graph, prioritizer) click to toggle source
# File lib/puppet/transaction/additional_resource_generator.rb, line 8
def initialize(catalog, relationship_graph, prioritizer)
  @catalog = catalog
  @relationship_graph = relationship_graph
  @prioritizer = prioritizer
end