cookbook-omnifetch 0.7.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/cookbook-omnifetch.rb +17 -13
- data/lib/cookbook-omnifetch/artifactory.rb +10 -5
- data/lib/cookbook-omnifetch/artifactserver.rb +1 -1
- data/lib/cookbook-omnifetch/base.rb +1 -1
- data/lib/cookbook-omnifetch/chef_server.rb +14 -3
- data/lib/cookbook-omnifetch/chef_server_artifact.rb +15 -4
- data/lib/cookbook-omnifetch/git.rb +3 -3
- data/lib/cookbook-omnifetch/integration.rb +6 -1
- data/lib/cookbook-omnifetch/metadata_based_installer.rb +14 -13
- data/lib/cookbook-omnifetch/path.rb +1 -1
- data/lib/cookbook-omnifetch/threaded_job_queue.rb +1 -1
- data/lib/cookbook-omnifetch/version.rb +1 -1
- metadata +15 -85
- data/.gitignore +0 -23
- data/.rspec +0 -1
- data/.travis.yml +0 -11
- data/Gemfile +0 -8
- data/README.md +0 -90
- data/Rakefile +0 -19
- data/cookbook-omnifetch.gemspec +0 -39
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb +0 -8
- data/spec/fixtures/cookbooks/example_cookbook/.gitignore +0 -2
- data/spec/fixtures/cookbooks/example_cookbook/.kitchen.yml +0 -26
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile +0 -1
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/README.md +0 -12
- data/spec/fixtures/cookbooks/example_cookbook/metadata.rb +0 -3
- data/spec/fixtures/cookbooks/example_cookbook/recipes/default.rb +0 -8
- data/spec/spec_helper.rb +0 -43
- data/spec/unit/artifactory_spec.rb +0 -64
- data/spec/unit/artifactserver_spec.rb +0 -116
- data/spec/unit/base_spec.rb +0 -87
- data/spec/unit/chef_server_artifact_spec.rb +0 -74
- data/spec/unit/chef_server_spec.rb +0 -72
- data/spec/unit/exceptions_spec.rb +0 -87
- data/spec/unit/git_spec.rb +0 -290
- data/spec/unit/metadata_based_installer_spec.rb +0 -137
- data/spec/unit/path_spec.rb +0 -119
data/.gitignore
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
*.bundle
|
19
|
-
*.so
|
20
|
-
*.o
|
21
|
-
*.a
|
22
|
-
mkmf.log
|
23
|
-
.idea/*
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
-c -f documentation
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/README.md
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
# CookbookOmnifetch
|
2
|
-
|
3
|
-
`CookbookOmnifetch` provides library code for fetching Chef cookbooks
|
4
|
-
from an artifact server (usually https://supermarket.chef.io),
|
5
|
-
git/github, a local path, or a chef-server to a local cache for
|
6
|
-
developement.
|
7
|
-
|
8
|
-
## Installation
|
9
|
-
|
10
|
-
Add this line to your application's Gemfile:
|
11
|
-
|
12
|
-
gem 'cookbook-omnifetch'
|
13
|
-
|
14
|
-
And then execute:
|
15
|
-
|
16
|
-
$ bundle
|
17
|
-
|
18
|
-
Or install it yourself as:
|
19
|
-
|
20
|
-
$ gem install cookbook-omnifetch
|
21
|
-
|
22
|
-
## Usage
|
23
|
-
|
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
|
-
```
|
73
|
-
|
74
|
-
## Contributing
|
75
|
-
|
76
|
-
For information on contributing to this project, see https://github.com/chef/chef/blob/master/CONTRIBUTING.md
|
77
|
-
|
78
|
-
After that:
|
79
|
-
|
80
|
-
1. Fork it
|
81
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
82
|
-
3. Commit your changes (`git commit -asm 'Add some feature'`)
|
83
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
84
|
-
5. Create a new Pull Request
|
85
|
-
|
86
|
-
## Thanks
|
87
|
-
|
88
|
-
This code was initially extracted from Berkshelf. Thanks to the
|
89
|
-
Berkshelf core teams and contributors.
|
90
|
-
|
data/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
2
|
-
require "rspec/core/rake_task"
|
3
|
-
|
4
|
-
RSpec::Core::RakeTask.new(:spec)
|
5
|
-
|
6
|
-
task :default => :spec
|
7
|
-
|
8
|
-
desc "Run tests for Travis CI"
|
9
|
-
task ci: [:style, :spec]
|
10
|
-
|
11
|
-
begin
|
12
|
-
require "chefstyle"
|
13
|
-
require "rubocop/rake_task"
|
14
|
-
RuboCop::RakeTask.new(:style) do |task|
|
15
|
-
task.options += ["--display-cop-names", "--no-color"]
|
16
|
-
end
|
17
|
-
rescue LoadError
|
18
|
-
puts "chefstyle/rubocop is not available. gem install chefstyle to do style checking."
|
19
|
-
end
|
data/cookbook-omnifetch.gemspec
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require "cookbook-omnifetch/version"
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "cookbook-omnifetch"
|
8
|
-
spec.version = CookbookOmnifetch::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
"Jamie Winsor",
|
11
|
-
"Josiah Kiehl",
|
12
|
-
"Michael Ivey",
|
13
|
-
"Justin Campbell",
|
14
|
-
"Seth Vargo",
|
15
|
-
"Daniel DeLeo",
|
16
|
-
]
|
17
|
-
spec.email = [
|
18
|
-
"jamie@vialstudios.com",
|
19
|
-
"jkiehl@riotgames.com",
|
20
|
-
"michael.ivey@riotgames.com",
|
21
|
-
"justin@justincampbell.me",
|
22
|
-
"sethvargo@gmail.com",
|
23
|
-
"dan@getchef.com",
|
24
|
-
]
|
25
|
-
spec.summary = %q{Library code to fetch Chef cookbooks from a variety of sources to a local cache}
|
26
|
-
spec.homepage = "http://www.getchef.com/"
|
27
|
-
spec.license = "Apache 2.0"
|
28
|
-
|
29
|
-
spec.files = `git ls-files -z`.split("\x0")
|
30
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
31
|
-
spec.test_files = spec.files.grep(%r{^spec/})
|
32
|
-
spec.require_paths = ["lib"]
|
33
|
-
|
34
|
-
spec.add_dependency "mixlib-archive", "~> 0.4"
|
35
|
-
|
36
|
-
spec.add_development_dependency "rake"
|
37
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
38
|
-
|
39
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
---
|
2
|
-
driver_plugin: vagrant
|
3
|
-
|
4
|
-
platforms:
|
5
|
-
- name: ubuntu-12.04
|
6
|
-
driver_config:
|
7
|
-
box: canonical-ubuntu-12.04
|
8
|
-
box_url: http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box
|
9
|
-
require_chef_omnibus: true
|
10
|
-
- name: ubuntu-10.04
|
11
|
-
driver_config:
|
12
|
-
box: opscode-ubuntu-10.04
|
13
|
-
box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-10.04_chef-11.2.0.box
|
14
|
-
- name: centos-6.3
|
15
|
-
driver_config:
|
16
|
-
box: opscode-centos-6.3
|
17
|
-
box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-6.3_chef-11.2.0.box
|
18
|
-
- name: centos-5.8
|
19
|
-
driver_config:
|
20
|
-
box: opscode-centos-5.8
|
21
|
-
box_url: http://opscode-vm.s3.amazonaws.com/vagrant/opscode_centos-5.8_chef-11.2.0.box
|
22
|
-
|
23
|
-
suites:
|
24
|
-
- name: default
|
25
|
-
run_list: []
|
26
|
-
attributes: {}
|
@@ -1 +0,0 @@
|
|
1
|
-
site :opscode
|
data/spec/spec_helper.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require "cookbook-omnifetch"
|
2
|
-
|
3
|
-
module Fixtures
|
4
|
-
|
5
|
-
def fixtures_path
|
6
|
-
spec_root.join("fixtures")
|
7
|
-
end
|
8
|
-
|
9
|
-
def spec_root
|
10
|
-
Pathname.new(File.expand_path(File.dirname(__FILE__)))
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
module MockShellOut; end
|
16
|
-
module MockCachedCookbook; end
|
17
|
-
|
18
|
-
RSpec.configure do |config|
|
19
|
-
|
20
|
-
config.raise_errors_for_deprecations!
|
21
|
-
|
22
|
-
config.include Fixtures
|
23
|
-
|
24
|
-
config.expect_with :rspec do |c|
|
25
|
-
c.syntax = [:expect]
|
26
|
-
end
|
27
|
-
config.mock_with :rspec do |c|
|
28
|
-
c.syntax = [:expect, :should]
|
29
|
-
end
|
30
|
-
|
31
|
-
config.filter_run :focus => true
|
32
|
-
|
33
|
-
config.run_all_when_everything_filtered = true
|
34
|
-
|
35
|
-
config.before(:suite) do
|
36
|
-
CookbookOmnifetch.configure do |c|
|
37
|
-
c.cache_path = File.expand_path("~/.berkshelf")
|
38
|
-
c.storage_path = Pathname.new(File.expand_path("~/.berkshelf/cookbooks"))
|
39
|
-
c.shell_out_class = MockShellOut
|
40
|
-
c.cached_cookbook_class = MockCachedCookbook
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,64 +0,0 @@
|
|
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
|
@@ -1,116 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "cookbook-omnifetch/artifactserver"
|
3
|
-
require "zlib"
|
4
|
-
require "archive/tar/minitar"
|
5
|
-
|
6
|
-
module CookbookOmnifetch
|
7
|
-
describe ArtifactserverLocation do
|
8
|
-
|
9
|
-
let(:cookbook_name) { "nginx" }
|
10
|
-
|
11
|
-
let(:cookbook_version) { "1.5.23" }
|
12
|
-
|
13
|
-
let(:constraint) { double("Constraint") }
|
14
|
-
|
15
|
-
let(:dependency) { double("Dependency", name: cookbook_name, constraint: constraint) }
|
16
|
-
|
17
|
-
let(:url) { "https://supermarket.getchef.com/api/v1/cookbooks/nginx/versions/1.5.23/download" }
|
18
|
-
|
19
|
-
let(:options) { { artifactserver: url, version: cookbook_version } }
|
20
|
-
|
21
|
-
subject(:public_repo_location) { described_class.new(dependency, options) }
|
22
|
-
|
23
|
-
it "has a URI" do
|
24
|
-
expect(public_repo_location.uri).to eq(url)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "has a repo host" do
|
28
|
-
expect(public_repo_location.repo_host).to eq("supermarket.getchef.com")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "has an exact version" do
|
32
|
-
expect(public_repo_location.cookbook_version).to eq("1.5.23")
|
33
|
-
end
|
34
|
-
|
35
|
-
it "has a cache key containing the site URI and version" do
|
36
|
-
expect(public_repo_location.cache_key).to eq("nginx-1.5.23-supermarket.getchef.com")
|
37
|
-
end
|
38
|
-
|
39
|
-
it "sets the install location as the cache path plus cache key" do
|
40
|
-
expected_install_path = Pathname.new("~/.berkshelf/cookbooks").expand_path.join("nginx-1.5.23-supermarket.getchef.com")
|
41
|
-
expect(public_repo_location.install_path).to eq(expected_install_path)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "considers the cookbook installed if it exists in the main cache" do
|
45
|
-
expect(public_repo_location.install_path).to receive(:exist?).and_return(true)
|
46
|
-
expect(public_repo_location.installed?).to be true
|
47
|
-
end
|
48
|
-
|
49
|
-
it "considers the cookbook not installed if it doesn't exist in the main cache" do
|
50
|
-
expect(public_repo_location.install_path).to receive(:exist?).and_return(false)
|
51
|
-
expect(public_repo_location.installed?).to be false
|
52
|
-
end
|
53
|
-
|
54
|
-
it "provides lock data as a Hash" do
|
55
|
-
expected_data = {
|
56
|
-
"artifactserver" => url,
|
57
|
-
"version" => "1.5.23",
|
58
|
-
}
|
59
|
-
expect(public_repo_location.lock_data).to eq(expected_data)
|
60
|
-
end
|
61
|
-
|
62
|
-
context "when asked to install a new cookbook" do
|
63
|
-
|
64
|
-
let(:http_client) { double("Http Client") }
|
65
|
-
|
66
|
-
let(:test_root) { Dir.mktmpdir(nil) }
|
67
|
-
|
68
|
-
let(:storage_path) { File.join(test_root, "storage") }
|
69
|
-
|
70
|
-
let(:cache_path) { File.join(test_root, "cache") }
|
71
|
-
|
72
|
-
let(:cookbook_fixtures_path) { fixtures_path.join("cookbooks") }
|
73
|
-
|
74
|
-
let(:cookbook_name) { "example_cookbook" }
|
75
|
-
|
76
|
-
let(:cookbook_version) { "0.5.0" }
|
77
|
-
|
78
|
-
let(:cookbook_tarball_handle) do
|
79
|
-
gz_file_name = File.join(test_root, "input.gz")
|
80
|
-
Zlib::GzipWriter.open(gz_file_name) do |gz|
|
81
|
-
# Minitar writes the full paths provided and doesn't seem to have a way to
|
82
|
-
# remove prefixes. So we chdir like barbarians.
|
83
|
-
Dir.chdir(cookbook_fixtures_path) do
|
84
|
-
Archive::Tar::Minitar.pack(cookbook_name, gz)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
File.open(gz_file_name)
|
88
|
-
end
|
89
|
-
|
90
|
-
let(:cookbook_files) { %w{. .. .gitignore .kitchen.yml Berksfile Berksfile.lock metadata.rb README.md recipes} }
|
91
|
-
|
92
|
-
before do
|
93
|
-
allow(CookbookOmnifetch).to receive(:storage_path).and_return(Pathname.new(storage_path))
|
94
|
-
allow(CookbookOmnifetch).to receive(:cache_path).and_return(cache_path)
|
95
|
-
FileUtils.mkdir_p(storage_path)
|
96
|
-
end
|
97
|
-
|
98
|
-
after do
|
99
|
-
FileUtils.rm_r(test_root)
|
100
|
-
end
|
101
|
-
|
102
|
-
it "installs the cookbook to the desired install path" do
|
103
|
-
expect(public_repo_location).to receive(:http_client).and_return(http_client)
|
104
|
-
expect(cookbook_tarball_handle).to receive(:close).and_call_original
|
105
|
-
expect(http_client).to receive(:streaming_request).with(nil).and_yield(cookbook_tarball_handle)
|
106
|
-
expect(public_repo_location).to receive(:validate_cached!)
|
107
|
-
|
108
|
-
public_repo_location.install
|
109
|
-
|
110
|
-
expect(File).to exist(public_repo_location.cache_path)
|
111
|
-
expect(Dir).to exist(public_repo_location.install_path)
|
112
|
-
expect(Dir.entries(public_repo_location.install_path)).to match_array(cookbook_files)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|