Class: CookbookOmnifetch::ArtifactserverLocation
- Inherits:
-
BaseLocation
- Object
- BaseLocation
- CookbookOmnifetch::ArtifactserverLocation
- Defined in:
- lib/cookbook-omnifetch/artifactserver.rb
Instance Attribute Summary collapse
-
#cookbook_version ⇒ Object
readonly
Returns the value of attribute cookbook_version.
-
#uri ⇒ Object
readonly
Returns the value of attribute uri.
Attributes inherited from BaseLocation
Instance Method Summary collapse
- #cache_key ⇒ Object
-
#cache_path ⇒ Pathname
The path where the pristine tarball is cached.
-
#cache_root ⇒ Pathname
The path where all pristine tarballs from an artifactserver are held.
-
#cached_cookbook ⇒ CachedCookbook
The cached cookbook for this location.
- #cookbook_name ⇒ Object
-
#http_client(uri) ⇒ Object
TODO: DI this.
-
#initialize(dependency, options = {}) ⇒ ArtifactserverLocation
constructor
A new instance of ArtifactserverLocation.
-
#install ⇒ void
Install the given cookbook.
-
#install_path ⇒ Pathname?
The path where this cookbook would live in the store, if it were installed.
-
#installed? ⇒ Boolean
Determine if this revision is installed.
- #lock_data ⇒ Object
- #repo_host ⇒ Object
- #sanitized_version ⇒ Object
-
#staging_root ⇒ Pathname
The path where tarballs are downloaded to and unzipped.
-
#to_lock ⇒ string
The lockfile representation of this location.
Methods inherited from BaseLocation
Constructor Details
#initialize(dependency, options = {}) ⇒ ArtifactserverLocation
Returns a new instance of ArtifactserverLocation.
13 14 15 16 17 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 13 def initialize(dependency, = {}) super @uri ||= [:artifactserver] @cookbook_version = [:version] end |
Instance Attribute Details
#cookbook_version ⇒ Object (readonly)
Returns the value of attribute cookbook_version.
11 12 13 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 11 def cookbook_version @cookbook_version end |
#uri ⇒ Object (readonly)
Returns the value of attribute uri.
10 11 12 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 10 def uri @uri end |
Instance Method Details
#cache_key ⇒ Object
73 74 75 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 73 def cache_key "#{dependency.name}-#{cookbook_version}-#{repo_host}" end |
#cache_path ⇒ Pathname
The path where the pristine tarball is cached
126 127 128 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 126 def cache_path cache_root.join("#{cache_key}.tgz") end |
#cache_root ⇒ Pathname
The path where all pristine tarballs from an artifactserver are held. Tarballs are moved/swapped into this location once they have been staged in a co-located staging directory.
105 106 107 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 105 def cache_root Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver") end |
#cached_cookbook ⇒ CachedCookbook
The cached cookbook for this location.
80 81 82 83 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 80 def cached_cookbook raise AbstractFunction, "#cached_cookbook must be implemented on #{self.class.name}!" end |
#cookbook_name ⇒ Object
23 24 25 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 23 def cookbook_name dependency.name end |
#http_client(uri) ⇒ Object
TODO: DI this.
57 58 59 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 57 def http_client(uri) Chef::HTTP::Simple.new(uri) end |
#install ⇒ void
This method returns an undefined value.
Install the given cookbook. Subclasses that implement this method should perform all the installation and validation steps required.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 38 def install FileUtils.mkdir_p(cache_root) unless cache_root.exist? http = http_client(uri) http.streaming_request(nil) do |tempfile| tempfile.close FileUtils.mv(tempfile.path, cache_path) end FileUtils.mkdir_p(staging_root) unless staging_root.exist? Dir.mktmpdir(nil, staging_root) do |staging_dir| Mixlib::Archive.new(cache_path).extract(staging_dir, perms: false) staged_cookbook_path = File.join(staging_dir, cookbook_name) validate_cached!(staged_cookbook_path) FileUtils.mv(staged_cookbook_path, install_path) end end |
#install_path ⇒ Pathname?
The path where this cookbook would live in the store, if it were installed.
69 70 71 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 69 def install_path @install_path ||= CookbookOmnifetch.storage_path.join(cache_key) end |
#installed? ⇒ Boolean
Determine if this revision is installed.
30 31 32 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 30 def installed? install_path.exist? end |
#lock_data ⇒ Object
85 86 87 88 89 90 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 85 def lock_data out = {} out["artifactserver"] = uri out["version"] = cookbook_version out end |
#repo_host ⇒ Object
19 20 21 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 19 def repo_host @host ||= URI.parse(uri).host end |
#sanitized_version ⇒ Object
61 62 63 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 61 def sanitized_version cookbook_version end |
#staging_root ⇒ Pathname
The path where tarballs are downloaded to and unzipped. On certain platforms you have a better chance of getting an atomic move if your temporary working directory is on the same device/volume as the destination. To support this, we use a staging directory located under the cache path under the rather mild assumption that everything under the cache path is going to be on one device.
Do not create anything under this directory that isn’t randomly named and remember to release your files once you are done.
119 120 121 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 119 def staging_root Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver") end |
#to_lock ⇒ string
The lockfile representation of this location.
95 96 97 98 |
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 95 def to_lock raise AbstractFunction, "#to_lock must be implemented on #{self.class.name}!" end |