Class: Chef::Cookbook::RemoteFileVendor
- Inherits:
-
FileVendor
- Object
- FileVendor
- Chef::Cookbook::RemoteFileVendor
- 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 Attribute Summary collapse
-
#cookbook_name ⇒ Object
readonly
Returns the value of attribute cookbook_name.
-
#rest ⇒ Object
readonly
Returns the value of attribute rest.
Instance Method Summary collapse
-
#get_filename(filename) ⇒ Object
Implements abstract base's requirement.
-
#initialize(manifest, rest) ⇒ RemoteFileVendor
constructor
A new instance of RemoteFileVendor.
- #validate_cached_copy(cache_filename) ⇒ Object
Methods inherited from FileVendor
create_from_manifest, fetch_from_disk, fetch_from_remote, initialization_options, vendor_class
Constructor Details
#initialize(manifest, rest) ⇒ RemoteFileVendor
Returns a new instance of RemoteFileVendor.
30 31 32 33 34 |
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 30 def initialize(manifest, rest) @manifest = manifest @cookbook_name = @manifest.name @rest = rest end |
Instance Attribute Details
#cookbook_name ⇒ Object (readonly)
Returns the value of attribute cookbook_name.
28 29 30 |
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 28 def cookbook_name @cookbook_name end |
#rest ⇒ Object (readonly)
Returns the value of attribute rest.
27 28 29 |
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 27 def 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.
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 76 77 78 |
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 39 def get_filename(filename) if filename =~ %r{([^/]+)/(.+)$} segment = $1 else raise "get_filename: Cannot determine segment/filename for incoming filename #{filename}" end files_for_segment = @manifest.files_for(segment) raise "No such segment #{segment} in cookbook #{@cookbook_name}" unless files_for_segment found_manifest_record = files_for_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.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.streaming_request(found_manifest_record[:url]) Chef::Log.trace("Storing updated #{cache_filename} in the cache.") Chef::FileCache.move_to(raw_file.path, cache_filename) else Chef::Log.trace("Not fetching #{cache_filename}, as the cache is up to date.") Chef::Log.trace("Current checksum: #{current_checksum}; manifest checksum: #{found_manifest_record["checksum"]})") end # return the filename, not the contents (second argument= false) Chef::FileCache.load(cache_filename, false) end |
#validate_cached_copy(cache_filename) ⇒ Object
80 81 82 |
# File 'lib/chef/cookbook/remote_file_vendor.rb', line 80 def validate_cached_copy(cache_filename) CookbookCacheCleaner.instance.mark_file_as_valid(cache_filename) end |