Class/Module Index [+]

Quicksearch

Chef::Cookbook::RemoteFileVendor

Chef::Cookbook::RemoteFileVendor

This FileVendor loads files by either fetching them from the local cache, or if not available, loading them from the remote server.

Public Class Methods

new(manifest, rest) click to toggle source
# File lib/chef/cookbook/remote_file_vendor.rb, line 28
def initialize(manifest, rest)
  @manifest = manifest
  @cookbook_name = @manifest[:cookbook_name]
  @rest = rest
end

Public Instance Methods

get_filename(filename) click to toggle source

Implements abstract base's requirement. It looks in the Chef::Config.cookbook_path file hierarchy for the requested file.

# File lib/chef/cookbook/remote_file_vendor.rb, line 37
def get_filename(filename)
  if filename =~ /([^\/]+)\/(.+)$/
    segment = $1
  else
    raise "get_filename: Cannot determine segment/filename for incoming filename #{filename}"
  end

  raise "No such segment #{segment} in cookbook #{@cookbook_name}" unless @manifest[segment]
  found_manifest_record = @manifest[segment].find {|manifest_record| manifest_record[:path] == filename }
  raise "No such file #{filename} in #{@cookbook_name}" unless found_manifest_record

  cache_filename = File.join("cookbooks", @cookbook_name, found_manifest_record['path'])

  # update valid_cache_entries so the upstream cache cleaner knows what
  # we've used.
  validate_cached_copy(cache_filename)

  current_checksum = nil
  if Chef::FileCache.has_key?(cache_filename)
    current_checksum = Chef::CookbookVersion.checksum_cookbook_file(Chef::FileCache.load(cache_filename, false))
  end

  # If the checksums are different between on-disk (current) and on-server
  # (remote, per manifest), do the update. This will also execute if there
  # is no current checksum.
  if current_checksum != found_manifest_record['checksum']
    raw_file = @rest.get_rest(found_manifest_record[:url], true)

    Chef::Log.debug("Storing updated #{cache_filename} in the cache.")
    Chef::FileCache.move_to(raw_file.path, cache_filename)
  else
    Chef::Log.debug("Not fetching #{cache_filename}, as the cache is up to date.")
    Chef::Log.debug("current checksum: #{current_checksum}; manifest checksum: #{found_manifest_record['checksum']})")
  end

  full_path_cache_filename = Chef::FileCache.load(cache_filename, false)

  # return the filename, not the contents (second argument= false)
  full_path_cache_filename
end
validate_cached_copy(cache_filename) click to toggle source
# File lib/chef/cookbook/remote_file_vendor.rb, line 78
def validate_cached_copy(cache_filename)
  CookbookCacheCleaner.instance.mark_file_as_valid(cache_filename)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.