class Puppet::Resource::Catalog::StaticCompiler

Public Instance Methods

add_children(host, catalog, resource, file) click to toggle source

Generate children resources for a recursive file and add them to the catalog.

@param host [String] The host name of the node requesting this catalog @param catalog [Puppet::Resource::Catalog] @param resource [Puppet::Resource] @param file [Puppet::Type::File] The file RAL associated with the resource

# File lib/puppet/indirector/catalog/static_compiler.rb, line 115
def add_children(host, catalog, resource, file)
  file = resource.to_ral

  children = get_child_resources(host, catalog, resource, file)

  remove_existing_resources(children, catalog)

  children.each do |name, res|
    catalog.add_resource res
    catalog.add_edge(resource, res)
  end
end
find(request) click to toggle source
# File lib/puppet/indirector/catalog/static_compiler.rb, line 38
def find(request)
  return nil unless catalog = super

  raise "Did not get catalog back" unless catalog.is_a?(model)

  catalog.resources.find_all { |res| res.type == "File" }.each do |resource|
    next unless source = resource[:source]
    next unless source =~ /^puppet:/

    file = resource.to_ral

    if file.recurse?
      add_children(request.key, catalog, resource, file)
    else
      find_and_replace_metadata(request.key, resource, file)
    end
  end

  catalog
end
find_and_replace_metadata(host, resource, file) click to toggle source

Take a resource with a fileserver based file source remove the source parameter, and insert the file metadata into the resource.

This method acts to do the fileserver metadata retrieval in advance, while the file source is local and doesn’t require an HTTP request. It retrieves the file metadata for a given file resource, removes the source parameter from the resource, inserts the metadata into the file resource, and uploads the file contents of the source to the file bucket.

@param host [String] The host name of the node requesting this catalog @param resource [Puppet::Resource] The resource to replace the metadata in @param file [Puppet::Type::File] The file RAL associated with the resource

# File lib/puppet/indirector/catalog/static_compiler.rb, line 71
def find_and_replace_metadata(host, resource, file)
  # We remove URL info from it, so it forces a local copy
  # rather than routing through the network.
  # Weird, but true.
  newsource = file[:source][0].sub("puppet:///", "")
  file[:source][0] = newsource

  raise "Could not get metadata for #{resource[:source]}" unless metadata = file.parameter(:source).metadata

  replace_metadata(host, resource, metadata)
end
get_child_resources(host, catalog, resource, file) click to toggle source

Given a recursive file resource, recursively generate its children resources

@param host [String] The host name of the node requesting this catalog @param catalog [Puppet::Resource::Catalog] @param resource [Puppet::Resource] @param file [Puppet::Type::File] The file RAL associated with the resource

@return [Array<Puppet::Resource>] The recursively generated File resources for the given resource

# File lib/puppet/indirector/catalog/static_compiler.rb, line 136
def get_child_resources(host, catalog, resource, file)
  sourceselect = file[:sourceselect]
  children = {}

  source = resource[:source]

  # This is largely a copy of recurse_remote in File
  total = file[:source].collect do |source|
    next unless result = file.perform_recursion(source)
    return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
    result.each { |data| data.source = "#{source}/#{data.relative_path}" }
    break result if result and ! result.empty? and sourceselect == :first
    result
  end.flatten.compact

  # This only happens if we have sourceselect == :all
  unless sourceselect == :first
    found = []
    total.reject! do |data|
      result = found.include?(data.relative_path)
      found << data.relative_path unless found.include?(data.relative_path)
      result
    end
  end

  total.each do |meta|
    # This is the top-level parent directory
    if meta.relative_path == "."
      replace_metadata(host, resource, meta)
      next
    end
    children[meta.relative_path] ||= Puppet::Resource.new(:file, File.join(file[:path], meta.relative_path))

    # I think this is safe since it's a URL, not an actual file
    children[meta.relative_path][:source] = source + "/" + meta.relative_path
    resource.each do |param, value|
      # These should never be passed to our children.
      unless [:parent, :ensure, :recurse, :recurselimit, :target, :alias, :source].include? param
        children[meta.relative_path][param] = value
      end
    end
    replace_metadata(host, children[meta.relative_path], meta)
  end

  children
end
remove_existing_resources(children, catalog) click to toggle source

Remove any file resources in the catalog that will be duplicated by the given file resources.

@param children [Array<Puppet::Resource>] @param catalog [Puppet::Resource::Catalog]

# File lib/puppet/indirector/catalog/static_compiler.rb, line 188
def remove_existing_resources(children, catalog)
  existing_names = catalog.resources.collect { |r| r.to_s }
  both = (existing_names & children.keys).inject({}) { |hash, name| hash[name] = true; hash }
  both.each { |name| children.delete(name) }
end
replace_metadata(host, resource, metadata) click to toggle source

Rewrite a given file resource with the metadata from a fileserver based file

This performs the actual metadata rewrite for the given file resource and uploads the content of the source file to the filebucket.

@param host [String] The host name of the node requesting this catalog @param resource [Puppet::Resource] The resource to add the metadata to @param metadata [Puppet::FileServing::Metadata] The metadata of the given fileserver based file

# File lib/puppet/indirector/catalog/static_compiler.rb, line 91
def replace_metadata(host, resource, metadata)
  [:mode, :owner, :group].each do |param|
    resource[param] ||= metadata.send(param)
  end

  resource[:ensure] = metadata.ftype
  if metadata.ftype == "file"
    unless resource[:content]
      resource[:content] = metadata.checksum
      resource[:checksum] = metadata.checksum_type
    end
  end

  store_content(resource) if resource[:ensure] == "file"
  old_source = resource.delete(:source)
  Puppet.info "Metadata for #{resource} in catalog for '#{host}' added from '#{old_source}'"
end
store_content(resource) click to toggle source

Retrieve the source of a file resource using a fileserver based source and upload it to the filebucket.

@param resource [Puppet::Resource]

# File lib/puppet/indirector/catalog/static_compiler.rb, line 198
def store_content(resource)
  @summer ||= Object.new
  @summer.extend(Puppet::Util::Checksums)

  type = @summer.sumtype(resource[:content])
  sum = @summer.sumdata(resource[:content])

  if Puppet::FileBucket::File.indirection.find("#{type}/#{sum}")
    Puppet.info "Content for '#{resource[:source]}' already exists"
  else
    Puppet.info "Storing content for source '#{resource[:source]}'"
    content = Puppet::FileServing::Content.indirection.find(resource[:source])
    file = Puppet::FileBucket::File.new(content.content)
    Puppet::FileBucket::File.indirection.save(file)
  end
end