class CookbookOmnifetch::ArtifactserverLocation

Attributes

cookbook_version[R]
uri[R]

Public Class Methods

new(dependency, options = {}) click to toggle source
Calls superclass method
# File lib/cookbook-omnifetch/artifactserver.rb, line 13
def initialize(dependency, options = {})
  super
  @uri ||= options[:artifactserver]
  @cookbook_version = options[:version]
end

Public Instance Methods

cache_key() click to toggle source
# File lib/cookbook-omnifetch/artifactserver.rb, line 73
def cache_key
  "#{dependency.name}-#{cookbook_version}-#{repo_host}"
end
cache_path() click to toggle source

The path where the pristine tarball is cached

@return [Pathname]

# File lib/cookbook-omnifetch/artifactserver.rb, line 126
def cache_path
  cache_root.join("#{cache_key}.tgz")
end
cache_root() click to toggle source

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.

@return [Pathname]

# File lib/cookbook-omnifetch/artifactserver.rb, line 105
def cache_root
  Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver")
end
cached_cookbook() click to toggle source

The cached cookbook for this location.

@return [CachedCookbook]

# 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() click to toggle source
# File lib/cookbook-omnifetch/artifactserver.rb, line 23
def cookbook_name
  dependency.name
end
http_client(uri) click to toggle source

TODO: DI this.

# File lib/cookbook-omnifetch/artifactserver.rb, line 57
def http_client(uri)
  Chef::HTTP::Simple.new(uri)
end
install() click to toggle source

Install the given cookbook. Subclasses that implement this method should perform all the installation and validation steps required.

@return [void]

# 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() click to toggle source

The path where this cookbook would live in the store, if it were installed.

@return [Pathname, nil]

# File lib/cookbook-omnifetch/artifactserver.rb, line 69
def install_path
  @install_path ||= CookbookOmnifetch.storage_path.join(cache_key)
end
installed?() click to toggle source

Determine if this revision is installed.

@return [Boolean]

# File lib/cookbook-omnifetch/artifactserver.rb, line 30
def installed?
  install_path.exist?
end
lock_data() click to toggle source
# File lib/cookbook-omnifetch/artifactserver.rb, line 85
def lock_data
  out = {}
  out["artifactserver"] = uri
  out["version"] = cookbook_version
  out
end
repo_host() click to toggle source
# File lib/cookbook-omnifetch/artifactserver.rb, line 19
def repo_host
  @host ||= URI.parse(uri).host
end
sanitized_version() click to toggle source
# File lib/cookbook-omnifetch/artifactserver.rb, line 61
def sanitized_version
  cookbook_version
end
staging_root() click to toggle source

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.

@return [Pathname]

# File lib/cookbook-omnifetch/artifactserver.rb, line 119
def staging_root
  Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver")
end
to_lock() click to toggle source

The lockfile representation of this location.

@return [string]

# File lib/cookbook-omnifetch/artifactserver.rb, line 95
def to_lock
  raise AbstractFunction,
    "#to_lock must be implemented on #{self.class.name}!"
end