cookbook-omnifetch 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/cookbook-omnifetch.gemspec +1 -1
- data/lib/cookbook-omnifetch.rb +1 -0
- data/lib/cookbook-omnifetch/artifactory.rb +127 -0
- data/lib/cookbook-omnifetch/version.rb +1 -1
- data/spec/unit/artifactory_spec.rb +64 -0
- data/spec/unit/chef_server_spec.rb +1 -1
- metadata +10 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c87b779ed374b94c79ed6d60c92d4acdacca050
|
4
|
+
data.tar.gz: c5f55d263dd9c5ccc81b96be560664d6d4ac882a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 948bbab575f6693876e197978b3866b9489dc24c64b3860b94fee60cb5187d96fc3101559067aa163d0b44911aa90c10bc20f1a33de6d14e626cd41198337519
|
7
|
+
data.tar.gz: 1ad1cac27d2b6a6c84f01c8155a7dcf11f14f5af56c45dd842c50e6e86ff35369e501f81a9914646c07bfa60e9c47cb463506ce5d1b4ef5c23bc885bde277d5c
|
data/.travis.yml
CHANGED
data/cookbook-omnifetch.gemspec
CHANGED
data/lib/cookbook-omnifetch.rb
CHANGED
@@ -6,6 +6,7 @@ require "cookbook-omnifetch/git"
|
|
6
6
|
require "cookbook-omnifetch/github"
|
7
7
|
require "cookbook-omnifetch/path"
|
8
8
|
require "cookbook-omnifetch/artifactserver"
|
9
|
+
require "cookbook-omnifetch/artifactory"
|
9
10
|
require "cookbook-omnifetch/chef_server"
|
10
11
|
|
11
12
|
module CookbookOmnifetch
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require "cookbook-omnifetch/base"
|
2
|
+
|
3
|
+
require "mixlib/archive"
|
4
|
+
require "tmpdir"
|
5
|
+
|
6
|
+
module CookbookOmnifetch
|
7
|
+
|
8
|
+
class ArtifactoryLocation < BaseLocation
|
9
|
+
|
10
|
+
attr_reader :uri
|
11
|
+
attr_reader :cookbook_version
|
12
|
+
attr_reader :http_client
|
13
|
+
|
14
|
+
def initialize(dependency, options = {})
|
15
|
+
super
|
16
|
+
@uri ||= options[:artifactory]
|
17
|
+
@cookbook_version = options[:version]
|
18
|
+
@http_client = options[:http_client]
|
19
|
+
end
|
20
|
+
|
21
|
+
def repo_host
|
22
|
+
@host ||= URI.parse(uri).host
|
23
|
+
end
|
24
|
+
|
25
|
+
def cookbook_name
|
26
|
+
dependency.name
|
27
|
+
end
|
28
|
+
|
29
|
+
# Determine if this revision is installed.
|
30
|
+
#
|
31
|
+
# @return [Boolean]
|
32
|
+
def installed?
|
33
|
+
install_path.exist?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Install the given cookbook. Subclasses that implement this method should
|
37
|
+
# perform all the installation and validation steps required.
|
38
|
+
#
|
39
|
+
# @return [void]
|
40
|
+
def install
|
41
|
+
FileUtils.mkdir_p(cache_root) unless cache_root.exist?
|
42
|
+
|
43
|
+
http_client.streaming_request(nil) do |tempfile|
|
44
|
+
tempfile.close
|
45
|
+
FileUtils.mv(tempfile.path, cache_path)
|
46
|
+
end
|
47
|
+
|
48
|
+
FileUtils.mkdir_p(staging_root) unless staging_root.exist?
|
49
|
+
Dir.mktmpdir(nil, staging_root) do |staging_dir|
|
50
|
+
Mixlib::Archive.new(cache_path).extract(staging_dir, perms: false)
|
51
|
+
staged_cookbook_path = File.join(staging_dir, cookbook_name)
|
52
|
+
validate_cached!(staged_cookbook_path)
|
53
|
+
FileUtils.mv(staged_cookbook_path, install_path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def sanitized_version
|
58
|
+
cookbook_version
|
59
|
+
end
|
60
|
+
|
61
|
+
# The path where this cookbook would live in the store, if it were
|
62
|
+
# installed.
|
63
|
+
#
|
64
|
+
# @return [Pathname, nil]
|
65
|
+
def install_path
|
66
|
+
@install_path ||= CookbookOmnifetch.storage_path.join(cache_key)
|
67
|
+
end
|
68
|
+
|
69
|
+
def cache_key
|
70
|
+
"#{dependency.name}-#{cookbook_version}-#{repo_host}"
|
71
|
+
end
|
72
|
+
|
73
|
+
# The cached cookbook for this location.
|
74
|
+
#
|
75
|
+
# @return [CachedCookbook]
|
76
|
+
def cached_cookbook
|
77
|
+
raise AbstractFunction,
|
78
|
+
"#cached_cookbook must be implemented on #{self.class.name}!"
|
79
|
+
end
|
80
|
+
|
81
|
+
def lock_data
|
82
|
+
out = {}
|
83
|
+
out["artifactory"] = uri
|
84
|
+
out["version"] = cookbook_version
|
85
|
+
out
|
86
|
+
end
|
87
|
+
|
88
|
+
# The lockfile representation of this location.
|
89
|
+
#
|
90
|
+
# @return [string]
|
91
|
+
def to_lock
|
92
|
+
raise AbstractFunction,
|
93
|
+
"#to_lock must be implemented on #{self.class.name}!"
|
94
|
+
end
|
95
|
+
|
96
|
+
# The path where all pristine tarballs from an artifactserver are held.
|
97
|
+
# Tarballs are moved/swapped into this location once they have been staged
|
98
|
+
# in a co-located staging directory.
|
99
|
+
#
|
100
|
+
# @return [Pathname]
|
101
|
+
def cache_root
|
102
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache", "artifactserver")
|
103
|
+
end
|
104
|
+
|
105
|
+
# The path where tarballs are downloaded to and unzipped. On certain platforms
|
106
|
+
# you have a better chance of getting an atomic move if your temporary working
|
107
|
+
# directory is on the same device/volume as the destination. To support this,
|
108
|
+
# we use a staging directory located under the cache path under the rather mild
|
109
|
+
# assumption that everything under the cache path is going to be on one device.
|
110
|
+
#
|
111
|
+
# Do not create anything under this directory that isn't randomly named and
|
112
|
+
# remember to release your files once you are done.
|
113
|
+
#
|
114
|
+
# @return [Pathname]
|
115
|
+
def staging_root
|
116
|
+
Pathname.new(CookbookOmnifetch.cache_path).join(".cache_tmp", "artifactserver")
|
117
|
+
end
|
118
|
+
|
119
|
+
# The path where the pristine tarball is cached
|
120
|
+
#
|
121
|
+
# @return [Pathname]
|
122
|
+
def cache_path
|
123
|
+
cache_root.join("#{cache_key}.tgz")
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "cookbook-omnifetch/artifactory"
|
3
|
+
require "zlib"
|
4
|
+
require "archive/tar/minitar"
|
5
|
+
|
6
|
+
module CookbookOmnifetch
|
7
|
+
describe ArtifactoryLocation do
|
8
|
+
|
9
|
+
let(:cookbook_name) { "nginx" }
|
10
|
+
|
11
|
+
let(:cookbook_version) { "1.5.23" }
|
12
|
+
|
13
|
+
let(:http_client) { double("Chef::HTTP::Simple") }
|
14
|
+
|
15
|
+
let(:constraint) { double("Constraint") }
|
16
|
+
|
17
|
+
let(:dependency) { double("Dependency", name: cookbook_name, constraint: constraint) }
|
18
|
+
|
19
|
+
let(:url) { "https://artifactory.example.com/api/v1/cookbooks/nginx/versions/1.5.23/download" }
|
20
|
+
|
21
|
+
let(:options) { { artifactory: url, version: cookbook_version, http_client: http_client } }
|
22
|
+
|
23
|
+
subject(:public_repo_location) { described_class.new(dependency, options) }
|
24
|
+
|
25
|
+
it "has a URI" do
|
26
|
+
expect(public_repo_location.uri).to eq(url)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a repo host" do
|
30
|
+
expect(public_repo_location.repo_host).to eq("artifactory.example.com")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "has an exact version" do
|
34
|
+
expect(public_repo_location.cookbook_version).to eq("1.5.23")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has a cache key containing the site URI and version" do
|
38
|
+
expect(public_repo_location.cache_key).to eq("nginx-1.5.23-artifactory.example.com")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sets the install location as the cache path plus cache key" do
|
42
|
+
expected_install_path = Pathname.new("~/.berkshelf/cookbooks").expand_path.join("nginx-1.5.23-artifactory.example.com")
|
43
|
+
expect(public_repo_location.install_path).to eq(expected_install_path)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "considers the cookbook installed if it exists in the main cache" do
|
47
|
+
expect(public_repo_location.install_path).to receive(:exist?).and_return(true)
|
48
|
+
expect(public_repo_location.installed?).to be true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "considers the cookbook not installed if it doesn't exist in the main cache" do
|
52
|
+
expect(public_repo_location.install_path).to receive(:exist?).and_return(false)
|
53
|
+
expect(public_repo_location.installed?).to be false
|
54
|
+
end
|
55
|
+
|
56
|
+
it "provides lock data as a Hash" do
|
57
|
+
expected_data = {
|
58
|
+
"artifactory" => url,
|
59
|
+
"version" => "1.5.23",
|
60
|
+
}
|
61
|
+
expect(public_repo_location.lock_data).to eq(expected_data)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -45,7 +45,7 @@ module CookbookOmnifetch
|
|
45
45
|
let(:remote_path) { File.join(test_root, "remote") }
|
46
46
|
let(:options) { { chef_server: url, version: cookbook_version, http_client: http_client } }
|
47
47
|
|
48
|
-
let(:cookbook_files) { %w{. ..
|
48
|
+
let(:cookbook_files) { %w{. .. metadata.rb recipes} }
|
49
49
|
subject(:chef_server_location) { described_class.new(dependency, options) }
|
50
50
|
|
51
51
|
before do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cookbook-omnifetch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2017-
|
16
|
+
date: 2017-05-17 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: mixlib-archive
|
@@ -33,16 +33,16 @@ dependencies:
|
|
33
33
|
name: rake
|
34
34
|
requirement: !ruby/object:Gem::Requirement
|
35
35
|
requirements:
|
36
|
-
- - "
|
36
|
+
- - ">="
|
37
37
|
- !ruby/object:Gem::Version
|
38
|
-
version: '
|
38
|
+
version: '0'
|
39
39
|
type: :development
|
40
40
|
prerelease: false
|
41
41
|
version_requirements: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
|
-
- - "
|
43
|
+
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
45
|
+
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rspec
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- Rakefile
|
79
79
|
- cookbook-omnifetch.gemspec
|
80
80
|
- lib/cookbook-omnifetch.rb
|
81
|
+
- lib/cookbook-omnifetch/artifactory.rb
|
81
82
|
- lib/cookbook-omnifetch/artifactserver.rb
|
82
83
|
- lib/cookbook-omnifetch/base.rb
|
83
84
|
- lib/cookbook-omnifetch/chef_server.rb
|
@@ -98,6 +99,7 @@ files:
|
|
98
99
|
- spec/fixtures/cookbooks/example_cookbook/metadata.rb
|
99
100
|
- spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
|
100
101
|
- spec/spec_helper.rb
|
102
|
+
- spec/unit/artifactory_spec.rb
|
101
103
|
- spec/unit/artifactserver_spec.rb
|
102
104
|
- spec/unit/base_spec.rb
|
103
105
|
- spec/unit/chef_server_spec.rb
|
@@ -124,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
126
|
version: '0'
|
125
127
|
requirements: []
|
126
128
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.6.11
|
128
130
|
signing_key:
|
129
131
|
specification_version: 4
|
130
132
|
summary: Library code to fetch Chef cookbooks from a variety of sources to a local
|
@@ -141,6 +143,7 @@ test_files:
|
|
141
143
|
- spec/fixtures/cookbooks/example_cookbook/metadata.rb
|
142
144
|
- spec/fixtures/cookbooks/example_cookbook/recipes/default.rb
|
143
145
|
- spec/spec_helper.rb
|
146
|
+
- spec/unit/artifactory_spec.rb
|
144
147
|
- spec/unit/artifactserver_spec.rb
|
145
148
|
- spec/unit/base_spec.rb
|
146
149
|
- spec/unit/chef_server_spec.rb
|