cookbook-omnifetch 0.2.0 → 0.2.1
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/.gitignore +1 -0
- data/README.md +54 -8
- data/lib/cookbook-omnifetch/artifactserver.rb +24 -4
- data/lib/cookbook-omnifetch/version.rb +1 -1
- data/spec/unit/artifactserver_spec.rb +55 -1
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7d091088a8d8bc3534633afc049408ec4b1ae98
|
4
|
+
data.tar.gz: c41001a64b00582c791a9161d9b65989897aea44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 206300e6648ef964968ab77535acbfd494df3f20ab36d4155ae9a2ddb7224b16d23cc95192aa6a7a02799c5c5c47fb386aa161f6e3ec3d022d9c45789d173899
|
7
|
+
data.tar.gz: 44b5ba6fdde4ff019d481e2709a8b5b592012193b0cdfb46d741719dafe7f4a5e70dec776175d7fc91120b287e57aba5154babd81f6aa430a556b24ebb24894d
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,3 @@
|
|
1
|
-
# WARNING
|
2
|
-
|
3
|
-
This repository will be moved in the future. It possibly will not be
|
4
|
-
transferred via github transfer mechanisms, so the git URL may break.
|
5
|
-
|
6
|
-
Don't use this yet unless you're prepared to deal with some breakage.
|
7
|
-
|
8
1
|
# CookbookOmnifetch
|
9
2
|
|
10
3
|
`CookbookOmnifetch` provides library code for fetching Chef cookbooks
|
@@ -28,10 +21,63 @@ Or install it yourself as:
|
|
28
21
|
|
29
22
|
## Usage
|
30
23
|
|
31
|
-
|
24
|
+
#### Inject Dependencies and Configure
|
25
|
+
|
26
|
+
Cookbook Omnifetch is designed to work with utilities from both the
|
27
|
+
Berkshelf and Chef Software ecosystems, so you have to configure it
|
28
|
+
before you can use it. In ChefDK, we do this:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
# Configure CookbookOmnifetch's dependency injection settings to use our classes and config.
|
32
|
+
CookbookOmnifetch.configure do |c|
|
33
|
+
c.cache_path = File.expand_path('~/.chefdk/cache')
|
34
|
+
c.storage_path = Pathname.new(File.expand_path('~/.chefdk/cache/cookbooks'))
|
35
|
+
c.shell_out_class = ChefDK::ShellOut
|
36
|
+
c.cached_cookbook_class = ChefDK::CookbookMetadata
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
#### Fetching Cookbooks
|
41
|
+
|
42
|
+
To download a cookbook:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
fetcher = CookbookOmnifetch.init(dependency, source_options)
|
46
|
+
fetcher.install
|
47
|
+
```
|
48
|
+
|
49
|
+
To specify the cookbook you want, you give CookbookOmnifetch a
|
50
|
+
dependency object that responds to `#name` and `#version_constraint`,
|
51
|
+
e.g.:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
require 'semverse'
|
55
|
+
|
56
|
+
Dependency = Struct.new(:name, :version_constraint)
|
57
|
+
|
58
|
+
my_dep = Dependency.new("apache2", Semverse::Constraint.new("~> 1.0"))
|
59
|
+
```
|
60
|
+
|
61
|
+
The source options for the cookbook are given as a Hash; the keys and
|
62
|
+
values vary based on the kind of storage location. As with Bundler's
|
63
|
+
`gem` options, one key specifies the type of upstream service for the
|
64
|
+
cookbook while other keys specify other options specific to that type.
|
65
|
+
For example:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
CookbookOmnifetch.init(dependency, artifact_server: "https://supermarket.chef.io/api/v1/cookbooks/apache2/versions/3.0.1/download")
|
69
|
+
CookbookOmnifetch.init(dependency, git: "git@github.com:svanzoest/apache2-cookbook.git", tag: "v3.0.1")
|
70
|
+
CookbookOmnifetch.init(dependency, github: "svanzoest/apache2-cookbook", tag: "v3.0.1")
|
71
|
+
CookbookOmnifetch.init(dependency, path: "~/chef-cookbooks/apache2")
|
72
|
+
```
|
32
73
|
|
33
74
|
## Contributing
|
34
75
|
|
76
|
+
As with other Chef Software projects, in order to contribute you need to
|
77
|
+
[agree to the contributor license agreement.](https://supermarket.getchef.com/become-a-contributor)
|
78
|
+
|
79
|
+
After that:
|
80
|
+
|
35
81
|
1. Fork it
|
36
82
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
83
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
@@ -46,7 +46,8 @@ module CookbookOmnifetch
|
|
46
46
|
FileUtils.mv(tempfile.path, cache_path)
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
FileUtils.mkdir_p(staging_root) unless staging_root.exist?
|
50
|
+
Dir.mktmpdir(nil, staging_root) do |staging_dir|
|
50
51
|
Zlib::GzipReader.open(cache_path) do |gz_file|
|
51
52
|
tar = Archive::Tar::Minitar::Input.new(gz_file)
|
52
53
|
tar.each do |e|
|
@@ -90,8 +91,8 @@ module CookbookOmnifetch
|
|
90
91
|
|
91
92
|
def lock_data
|
92
93
|
out = {}
|
93
|
-
out[
|
94
|
-
out[
|
94
|
+
out['artifactserver'] = uri
|
95
|
+
out['version'] = cookbook_version
|
95
96
|
out
|
96
97
|
end
|
97
98
|
|
@@ -105,7 +106,7 @@ module CookbookOmnifetch
|
|
105
106
|
|
106
107
|
|
107
108
|
def ==(other)
|
108
|
-
raise
|
109
|
+
raise 'TODO'
|
109
110
|
other.is_a?(GitLocation) &&
|
110
111
|
other.uri == uri &&
|
111
112
|
other.branch == branch &&
|
@@ -114,10 +115,29 @@ module CookbookOmnifetch
|
|
114
115
|
other.rel == rel
|
115
116
|
end
|
116
117
|
|
118
|
+
# The path where all pristine tarballs from an artifactserver are held.
|
119
|
+
# Tarballs are moved/swapped into this location once they have been staged
|
120
|
+
# in a co-located staging directory.
|
121
|
+
#
|
122
|
+
# @return [Pathname]
|
117
123
|
def cache_root
|
118
124
|
Pathname.new(CookbookOmnifetch.cache_path).join('.cache', 'artifactserver')
|
119
125
|
end
|
120
126
|
|
127
|
+
# The path where tarballs are downloaded to and unzipped. On certain platforms
|
128
|
+
# you have a better chance of getting an atomic move if your temporary working
|
129
|
+
# directory is on the same device/volume as the destination. To support this,
|
130
|
+
# we use a staging directory located under the cache path under the rather mild
|
131
|
+
# assumption that everything under the cache path is going to be on one device.
|
132
|
+
#
|
133
|
+
# Do not create anything under this directory that isn't randomly named and
|
134
|
+
# remember to release your files once you are done.
|
135
|
+
#
|
136
|
+
# @return [Pathname]
|
137
|
+
def staging_root
|
138
|
+
Pathname.new(CookbookOmnifetch.cache_path).join('.cache_tmp', 'artifactserver')
|
139
|
+
end
|
140
|
+
|
121
141
|
# The path where the pristine tarball is cached
|
122
142
|
#
|
123
143
|
# @return [Pathname]
|
@@ -16,7 +16,7 @@ module CookbookOmnifetch
|
|
16
16
|
|
17
17
|
let(:options) { {artifactserver: url, version: cookbook_version } }
|
18
18
|
|
19
|
-
subject(:public_repo_location) {
|
19
|
+
subject(:public_repo_location) { described_class.new(dependency, options) }
|
20
20
|
|
21
21
|
it "has a URI" do
|
22
22
|
expect(public_repo_location.uri).to eq(url)
|
@@ -56,6 +56,60 @@ module CookbookOmnifetch
|
|
56
56
|
}
|
57
57
|
expect(public_repo_location.lock_data).to eq(expected_data)
|
58
58
|
end
|
59
|
+
|
60
|
+
context "when asked to install a new cookbook" do
|
61
|
+
|
62
|
+
let(:http_client) { double("Http Client") }
|
63
|
+
|
64
|
+
let(:test_root) { Dir.mktmpdir(nil) }
|
65
|
+
|
66
|
+
let(:storage_path) { File.join(test_root, "storage") }
|
67
|
+
|
68
|
+
let(:cache_path) { File.join(test_root, "cache") }
|
69
|
+
|
70
|
+
let(:cookbook_fixtures_path) { fixtures_path.join('cookbooks') }
|
71
|
+
|
72
|
+
let(:cookbook_name) { "example_cookbook" }
|
73
|
+
|
74
|
+
let(:cookbook_version) { "0.5.0" }
|
75
|
+
|
76
|
+
let(:cookbook_tarball_handle) do
|
77
|
+
gz_file_name = File.join(test_root, 'input.gz')
|
78
|
+
Zlib::GzipWriter.open(gz_file_name) do |gz|
|
79
|
+
# Minitar writes the full paths provided and doesn't seem to have a way to
|
80
|
+
# remove prefixes. So we chdir like barbarians.
|
81
|
+
Dir.chdir(cookbook_fixtures_path) do
|
82
|
+
Archive::Tar::Minitar.pack(cookbook_name, gz)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
File.open(gz_file_name)
|
86
|
+
end
|
87
|
+
|
88
|
+
let(:cookbook_files) { %w". .. .gitignore .kitchen.yml Berksfile Berksfile.lock metadata.rb README.md recipes" }
|
89
|
+
|
90
|
+
before do
|
91
|
+
allow(CookbookOmnifetch).to receive(:storage_path).and_return(Pathname.new(storage_path))
|
92
|
+
allow(CookbookOmnifetch).to receive(:cache_path).and_return(cache_path)
|
93
|
+
FileUtils.mkdir_p(storage_path)
|
94
|
+
end
|
95
|
+
|
96
|
+
after do
|
97
|
+
FileUtils.rm_r(test_root)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "installs the cookbook to the desired install path" do
|
101
|
+
expect(public_repo_location).to receive(:http_client).and_return(http_client)
|
102
|
+
expect(cookbook_tarball_handle).to receive(:close).and_call_original
|
103
|
+
expect(http_client).to receive(:streaming_request).with(nil).and_yield(cookbook_tarball_handle)
|
104
|
+
expect(public_repo_location).to receive(:validate_cached!)
|
105
|
+
|
106
|
+
public_repo_location.install
|
107
|
+
|
108
|
+
expect(File).to exist(public_repo_location.cache_path)
|
109
|
+
expect(Dir).to exist(public_repo_location.install_path)
|
110
|
+
expect(Dir.entries(public_repo_location.install_path)).to match_array(cookbook_files)
|
111
|
+
end
|
112
|
+
end
|
59
113
|
end
|
60
114
|
end
|
61
115
|
|
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.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -13,48 +13,48 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2015-03-26 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: minitar
|
20
20
|
requirement: !ruby/object:Gem::Requirement
|
21
21
|
requirements:
|
22
|
-
- - ~>
|
22
|
+
- - "~>"
|
23
23
|
- !ruby/object:Gem::Version
|
24
24
|
version: 0.5.4
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
28
|
requirements:
|
29
|
-
- - ~>
|
29
|
+
- - "~>"
|
30
30
|
- !ruby/object:Gem::Version
|
31
31
|
version: 0.5.4
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: rake
|
34
34
|
requirement: !ruby/object:Gem::Requirement
|
35
35
|
requirements:
|
36
|
-
- - ~>
|
36
|
+
- - "~>"
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: '10.3'
|
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
45
|
version: '10.3'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rspec
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
requirements:
|
50
|
-
- - ~>
|
50
|
+
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '3.0'
|
53
53
|
type: :development
|
54
54
|
prerelease: false
|
55
55
|
version_requirements: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - ~>
|
57
|
+
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '3.0'
|
60
60
|
description:
|
@@ -69,8 +69,8 @@ executables: []
|
|
69
69
|
extensions: []
|
70
70
|
extra_rdoc_files: []
|
71
71
|
files:
|
72
|
-
- .gitignore
|
73
|
-
- .rspec
|
72
|
+
- ".gitignore"
|
73
|
+
- ".rspec"
|
74
74
|
- Gemfile
|
75
75
|
- LICENSE
|
76
76
|
- README.md
|
@@ -110,17 +110,17 @@ require_paths:
|
|
110
110
|
- lib
|
111
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|
112
112
|
requirements:
|
113
|
-
- -
|
113
|
+
- - ">="
|
114
114
|
- !ruby/object:Gem::Version
|
115
115
|
version: '0'
|
116
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
117
|
requirements:
|
118
|
-
- -
|
118
|
+
- - ">="
|
119
119
|
- !ruby/object:Gem::Version
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
122
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
123
|
+
rubygems_version: 2.2.2
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: Library code to fetch Chef cookbooks from a variety of sources to a local
|