Class: CookbookOmnifetch::ArtifactserverLocation

Inherits:
BaseLocation
  • Object
show all
Defined in:
lib/cookbook-omnifetch/artifactserver.rb

Instance Attribute Summary collapse

Attributes inherited from BaseLocation

#dependency, #options

Instance Method Summary collapse

Methods inherited from BaseLocation

#validate_cached!

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, options = {})
  super
  @uri ||= options[:artifactserver]
  @cookbook_version = options[:version]
end

Instance Attribute Details

#cookbook_versionObject (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

#uriObject (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_keyObject



73
74
75
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 73

def cache_key
  "#{dependency.name}-#{cookbook_version}-#{repo_host}"
end

#cache_pathPathname

The path where the pristine tarball is cached

Returns:

  • (Pathname)


126
127
128
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 126

def cache_path
  cache_root.join("#{cache_key}.tgz")
end

#cache_rootPathname

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.

Returns:

  • (Pathname)


105
106
107
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 105

def cache_root
  Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver")
end

#cached_cookbookCachedCookbook

The cached cookbook for this location.

Returns:

  • (CachedCookbook)

Raises:



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_nameObject



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

#installvoid

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_pathPathname?

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

Returns:

  • (Pathname, nil)


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.

Returns:

  • (Boolean)


30
31
32
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 30

def installed?
  install_path.exist?
end

#lock_dataObject



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_hostObject



19
20
21
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 19

def repo_host
  @host ||= URI.parse(uri).host
end

#sanitized_versionObject



61
62
63
# File 'lib/cookbook-omnifetch/artifactserver.rb', line 61

def sanitized_version
  cookbook_version
end

#staging_rootPathname

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.

Returns:

  • (Pathname)


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_lockstring

The lockfile representation of this location.

Returns:

  • (string)

Raises:



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