Class: Chef::Cookbook::RemoteFileVendor

Inherits:
FileVendor
  • Object
show all
Defined in:
lib/chef/cookbook/remote_file_vendor.rb

Overview

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.

Instance Method Summary collapse

Methods inherited from FileVendor

create_from_manifest, on_create

Constructor Details

#initialize(manifest, rest) ⇒ RemoteFileVendor

Returns a new instance of RemoteFileVendor.



28
29
30
31
32
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 28

def initialize(manifest, rest)
  @manifest = manifest
  @cookbook_name = @manifest[:cookbook_name]
  @rest = rest
end

Instance Method Details

#get_filename(filename) ⇒ Object

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



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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.info("Storing updated #{cache_filename} in the cache.")
    Chef::FileCache.move_to(raw_file.path, cache_filename)
  else
    Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
  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

#valid_cache_entriesObject



81
82
83
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 81

def valid_cache_entries
  Chef::CookbookVersion.valid_cache_entries
end

#validate_cached_copy(cache_filename) ⇒ Object



77
78
79
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 77

def validate_cached_copy(cache_filename)
  valid_cache_entries[cache_filename] = true
end